@@ -261,6 +261,16 @@ local function _request_uri(self, method, uri, opts, timeout, ignore_auth)
261261end
262262
263263
264+ local function serialize_grpc_value (serialize_fn , val )
265+ local err
266+ val , err = serialize_fn (val )
267+ if not val then
268+ return nil , err
269+ end
270+ return val
271+ end
272+
273+
264274local function serialize_and_encode_base64 (serialize_fn , data )
265275 local err
266276 data , err = serialize_fn (data )
@@ -987,20 +997,34 @@ local function watch(self, key, attr)
987997 return callback_fun
988998end
989999
990- local function convert_grpc_to_http_res (res )
1000+ function _grpc_M . convert_grpc_to_http_res (self , res )
9911001 if res == nil then
9921002 return nil
9931003 end
9941004
995- if res .kvs and # res .kvs == 0 then
996- -- gRPC returns empty kvs while HTTP returns nil
997- res .kvs = nil
1005+ local status = 200
1006+
1007+ if res .kvs then
1008+ if # res .kvs == 0 then
1009+ -- gRPC returns empty kvs while HTTP returns nil
1010+ res .kvs = nil
1011+ else
1012+ for _ , kv in ipairs (res .kvs ) do
1013+ kv .value = self .serializer .deserialize (kv .value )
1014+ end
1015+ end
1016+
1017+ elseif res .deleted then
1018+ -- so fast APISIX only allow to delete a resource
1019+ if res .deleted == 0 then
1020+ status = 404
1021+ end
9981022 end
9991023
10001024 -- We leak the structure of http response in too many places, so here we need to convert
10011025 -- it to http response
10021026 local r = {
1003- status = 200 ,
1027+ status = status ,
10041028 headers = {},
10051029 body = res ,
10061030 }
@@ -1009,18 +1033,9 @@ end
10091033
10101034
10111035function _grpc_M .grpc_call (self , serv , meth , attr , key , val , opts )
1012- if type (val ) ~= " string" then
1013- local err
1014- val , err = encode_json (val )
1015- if not val then
1016- return nil , err
1017- end
1018- -- gRPC doesn't need `serializer`
1019- end
1020-
10211036 local conn = self .conn
10221037 attr .key = key
1023- attr .value = val
1038+ attr .value = serialize_grpc_value ( self . serializer . serialize , val )
10241039
10251040 if opts then
10261041 self .call_opts .timeout = opts .timeout and opts .timeout * 1000
@@ -1031,7 +1046,7 @@ function _grpc_M.grpc_call(self, serv, meth, attr, key, val, opts)
10311046 self .call_opts .int64_encoding = self .grpc .INT64_AS_STRING
10321047
10331048 local res , err = conn :call (serv , meth , attr , self .call_opts )
1034- return convert_grpc_to_http_res (res ), err
1049+ return self : convert_grpc_to_http_res (res ), err
10351050end
10361051
10371052
@@ -1223,6 +1238,13 @@ function _M.txn(self, compare, success, failure, opts)
12231238
12241239 if self .use_grpc then
12251240 rule .key = utils .get_real_key (self .key_prefix , rule .key )
1241+ if rule .value then
1242+ rule .value , err = serialize_grpc_value (self .serializer .serialize ,
1243+ rule .value )
1244+ if not rule .value then
1245+ return nil , " failed to encode value: " .. err
1246+ end
1247+ end
12261248 else
12271249 rule .key = encode_base64 (utils .get_real_key (self .key_prefix , rule .key ))
12281250
@@ -1246,16 +1268,20 @@ function _M.txn(self, compare, success, failure, opts)
12461268 rule = tab_clone (rule )
12471269 if rule .requestPut then
12481270 local requestPut = tab_clone (rule .requestPut )
1271+ local err
12491272 if self .use_grpc then
12501273 requestPut .key = utils .get_real_key (self .key_prefix , requestPut .key )
1274+ requestPut .value , err = serialize_grpc_value (self .serializer .serialize ,
1275+ requestPut .value )
12511276 else
12521277 requestPut .key =
12531278 encode_base64 (utils .get_real_key (self .key_prefix , requestPut .key ))
12541279 requestPut .value , err = serialize_and_encode_base64 (self .serializer .serialize ,
12551280 requestPut .value )
1256- if not requestPut .value then
1257- return nil , " failed to encode value: " .. err
1258- end
1281+ end
1282+
1283+ if not requestPut .value then
1284+ return nil , " failed to encode value: " .. err
12591285 end
12601286
12611287 if self .use_grpc then
0 commit comments