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)

Reply via email to