@@ -62,29 +62,54 @@ class RpcDecoder {
6262        MsgPack::Unpacker unpacker;
6363        unpacker.clear ();
6464
65-         size_t  res_size = get_packet_size ();
66-         if  (!unpacker.feed (_raw_buffer, res_size)) return  false ;
65+         if  (!unpacker.feed (_raw_buffer, _packet_size)) return  false ;
6766
6867        MsgPack::arr_size_t  resp_size;
6968        int  resp_type;
7069        uint32_t  resp_id;
7170
7271        if  (!unpacker.deserialize (resp_size, resp_type, resp_id)) return  false ;
73-          if  (resp_size. size () != RESPONSE_SIZE)  return   false ; 
74-         if  (resp_type != RESP_MSG)  return   false ; 
72+ 
73+         //  ReSharper disable once CppDFAUnreachableCode 
7574        if  (resp_id != msg_id) return  false ;
7675
76+         //  msg_id OK packet will be consumed.
77+         if  (resp_type != RESP_MSG) {
78+             //  This should never happen
79+             error.code  = PARSING_ERR;
80+             error.traceback  = " Unexpected response type" 
81+             discard ();
82+             return  true ;
83+         }
84+ 
85+         if  (resp_size.size () != RESPONSE_SIZE) {
86+             //  This should never happen
87+             error.code  = PARSING_ERR;
88+             error.traceback  = " Unexpected RPC response size" 
89+             discard ();
90+             return  true ;
91+         }
92+ 
7793        MsgPack::object::nil_t  nil;
7894        if  (unpacker.unpackable (nil)){  //  No error
79-             if  (!unpacker.deserialize (nil, result)) return  false ;
95+             if  (!unpacker.deserialize (nil, result)) {
96+                 error.code  = PARSING_ERR;
97+                 error.traceback  = " Result not parsable (check type)" 
98+                 discard ();
99+                 return  true ;
100+             }
80101        } else  {                        //  RPC returned an error
81-             if  (!unpacker.deserialize (error, nil)) return  false ;
102+             if  (!unpacker.deserialize (error, nil)) {
103+                 error.code  = PARSING_ERR;
104+                 error.traceback  = " RPC Error not parsable (check type)" 
105+                 discard ();
106+                 return  true ;
107+             }
82108        }
83109
110+         consume (_packet_size);
84111        reset_packet ();
85-         consume (res_size);
86112        return  true ;
87- 
88113    }
89114
90115    bool  send_response (const  MsgPack::Packer& packer) const  {
@@ -103,8 +128,7 @@ class RpcDecoder {
103128
104129        unpacker.clear ();
105130        if  (!unpacker.feed (_raw_buffer, _packet_size)) {    //  feed should not fail at this point
106-             consume (_packet_size);
107-             reset_packet ();
131+             discard ();
108132            return  " " 
109133        };
110134
@@ -113,27 +137,24 @@ class RpcDecoder {
113137        MsgPack::arr_size_t  req_size;
114138
115139        if  (!unpacker.deserialize (req_size, msg_type)) {
116-             consume (_packet_size);
117-             reset_packet ();
140+             discard ();
118141            return  " " //  Header not unpackable
119142        }
120143
144+         //  ReSharper disable once CppDFAUnreachableCode
121145        if  (msg_type == CALL_MSG && req_size.size () == REQUEST_SIZE) {
122146            uint32_t  msg_id;
123147            if  (!unpacker.deserialize (msg_id, method)) {
124-                 consume (_packet_size);
125-                 reset_packet ();
148+                 discard ();
126149                return  " " //  Method not unpackable
127150            }
128151        } else  if  (msg_type == NOTIFY_MSG && req_size.size () == NOTIFY_SIZE) {
129152            if  (!unpacker.deserialize (method)) {
130-                 consume (_packet_size);
131-                 reset_packet ();
153+                 discard ();
132154                return  " " //  Method not unpackable
133155            }
134156        } else  {
135-             consume (_packet_size);
136-             reset_packet ();
157+             discard ();
137158            return  " " //  Invalid request size/type
138159        }
139160
@@ -183,11 +204,13 @@ class RpcDecoder {
183204
184205                if  (type != CALL_MSG && type != RESP_MSG && type != NOTIFY_MSG) {
185206                    consume (bytes_checked);
207+                     _discarded_packets++;
186208                    break ; //  Not a valid RPC type (could be type=WRONG_MSG)
187209                }
188210
189211                if  ((type == CALL_MSG && container_size != REQUEST_SIZE) || (type == RESP_MSG && container_size != RESPONSE_SIZE) || (type == NOTIFY_MSG && container_size != NOTIFY_SIZE)) {
190212                    consume (bytes_checked);
213+                     _discarded_packets++;
191214                    break ; //  Not a valid RPC format
192215                }
193216
@@ -210,6 +233,8 @@ class RpcDecoder {
210233
211234    size_t  size () const  {return  _bytes_stored;}
212235
236+     uint32_t  get_discarded_packets () const  {return  _discarded_packets;}
237+ 
213238    friend  class  DecoderTester ;
214239
215240private: 
@@ -219,6 +244,7 @@ class RpcDecoder {
219244    int  _packet_type = NO_MSG;
220245    size_t  _packet_size = 0 ;
221246    uint32_t  _msg_id = 0 ;
247+     uint32_t  _discarded_packets = 0 ;
222248
223249    bool  buffer_full () const  { return  _bytes_stored == BufferSize; }
224250
@@ -252,6 +278,11 @@ class RpcDecoder {
252278        return  consume (packet_size);
253279    }
254280
281+     void  discard () {
282+         consume (_packet_size);
283+         reset_packet ();
284+         _discarded_packets++;
285+     }
255286
256287    void  reset_packet () {
257288        _packet_type = NO_MSG;
0 commit comments