Skip to content

Commit 7340e3b

Browse files
committed
feat: get_discard_packages (client/server/decoder)
mod: recoded decoder.get_response logic discarding broken packages with right ID
1 parent e2bfcd7 commit 7340e3b

File tree

3 files changed

+27
-20
lines changed

3 files changed

+27
-20
lines changed

src/client.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,12 @@ class RPCClient {
6767
if (decoder->get_response(wait_id, result, error)) {
6868
lastError.copy(error);
6969
return true;
70-
} else if (error.code == PARSING_ERR) { // catches the parsing error
71-
lastError.copy(error);
7270
}
7371
return false;
7472
}
7573

74+
uint32_t get_discarded_packets() const {return decoder->get_discarded_packets();}
75+
7676
};
7777

7878
#endif //RPCLITE_CLIENT_H

src/decoder.h

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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

237240
private:
@@ -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() {

src/server.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ class RPCServer {
8787

8888
}
8989

90+
uint32_t get_discarded_packets() const {return decoder->get_discarded_packets();}
91+
9092
private:
9193
RpcDecoder<>* decoder = nullptr;
9294
RpcFunctionDispatcher<MAX_CALLBACKS> dispatcher{};

0 commit comments

Comments
 (0)