@@ -68,50 +68,48 @@ class RpcDecoder {
6868 int resp_type;
6969 uint32_t resp_id;
7070
71- if (!unpacker.deserialize (resp_size, resp_type, resp_id)) {
71+ if (!unpacker.deserialize (resp_size, resp_type, resp_id)) return false ;
72+
73+ // ReSharper disable once CppDFAUnreachableCode
74+ if (resp_id != msg_id) return false ;
75+
76+ // msg_id OK packet will be consumed.
77+ if (resp_type != RESP_MSG) {
78+ // This should never happen
7279 error.code = PARSING_ERR;
73- error.traceback = " Non parsable RPC response headers (check type) " ;
80+ error.traceback = " Unexpected response type" ;
7481 discard ();
75- return false ;
82+ return true ;
7683 }
84+
7785 if (resp_size.size () != RESPONSE_SIZE) {
78- error.code = PARSING_ERR;
79- error.traceback = " Wrong RPC response size" ;
80- discard ();
81- return false ;
82- }
83- if (resp_type != RESP_MSG) {
8486 // This should never happen
85- error.code = GENERIC_ERR ;
86- error.traceback = " Unexpected response type " ;
87+ error.code = PARSING_ERR ;
88+ error.traceback = " Unexpected RPC response size " ;
8789 discard ();
88- return false ;
90+ return true ;
8991 }
9092
91- // DO NOT MODIFY THIS if resp_id is not what is expected then the RPC response belongs to s/o else
92- if (resp_id != msg_id) return false ;
93-
9493 MsgPack::object::nil_t nil;
9594 if (unpacker.unpackable (nil)){ // No error
9695 if (!unpacker.deserialize (nil, result)) {
9796 error.code = PARSING_ERR;
9897 error.traceback = " Result not parsable (check type)" ;
9998 discard ();
100- return false ;
99+ return true ;
101100 }
102101 } else { // RPC returned an error
103102 if (!unpacker.deserialize (error, nil)) {
104103 error.code = PARSING_ERR;
105104 error.traceback = " RPC Error not parsable (check type)" ;
106105 discard ();
107- return false ;
106+ return true ;
108107 }
109108 }
110109
111110 consume (_packet_size);
112111 reset_packet ();
113112 return true ;
114-
115113 }
116114
117115 bool send_response (const MsgPack::Packer& packer) const {
@@ -143,6 +141,7 @@ class RpcDecoder {
143141 return " " ; // Header not unpackable
144142 }
145143
144+ // ReSharper disable once CppDFAUnreachableCode
146145 if (msg_type == CALL_MSG && req_size.size () == REQUEST_SIZE) {
147146 uint32_t msg_id;
148147 if (!unpacker.deserialize (msg_id, method)) {
@@ -205,11 +204,13 @@ class RpcDecoder {
205204
206205 if (type != CALL_MSG && type != RESP_MSG && type != NOTIFY_MSG) {
207206 consume (bytes_checked);
207+ _discarded_packets++;
208208 break ; // Not a valid RPC type (could be type=WRONG_MSG)
209209 }
210210
211211 if ((type == CALL_MSG && container_size != REQUEST_SIZE) || (type == RESP_MSG && container_size != RESPONSE_SIZE) || (type == NOTIFY_MSG && container_size != NOTIFY_SIZE)) {
212212 consume (bytes_checked);
213+ _discarded_packets++;
213214 break ; // Not a valid RPC format
214215 }
215216
@@ -232,6 +233,8 @@ class RpcDecoder {
232233
233234 size_t size () const {return _bytes_stored;}
234235
236+ uint32_t get_discarded_packets () const {return _discarded_packets;}
237+
235238 friend class DecoderTester ;
236239
237240private:
@@ -241,6 +244,7 @@ class RpcDecoder {
241244 int _packet_type = NO_MSG;
242245 size_t _packet_size = 0 ;
243246 uint32_t _msg_id = 0 ;
247+ uint32_t _discarded_packets = 0 ;
244248
245249 bool buffer_full () const { return _bytes_stored == BufferSize; }
246250
@@ -277,6 +281,7 @@ class RpcDecoder {
277281 void discard () {
278282 consume (_packet_size);
279283 reset_packet ();
284+ _discarded_packets++;
280285 }
281286
282287 void reset_packet () {
0 commit comments