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)