@@ -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