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

[apisix] branch master updated: feat(ext-plugin): handle error response (#4179)

This is an automated email from the ASF dual-hosted git repository.

tokers pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix.git


The following commit(s) were added to refs/heads/master by this push:
     new 50e9bfa  feat(ext-plugin): handle error response (#4179)
50e9bfa is described below

commit 50e9bfa54ed00dc042ffdbe7bdd183bc09b66c2e
Author: 罗泽轩 <sp...@gmail.com>
AuthorDate: Thu May 6 10:00:12 2021 +0800

    feat(ext-plugin): handle error response (#4179)
    
    Signed-off-by: spacewander <sp...@gmail.com>
---
 apisix/plugins/ext-plugin/init.lua | 27 ++++++++++++++++++----
 t/lib/ext-plugin.lua               | 46 ++++++++++++++++++++++++--------------
 t/plugin/ext-plugin/sanity.t       | 18 +++++++++++++++
 3 files changed, 70 insertions(+), 21 deletions(-)

diff --git a/apisix/plugins/ext-plugin/init.lua b/apisix/plugins/ext-plugin/init.lua
index 924e9f4..9dde610 100644
--- a/apisix/plugins/ext-plugin/init.lua
+++ b/apisix/plugins/ext-plugin/init.lua
@@ -19,6 +19,8 @@ local flatbuffers = require("flatbuffers")
 local prepare_conf_req = require("A6.PrepareConf.Req")
 local prepare_conf_resp = require("A6.PrepareConf.Resp")
 local text_entry = require("A6.TextEntry")
+local err_resp = require("A6.Err.Resp")
+local err_code = require("A6.Err.Code")
 local constants = require("apisix.constants")
 local core = require("apisix.core")
 local helper = require("apisix.plugins.ext-plugin.helper")
@@ -117,6 +119,23 @@ end
 _M.send = send
 
 
+local err_to_msg
+do
+    local map = {
+        [err_code.BAD_REQUEST] = "bad request",
+        [err_code.SERVICE_UNAVAILABLE] = "service unavailable",
+        [err_code.CONF_TOKEN_NOT_FOUND] = "conf token not found",
+    }
+
+    function err_to_msg(resp)
+        local buf = flatbuffers.binaryArray.New(resp)
+        local resp = err_resp.GetRootAsResp(buf, 0)
+        local code = resp:Code()
+        return map[code] or str_format("unknown err %d", code)
+    end
+end
+
+
 local function receive(sock)
     local hdr, err = sock:receive(4)
     if not hdr then
@@ -127,10 +146,6 @@ local function receive(sock)
     end
 
     local ty = str_byte(hdr, 1)
-    if ty == constants.RPC_ERROR then
-        return nil, "TODO: handler err"
-    end
-
     local resp
     local hi, mi, li = str_byte(hdr, 2, 4)
     local len = 256 * (256 * hi + mi) + li
@@ -147,6 +162,10 @@ local function receive(sock)
         end
     end
 
+    if ty == constants.RPC_ERROR then
+        return nil, err_to_msg(resp)
+    end
+
     return ty, resp
 end
 _M.receive = receive
diff --git a/t/lib/ext-plugin.lua b/t/lib/ext-plugin.lua
index 9b0a52d..be7f6e5 100644
--- a/t/lib/ext-plugin.lua
+++ b/t/lib/ext-plugin.lua
@@ -17,6 +17,8 @@
 local ext = require("apisix.plugins.ext-plugin.init")
 local constants = require("apisix.constants")
 local flatbuffers = require("flatbuffers")
+local err_code = require("A6.Err.Code")
+local err_resp = require("A6.Err.Resp")
 local prepare_conf_req = require("A6.PrepareConf.Req")
 local prepare_conf_resp = require("A6.PrepareConf.Resp")
 
@@ -35,25 +37,35 @@ function _M.go(case)
     ngx.log(ngx.WARN, "receive rpc call successfully")
 
     if ty == constants.RPC_PREPARE_CONF then
-        local buf = flatbuffers.binaryArray.New(data)
-        local pc = prepare_conf_req.GetRootAsReq(buf, 0)
-
-        if case.with_conf then
-            local conf = pc:Conf(1)
-            assert(conf:Name(), "foo")
-            assert(conf:Value(), "bar")
-            local conf = pc:Conf(2)
-            assert(conf:Name(), "cat")
-            assert(conf:Value(), "dog")
+        if case.inject_error then
+            ty = constants.RPC_ERROR
+            err_resp.Start(builder)
+            err_resp.AddCode(builder, err_code.BAD_REQUEST)
+            local req = prepare_conf_req.End(builder)
+            builder:Finish(req)
+            data = builder:Output()
+
         else
-            assert(pc:ConfLength() == 0)
+            local buf = flatbuffers.binaryArray.New(data)
+            local pc = prepare_conf_req.GetRootAsReq(buf, 0)
+
+            if case.with_conf then
+                local conf = pc:Conf(1)
+                assert(conf:Name(), "foo")
+                assert(conf:Value(), "bar")
+                local conf = pc:Conf(2)
+                assert(conf:Name(), "cat")
+                assert(conf:Value(), "dog")
+            else
+                assert(pc:ConfLength() == 0)
+            end
+
+            prepare_conf_resp.Start(builder)
+            prepare_conf_resp.AddConfToken(builder, 233)
+            local req = prepare_conf_req.End(builder)
+            builder:Finish(req)
+            data = builder:Output()
         end
-
-        prepare_conf_resp.Start(builder)
-        prepare_conf_resp.AddConfToken(builder, 233)
-        local req = prepare_conf_req.End(builder)
-        builder:Finish(req)
-        data = builder:Output()
     end
 
     local ok, err = ext.send(sock, ty, data)
diff --git a/t/plugin/ext-plugin/sanity.t b/t/plugin/ext-plugin/sanity.t
index be275f4..f3646d4 100644
--- a/t/plugin/ext-plugin/sanity.t
+++ b/t/plugin/ext-plugin/sanity.t
@@ -316,3 +316,21 @@ hello world
 qr/get conf token: 233 conf: \[(\{"value":"bar","name":"foo"\}|\{"name":"foo","value":"bar"\}),(\{"value":"dog","name":"cat"\}|\{"name":"cat","value":"dog"\})\]/
 --- no_error_log
 [error]
+
+
+
+=== TEST 11: handle error code
+--- request
+GET /hello
+--- extra_stream_config
+    server {
+        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock;
+
+        content_by_lua_block {
+            local ext = require("lib.ext-plugin")
+            ext.go({inject_error = true})
+        }
+    }
+--- error_code: 503
+--- error_log
+failed to receive RPC_PREPARE_CONF: bad request