You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by so...@apache.org on 2022/09/27 03:52:04 UTC
[apisix-go-plugin-runner] branch master updated: fix: set the correct rpc response type when meet an error (#102)
This is an automated email from the ASF dual-hosted git repository.
soulbird pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix-go-plugin-runner.git
The following commit(s) were added to refs/heads/master by this push:
new a3a31cd fix: set the correct rpc response type when meet an error (#102)
a3a31cd is described below
commit a3a31cd4fb8bdc0cbb5828b6a6a3a2bf80621c62
Author: 刘奕聪 <im...@gmail.com>
AuthorDate: Tue Sep 27 11:51:59 2022 +0800
fix: set the correct rpc response type when meet an error (#102)
Co-authored-by: yakovliu <ya...@tencent.com>
---
internal/server/server.go | 39 +++++++++++++++++++++++----------------
internal/server/server_test.go | 19 ++++++++++++++++++-
2 files changed, 41 insertions(+), 17 deletions(-)
diff --git a/internal/server/server.go b/internal/server/server.go
index c28ddf4..5ac291f 100644
--- a/internal/server/server.go
+++ b/internal/server/server.go
@@ -73,33 +73,40 @@ func recoverPanic() {
}
}
-func dispatchRPC(ty byte, in []byte, conn net.Conn) *flatbuffers.Builder {
+func dispatchRPC(ty byte, in []byte, conn net.Conn) (*flatbuffers.Builder, byte) {
var err error
var bd *flatbuffers.Builder
hl, ok := typeHandlerMap[ty]
if !ok {
- err = UnknownType{ty}
- } else {
- bd, err = hl(in, conn)
+ log.Warnf("unknown rpc type: %d", ty)
+ return generateErrorReport(UnknownType{ty}), util.RPCError
}
+ bd, err = hl(in, conn)
if err != nil {
- bd = generateErrorReport(err)
- } else {
- bd = checkIfDataTooLarge(bd)
+ return generateErrorReport(err), util.RPCError
+ }
+
+ replaced, ok := checkIfDataTooLarge(bd)
+ if !ok {
+ return replaced, util.RPCError
}
- return bd
+
+ return bd, ty
}
-func checkIfDataTooLarge(bd *flatbuffers.Builder) *flatbuffers.Builder {
+func checkIfDataTooLarge(bd *flatbuffers.Builder) (*flatbuffers.Builder, bool) {
out := bd.FinishedBytes()
size := len(out)
- if size > util.MaxDataSize {
- err := fmt.Errorf("the max length of data is %d but got %d", util.MaxDataSize, size)
- util.PutBuilder(bd)
- bd = generateErrorReport(err)
+ if size < util.MaxDataSize {
+ return bd, true
}
- return bd
+
+ err := fmt.Errorf("the max length of data is %d but got %d", util.MaxDataSize, size)
+ util.PutBuilder(bd)
+ bd = generateErrorReport(err)
+
+ return bd, false
}
func handleConn(c net.Conn) {
@@ -129,11 +136,11 @@ func handleConn(c net.Conn) {
break
}
- bd := dispatchRPC(ty, buf, c)
+ bd, respTy := dispatchRPC(ty, buf, c)
out := bd.FinishedBytes()
size := len(out)
binary.BigEndian.PutUint32(header, uint32(size))
- header[0] = ty
+ header[0] = respTy
n, err = c.Write(header)
if err != nil {
diff --git a/internal/server/server_test.go b/internal/server/server_test.go
index c698cb7..b854973 100644
--- a/internal/server/server_test.go
+++ b/internal/server/server_test.go
@@ -29,6 +29,7 @@ import (
hrc "github.com/api7/ext-plugin-proto/go/A6/HTTPReqCall"
"github.com/stretchr/testify/assert"
+ "github.com/apache/apisix-go-plugin-runner/internal/plugin"
"github.com/apache/apisix-go-plugin-runner/internal/util"
)
@@ -52,10 +53,22 @@ func TestGetConfCacheTTL(t *testing.T) {
}
func TestDispatchRPC_UnknownType(t *testing.T) {
- bd := dispatchRPC(126, []byte(""), nil)
+ bd, ty := dispatchRPC(126, []byte(""), nil)
err := UnknownType{126}
expectBd := ReportError(err)
assert.Equal(t, expectBd.FinishedBytes(), bd.FinishedBytes())
+ assert.Equal(t, ty, byte(util.RPCError))
+}
+
+func TestDispatchRPC_KnownType(t *testing.T) {
+ bd := util.GetBuilder()
+ hrc.ReqStart(bd)
+ hrc.ReqAddConfToken(bd, 1)
+ r := hrc.ReqEnd(bd)
+ bd.Finish(r)
+
+ _, ty := dispatchRPC(util.RPCHTTPReqCall, bd.FinishedBytes(), nil)
+ assert.Equal(t, ty, byte(util.RPCError))
}
func TestDispatchRPC_OutTooLarge(t *testing.T) {
@@ -117,3 +130,7 @@ func TestRun(t *testing.T) {
_, err = os.Stat(path)
assert.True(t, os.IsNotExist(err))
}
+
+func init() {
+ plugin.InitConfCache(time.Second)
+}