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 03e11816458774f8e77517cfccbe5ddded08e5b0 Author: spacewander <[email protected]> AuthorDate: Fri May 21 10:50:02 2021 +0800 feat: handle CodeBAD_REQUEST in error protocol --- internal/server/error.go | 17 ++++++++++++++++- internal/server/error_test.go | 7 +++++++ internal/server/server.go | 5 +++-- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/internal/server/error.go b/internal/server/error.go index 81d77c3..75ff24c 100644 --- a/internal/server/error.go +++ b/internal/server/error.go @@ -15,6 +15,8 @@ package server import ( + "fmt" + "github.com/ReneKroon/ttlcache/v2" A6Err "github.com/api7/ext-plugin-proto/go/A6/Err" flatbuffers "github.com/google/flatbuffers/go" @@ -22,6 +24,14 @@ import ( "github.com/apache/apisix-go-plugin-runner/internal/util" ) +type UnknownType struct { + ty byte +} + +func (err UnknownType) Error() string { + return fmt.Sprintf("unknown type %d", err.ty) +} + func ReportError(err error) *flatbuffers.Builder { builder := util.GetBuilder() A6Err.RespStart(builder) @@ -31,7 +41,12 @@ func ReportError(err error) *flatbuffers.Builder { case ttlcache.ErrNotFound: code = A6Err.CodeCONF_TOKEN_NOT_FOUND default: - code = A6Err.CodeSERVICE_UNAVAILABLE + switch err.(type) { + case UnknownType: + code = A6Err.CodeBAD_REQUEST + default: + code = A6Err.CodeSERVICE_UNAVAILABLE + } } A6Err.RespAddCode(builder, code) diff --git a/internal/server/error_test.go b/internal/server/error_test.go index fb5b426..db9133e 100644 --- a/internal/server/error_test.go +++ b/internal/server/error_test.go @@ -34,6 +34,13 @@ func TestReportErrorCacheToken(t *testing.T) { assert.Equal(t, A6Err.CodeCONF_TOKEN_NOT_FOUND, resp.Code()) } +func TestReportErrorUnknownType(t *testing.T) { + b := ReportError(UnknownType{23}) + out := b.FinishedBytes() + resp := A6Err.GetRootAsResp(out, 0) + assert.Equal(t, A6Err.CodeBAD_REQUEST, resp.Code()) +} + func TestReportErrorUnknownErr(t *testing.T) { b := ReportError(io.EOF) out := b.FinishedBytes() diff --git a/internal/server/server.go b/internal/server/server.go index 88f2a17..a856066 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -103,17 +103,18 @@ func handleConn(c net.Conn) { case RPCHTTPReqCall: bd, err = http.HTTPReqCall(buf) default: - err = fmt.Errorf("unknown type %d", ty) + err = UnknownType{ty} } out := bd.FinishedBytes() size := len(out) if size > MaxDataSize { err = fmt.Errorf("the max length of data is %d but got %d", MaxDataSize, size) - log.Errorf("%s", err) } if err != nil { + log.Errorf("%s", err) + ty = RPCError util.PutBuilder(bd) bd = ReportError(err)
