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.git
The following commit(s) were added to refs/heads/master by this push:
new 4e726da fix(grpc-transcode): support converting nested message (#4859)
4e726da is described below
commit 4e726da34d77bcfd024701408e224626fbaafcad
Author: 罗泽轩 <[email protected]>
AuthorDate: Sat Aug 21 11:52:31 2021 +0800
fix(grpc-transcode): support converting nested message (#4859)
Signed-off-by: spacewander <[email protected]>
---
apisix/plugins/grpc-transcode/util.lua | 21 ++++--
ci/common.sh | 2 +-
t/plugin/grpc-transcode2.t | 130 +++++++++++++++++++++++++++++++++
3 files changed, 146 insertions(+), 7 deletions(-)
diff --git a/apisix/plugins/grpc-transcode/util.lua
b/apisix/plugins/grpc-transcode/util.lua
index faffecc..102e50d 100644
--- a/apisix/plugins/grpc-transcode/util.lua
+++ b/apisix/plugins/grpc-transcode/util.lua
@@ -91,25 +91,34 @@ local function get_from_request(request_table, name, kind)
end
-function _M.map_message(field, default_values)
+function _M.map_message(field, default_values, request_table)
if not pb.type(field) then
return nil, "Field " .. field .. " is not defined"
end
local request = {}
local sub, err
- local request_table = get_request_table()
+ if not request_table then
+ request_table = get_request_table()
+ end
+
for name, _, field_type in pb.fields(field) do
local _, _, ty = pb.type(field_type)
if ty ~= "enum" and field_type:sub(1, 1) == "." then
- sub, err = _M.map_message(field_type, default_values)
- if err then
- return nil, err
+ if request_table[name] == nil then
+ sub = default_values and default_values[name]
+ else
+ sub, err = _M.map_message(field_type, default_values and
default_values[name],
+ request_table[name])
+ if err then
+ return nil, err
+ end
end
+
request[name] = sub
else
request[name] = get_from_request(request_table, name, field_type)
- or default_values[name] or nil
+ or (default_values and default_values[name])
end
end
return request
diff --git a/ci/common.sh b/ci/common.sh
index 56f2d33..bf06c49 100644
--- a/ci/common.sh
+++ b/ci/common.sh
@@ -31,4 +31,4 @@ create_lua_deps() {
# luarocks install luacov-coveralls --tree=deps --local > build.log 2>&1
|| (cat build.log && exit 1)
}
-GRPC_SERVER_EXAMPLE_VER=20210730
+GRPC_SERVER_EXAMPLE_VER=20210819
diff --git a/t/plugin/grpc-transcode2.t b/t/plugin/grpc-transcode2.t
new file mode 100644
index 0000000..0e7fd2b
--- /dev/null
+++ b/t/plugin/grpc-transcode2.t
@@ -0,0 +1,130 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+use t::APISIX 'no_plan';
+
+no_long_string();
+no_shuffle();
+no_root_location();
+
+add_block_preprocessor(sub {
+ my ($block) = @_;
+
+ if (!$block->request) {
+ $block->set_value("request", "GET /t");
+ }
+
+ if ((!defined $block->error_log) && (!defined $block->no_error_log)) {
+ $block->set_value("no_error_log", "[error]");
+ }
+});
+
+run_tests;
+
+__DATA__
+
+=== TEST 1: set rule
+--- config
+ location /t {
+ content_by_lua_block {
+ local t = require("lib.test_admin").test
+ local etcd = require("apisix.core.etcd")
+ local code, body = t('/apisix/admin/proto/1',
+ ngx.HTTP_PUT,
+ [[{
+ "content" : "syntax = \"proto3\";
+ package helloworld;
+ service Greeter {
+ rpc SayHello (HelloRequest) returns (HelloReply) {}
+ }
+ enum Gender {
+ GENDER_UNKNOWN = 0;
+ GENDER_MALE = 1;
+ GENDER_FEMALE = 2;
+ }
+ message Person {
+ string name = 1;
+ int32 age = 2;
+ }
+ message HelloRequest {
+ string name = 1;
+ repeated string items = 2;
+ Gender gender = 3;
+ Person person = 4;
+ }
+ message HelloReply {
+ string message = 1;
+ }"
+ }]]
+ )
+
+ if code >= 300 then
+ ngx.status = code
+ ngx.say(body)
+ return
+ end
+
+ local code, body = t('/apisix/admin/routes/1',
+ ngx.HTTP_PUT,
+ [[{
+ "uri": "/grpctest",
+ "plugins": {
+ "grpc-transcode": {
+ "proto_id": "1",
+ "service": "helloworld.Greeter",
+ "method": "SayHello"
+ }
+ },
+ "upstream": {
+ "scheme": "grpc",
+ "type": "roundrobin",
+ "nodes": {
+ "127.0.0.1:50051": 1
+ }
+ }
+ }]]
+ )
+
+ if code >= 300 then
+ ngx.status = code
+ end
+ ngx.say(body)
+ }
+ }
+--- response_body
+passed
+
+
+
+=== TEST 2: hit route
+--- request
+POST /grpctest
+{"name":"world","person":{"name":"Joe","age":1}}
+--- more_headers
+Content-Type: application/json
+--- response_body chomp
+{"message":"Hello world, name: Joe, age: 1"}
+
+
+
+=== TEST 3: hit route, missing some fields
+--- request
+POST /grpctest
+{"name":"world","person":{"name":"Joe"}}
+--- more_headers
+Content-Type: application/json
+--- response_body chomp
+{"message":"Hello world, name: Joe"}