@@ -10,11 +10,12 @@ local urilib = require('uri')
10
10
local internal = require (' net.box.lib' )
11
11
local trigger = require (' internal.trigger' )
12
12
13
- local band = bit .band
14
- local max = math.max
15
- local fiber_clock = fiber .clock
16
- local fiber_self = fiber .self
17
- local decode = msgpack .decode_unchecked
13
+ local band = bit .band
14
+ local max = math.max
15
+ local fiber_clock = fiber .clock
16
+ local fiber_self = fiber .self
17
+ local decode = msgpack .decode_unchecked
18
+ local decode_map_header = msgpack .decode_map_header
18
19
19
20
local table_new = require (' table.new' )
20
21
local check_iterator_type = box .internal .check_iterator_type
@@ -483,8 +484,8 @@ local function create_transport(host, port, user, password, callback,
483
484
-- @retval nil, error Error occured.
484
485
-- @retval not nil Future object.
485
486
--
486
- local function perform_async_request (buffer , method , on_push , on_push_ctx ,
487
- ...)
487
+ local function perform_async_request (buffer , skip_header , method , on_push ,
488
+ on_push_ctx , ...)
488
489
if state ~= ' active' and state ~= ' fetch_schema' then
489
490
return nil , box .error .new ({code = last_errno or E_NO_CONNECTION ,
490
491
reason = last_error })
@@ -497,12 +498,13 @@ local function create_transport(host, port, user, password, callback,
497
498
local id = next_request_id
498
499
method_encoder [method ](send_buf , id , ... )
499
500
next_request_id = next_id (id )
500
- -- Request in most cases has maximum 8 members:
501
- -- method, buffer, id, cond, errno, response, on_push ,
502
- -- on_push_ctx.
503
- local request = setmetatable (table_new (0 , 8 ), request_mt )
501
+ -- Request in most cases has maximum 9 members:
502
+ -- method, buffer, skip_header, id, cond, errno, response,
503
+ -- on_push, on_push_ctx.
504
+ local request = setmetatable (table_new (0 , 9 ), request_mt )
504
505
request .method = method
505
506
request .buffer = buffer
507
+ request .skip_header = skip_header
506
508
request .id = id
507
509
request .cond = fiber .cond ()
508
510
requests [id ] = request
@@ -516,10 +518,11 @@ local function create_transport(host, port, user, password, callback,
516
518
-- @retval nil, error Error occured.
517
519
-- @retval not nil Response object.
518
520
--
519
- local function perform_request (timeout , buffer , method , on_push ,
520
- on_push_ctx , ...)
521
+ local function perform_request (timeout , buffer , skip_header , method ,
522
+ on_push , on_push_ctx , ...)
521
523
local request , err =
522
- perform_async_request (buffer , method , on_push , on_push_ctx , ... )
524
+ perform_async_request (buffer , skip_header , method , on_push ,
525
+ on_push_ctx , ... )
523
526
if not request then
524
527
return nil , err
525
528
end
@@ -551,6 +554,15 @@ local function create_transport(host, port, user, password, callback,
551
554
if buffer ~= nil then
552
555
-- Copy xrow.body to user-provided buffer
553
556
local body_len = body_end - body_rpos
557
+ if request .skip_header then
558
+ -- Skip {[IPROTO_DATA_KEY] = ...} wrapper.
559
+ local map_len , key
560
+ map_len , body_rpos = decode_map_header (body_rpos , body_len )
561
+ assert (map_len == 1 )
562
+ key , body_rpos = decode (body_rpos )
563
+ assert (key == IPROTO_DATA_KEY )
564
+ body_len = body_end - body_rpos
565
+ end
554
566
local wpos = buffer :alloc (body_len )
555
567
ffi .copy (wpos , body_rpos , body_len )
556
568
body_len = tonumber (body_len )
@@ -1047,18 +1059,19 @@ end
1047
1059
1048
1060
function remote_methods :_request (method , opts , ...)
1049
1061
local transport = self ._transport
1050
- local on_push , on_push_ctx , buffer , deadline
1062
+ local on_push , on_push_ctx , buffer , skip_header , deadline
1051
1063
-- Extract options, set defaults, check if the request is
1052
1064
-- async.
1053
1065
if opts then
1054
1066
buffer = opts .buffer
1067
+ skip_header = opts .skip_header
1055
1068
if opts .is_async then
1056
1069
if opts .on_push or opts .on_push_ctx then
1057
1070
error (' To handle pushes in an async request use future:pairs()' )
1058
1071
end
1059
1072
local res , err =
1060
- transport .perform_async_request (buffer , method , table.insert ,
1061
- {}, ... )
1073
+ transport .perform_async_request (buffer , skip_header , method ,
1074
+ table.insert , {}, ... )
1062
1075
if err then
1063
1076
box .error (err )
1064
1077
end
@@ -1084,8 +1097,9 @@ function remote_methods:_request(method, opts, ...)
1084
1097
transport .wait_state (' active' , timeout )
1085
1098
timeout = deadline and max (0 , deadline - fiber_clock ())
1086
1099
end
1087
- local res , err = transport .perform_request (timeout , buffer , method ,
1088
- on_push , on_push_ctx , ... )
1100
+ local res , err = transport .perform_request (timeout , buffer , skip_header ,
1101
+ method , on_push , on_push_ctx ,
1102
+ ... )
1089
1103
if err then
1090
1104
box .error (err )
1091
1105
end
@@ -1288,10 +1302,10 @@ function console_methods:eval(line, timeout)
1288
1302
end
1289
1303
if self .protocol == ' Binary' then
1290
1304
local loader = ' return require("console").eval(...)'
1291
- res , err = pr (timeout , nil , ' eval' , nil , nil , loader , {line })
1305
+ res , err = pr (timeout , nil , false , ' eval' , nil , nil , loader , {line })
1292
1306
else
1293
1307
assert (self .protocol == ' Lua console' )
1294
- res , err = pr (timeout , nil , ' inject' , nil , nil , line .. ' $EOF$\n ' )
1308
+ res , err = pr (timeout , nil , false , ' inject' , nil , nil , line .. ' $EOF$\n ' )
1295
1309
end
1296
1310
if err then
1297
1311
box .error (err )
0 commit comments