This is an automated email from the ASF dual-hosted git repository. spacewander pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/apisix-go-plugin-runner.git
commit c0d186030e6757c328589d17f523572194e45a09 Author: spacewander <[email protected]> AuthorDate: Mon May 24 08:50:52 2021 +0800 feat: add basic structure for HTTPReqCall --- internal/http/{http.go => request.go} | 23 +++++++++------ internal/http/{http.go => response.go} | 29 +++++++++++-------- internal/plugin/conf.go | 4 +++ internal/{http/http.go => plugin/plugin.go} | 36 ++++++++++++++++++++---- internal/{http/http.go => plugin/plugin_test.go} | 31 ++++++++++++++------ internal/server/server.go | 3 +- {internal => pkg}/http/http.go | 23 +++++++-------- 7 files changed, 100 insertions(+), 49 deletions(-) diff --git a/internal/http/http.go b/internal/http/request.go similarity index 74% copy from internal/http/http.go copy to internal/http/request.go index d946102..4c96aa2 100644 --- a/internal/http/http.go +++ b/internal/http/request.go @@ -15,16 +15,21 @@ package http import ( - flatbuffers "github.com/google/flatbuffers/go" - - "github.com/apache/apisix-go-plugin-runner/internal/util" hrc "github.com/api7/ext-plugin-proto/go/A6/HTTPReqCall" ) -func HTTPReqCall(buf []byte) (*flatbuffers.Builder, error) { - builder := util.GetBuilder() - hrc.RespStart(builder) - resp := hrc.RespEnd(builder) - builder.Finish(resp) - return builder, nil +type Request struct { + // the root of the flatbuffers HTTPReqCall Request msg + r *hrc.Req +} + +func (r Request) ConfToken() uint32 { + return r.r.ConfToken() +} + +func CreateRequest(buf []byte) *Request { + req := &Request{ + r: hrc.GetRootAsReq(buf, 0), + } + return req } diff --git a/internal/http/http.go b/internal/http/response.go similarity index 69% copy from internal/http/http.go copy to internal/http/response.go index d946102..46fbeeb 100644 --- a/internal/http/http.go +++ b/internal/http/response.go @@ -14,17 +14,24 @@ // limitations under the License. package http -import ( - flatbuffers "github.com/google/flatbuffers/go" +import "net/http" - "github.com/apache/apisix-go-plugin-runner/internal/util" - hrc "github.com/api7/ext-plugin-proto/go/A6/HTTPReqCall" -) +type Response struct { + code int +} + +func (r Response) Header() http.Header { + return nil +} + +func (r Response) Write([]byte) (int, error) { + return 0, nil +} + +func (r Response) WriteHeader(statusCode int) { + r.code = statusCode +} -func HTTPReqCall(buf []byte) (*flatbuffers.Builder, error) { - builder := util.GetBuilder() - hrc.RespStart(builder) - resp := hrc.RespEnd(builder) - builder.Finish(resp) - return builder, nil +func CreateResponse() *Response { + return &Response{} } diff --git a/internal/plugin/conf.go b/internal/plugin/conf.go index 8e18ecc..3b3a8bb 100644 --- a/internal/plugin/conf.go +++ b/internal/plugin/conf.go @@ -81,3 +81,7 @@ func GetRuleConf(token uint32) (RuleConf, error) { } return res.(RuleConf), err } + +func SetRuleConf(token uint32, conf RuleConf) error { + return cache.Set(strconv.FormatInt(int64(token), 10), conf) +} diff --git a/internal/http/http.go b/internal/plugin/plugin.go similarity index 62% copy from internal/http/http.go copy to internal/plugin/plugin.go index d946102..ba07c8a 100644 --- a/internal/http/http.go +++ b/internal/plugin/plugin.go @@ -12,19 +12,45 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -package http +package plugin import ( + "net/http" + + hrc "github.com/api7/ext-plugin-proto/go/A6/HTTPReqCall" flatbuffers "github.com/google/flatbuffers/go" + inHTTP "github.com/apache/apisix-go-plugin-runner/internal/http" "github.com/apache/apisix-go-plugin-runner/internal/util" - hrc "github.com/api7/ext-plugin-proto/go/A6/HTTPReqCall" + pkgHTTP "github.com/apache/apisix-go-plugin-runner/pkg/http" ) -func HTTPReqCall(buf []byte) (*flatbuffers.Builder, error) { +func handle(conf RuleConf, w http.ResponseWriter, r pkgHTTP.Request) error { + return nil +} + +func reportAction(req *inHTTP.Request, resp *inHTTP.Response) *flatbuffers.Builder { builder := util.GetBuilder() hrc.RespStart(builder) - resp := hrc.RespEnd(builder) - builder.Finish(resp) + res := hrc.RespEnd(builder) + builder.Finish(res) + return builder +} + +func HTTPReqCall(buf []byte) (*flatbuffers.Builder, error) { + req := inHTTP.CreateRequest(buf) + resp := inHTTP.CreateResponse() + + token := req.ConfToken() + conf, err := GetRuleConf(token) + if err != nil { + return nil, err + } + err = handle(conf, resp, req) + if err != nil { + return nil, err + } + + builder := reportAction(req, resp) return builder, nil } diff --git a/internal/http/http.go b/internal/plugin/plugin_test.go similarity index 64% copy from internal/http/http.go copy to internal/plugin/plugin_test.go index d946102..5433cca 100644 --- a/internal/http/http.go +++ b/internal/plugin/plugin_test.go @@ -12,19 +12,32 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -package http +package plugin import ( - flatbuffers "github.com/google/flatbuffers/go" + "testing" + "time" - "github.com/apache/apisix-go-plugin-runner/internal/util" hrc "github.com/api7/ext-plugin-proto/go/A6/HTTPReqCall" + flatbuffers "github.com/google/flatbuffers/go" + "github.com/stretchr/testify/assert" ) -func HTTPReqCall(buf []byte) (*flatbuffers.Builder, error) { - builder := util.GetBuilder() - hrc.RespStart(builder) - resp := hrc.RespEnd(builder) - builder.Finish(resp) - return builder, nil +func TestHTTPReqCall(t *testing.T) { + InitConfCache(10 * time.Millisecond) + SetRuleConf(1, RuleConf{}) + + builder := flatbuffers.NewBuilder(1024) + hrc.ReqStart(builder) + hrc.ReqAddConfToken(builder, 1) + r := hrc.ReqEnd(builder) + builder.Finish(r) + out := builder.FinishedBytes() + + b, err := HTTPReqCall(out) + assert.Nil(t, err) + + out = b.FinishedBytes() + resp := hrc.GetRootAsResp(out, 0) + assert.Equal(t, hrc.ActionNONE, resp.ActionType()) } diff --git a/internal/server/server.go b/internal/server/server.go index a856066..7299252 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -27,7 +27,6 @@ import ( "syscall" "time" - "github.com/apache/apisix-go-plugin-runner/internal/http" "github.com/apache/apisix-go-plugin-runner/internal/log" "github.com/apache/apisix-go-plugin-runner/internal/plugin" "github.com/apache/apisix-go-plugin-runner/internal/util" @@ -101,7 +100,7 @@ func handleConn(c net.Conn) { case RPCPrepareConf: bd, err = plugin.PrepareConf(buf) case RPCHTTPReqCall: - bd, err = http.HTTPReqCall(buf) + bd, err = plugin.HTTPReqCall(buf) default: err = UnknownType{ty} } diff --git a/internal/http/http.go b/pkg/http/http.go similarity index 57% rename from internal/http/http.go rename to pkg/http/http.go index d946102..54edde1 100644 --- a/internal/http/http.go +++ b/pkg/http/http.go @@ -14,17 +14,14 @@ // limitations under the License. package http -import ( - flatbuffers "github.com/google/flatbuffers/go" - - "github.com/apache/apisix-go-plugin-runner/internal/util" - hrc "github.com/api7/ext-plugin-proto/go/A6/HTTPReqCall" -) - -func HTTPReqCall(buf []byte) (*flatbuffers.Builder, error) { - builder := util.GetBuilder() - hrc.RespStart(builder) - resp := hrc.RespEnd(builder) - builder.Finish(resp) - return builder, nil +// Request represents the HTTP request received by APISIX. +// We don't use net/http's Request because it doesn't suit our purpose. +// Take `Request.Header` as an example: +// +// 1. We need to record any change to the request headers. As the Request.Header +// is not an interface, there is not way to inject our special tracker. +// 2. As the author of fasthttp pointed out, "headers are stored in a map[string][]string. +// So the server must parse all the headers, ...". The official API is suboptimal, which +// is even worse in our case as it is not a real HTTP server. +type Request interface { }
