1
1
from __future__ import absolute_import
2
2
3
- from .base import BaseMessage
3
+ from .call_request_continue import CallRequestContinueMessage
4
4
from .types import Types
5
5
from .. import rw
6
- from . import common
6
+ from . import common , ChecksumType
7
7
8
8
9
- class CallRequestMessage (BaseMessage ):
9
+ class CallRequestMessage (CallRequestContinueMessage ):
10
10
"""Initiate an RPC call."""
11
11
message_type = Types .CALL_REQ
12
12
13
13
__slots__ = (
14
- 'flags' ,
15
14
'ttl' ,
16
15
'tracing' ,
17
-
18
16
'service' ,
19
17
'headers' ,
20
-
21
- 'checksum' ,
22
-
23
- 'arg_1' ,
24
- 'arg_2' ,
25
- 'arg_3' ,
26
18
)
27
19
28
20
def __init__ (
@@ -33,42 +25,65 @@ def __init__(
33
25
service = None ,
34
26
headers = None ,
35
27
checksum = None ,
36
- arg_1 = None ,
37
- arg_2 = None ,
38
- arg_3 = None ,
28
+ args = None ,
39
29
):
40
- self . flags = flags
30
+ super ( CallRequestMessage , self ). __init__ ( flags , checksum , args )
41
31
self .ttl = ttl
42
32
self .tracing = tracing or common .Tracing (0 , 0 , 0 , 0 )
43
33
self .service = service or ''
44
34
self .headers = dict (headers ) if headers else {}
45
- if checksum is not None :
46
- checksum = common .ChecksumType .standardize (checksum )
47
- self .checksum = checksum or \
48
- (common .ChecksumType .none , None )
49
35
50
- self .arg_1 = arg_1 or ''
51
- self .arg_2 = arg_2 or ''
52
- self .arg_3 = arg_3 or ''
36
+ def encode (self ):
37
+ super (CallRequestMessage , self ).encode ()
38
+ self .service = self .service .encode (common .ENCODE_TYPE )
39
+ self .headers = dict (map (
40
+ lambda (k , v ): self .encode_pair (k , v ),
41
+ self .headers .iteritems ()))
42
+
43
+ def decode (self ):
44
+ super (CallRequestMessage , self ).decode ()
45
+ self .service = self .service .decode (common .DECODE_TYPE )
46
+ self .headers = dict (map (
47
+ lambda (k , v ): self .decode_pair (k , v ),
48
+ self .headers .iteritems ()))
49
+
50
+ def get_meta_size (self ):
51
+ size = 0
52
+ size += 1 # flags: 1
53
+ size += 4 # ttl: 4
54
+ size += 25 # tracing: 24 | traceflags: 1
55
+ size += 1 # service~1
56
+ size += len (self .service )
57
+ size += 1 # nh: 1
58
+ for k , v in self .headers :
59
+ size += 1 # hk~1
60
+ size += len (k )
61
+ size += 1 # hv~1
62
+ size += len (v )
63
+
64
+ size += 1 # csumtype: 1
65
+ size += 1 if self .checksum [0 ] != ChecksumType .none else 0
66
+ return size
53
67
68
+ def get_size (self ):
69
+ size = self .get_meta_size ()
70
+
71
+ for arg in self .args :
72
+ size += 2
73
+ size += len (arg )
74
+ return size
54
75
55
76
call_req_rw = rw .instance (
56
77
CallRequestMessage ,
57
78
("flags" , rw .number (1 )), # flags:1
58
79
("ttl" , rw .number (4 )), # ttl:4
59
-
60
80
("tracing" , common .tracing_rw ), # tracing:24
61
81
# traceflags: 1
62
-
63
82
("service" , rw .len_prefixed_string (rw .number (1 ))), # service~1
64
83
("headers" , rw .headers ( # nh:1 (hk~1 hv~1){nh}
65
84
rw .number (1 ),
66
85
rw .len_prefixed_string (rw .number (1 ))
67
86
)),
68
-
69
87
("checksum" , common .checksum_rw ), # csumtype:1 (csum:4){0, 1}
70
-
71
- ("arg_1" , rw .len_prefixed_string (rw .number (2 ), is_binary = True )), # arg1~2
72
- ("arg_2" , rw .len_prefixed_string (rw .number (2 ), is_binary = True )), # arg2~2
73
- ("arg_3" , rw .len_prefixed_string (rw .number (2 ), is_binary = True )), # arg3~2
88
+ ("args" , rw .args (rw .number (2 ))), # [arg1~2, arg2~2, arg3~2]
74
89
)
0 commit comments