You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by sp...@apache.org on 2021/05/31 02:07:18 UTC

[apisix-go-plugin-runner] 11/22: feat: handle CodeBAD_REQUEST in error protocol

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 <sp...@gmail.com>
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)