Skip to content

Commit 8c6a24d

Browse files
authored
Merge pull request #30 from bcmi-labs/development
Development
2 parents bfe08e0 + 7340e3b commit 8c6a24d

File tree

4 files changed

+64
-24
lines changed

4 files changed

+64
-24
lines changed

src/client.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ class RPCClient {
4141
}
4242

4343
// blocking call
44-
while (!get_response(msg_id_wait, result)){
44+
RpcError tmp_error;
45+
while (!get_response(msg_id_wait, result, tmp_error)) {
4546
//delay(1);
4647
}
4748

@@ -60,18 +61,18 @@ class RPCClient {
6061
}
6162

6263
template<typename RType>
63-
bool get_response(const uint32_t wait_id, RType& result) {
64-
RpcError tmp_error;
64+
bool get_response(const uint32_t wait_id, RType& result, RpcError& error) {
6565
decoder->decode();
6666

67-
if (decoder->get_response(wait_id, result, tmp_error)) {
68-
lastError.code = tmp_error.code;
69-
lastError.traceback = tmp_error.traceback;
67+
if (decoder->get_response(wait_id, result, error)) {
68+
lastError.copy(error);
7069
return true;
7170
}
7271
return false;
7372
}
7473

74+
uint32_t get_discarded_packets() const {return decoder->get_discarded_packets();}
75+
7576
};
7677

7778
#endif //RPCLITE_CLIENT_H

src/decoder.h

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

215240
private:
@@ -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;

src/error.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "MsgPack.h"
1818

1919
#define NO_ERR 0x00
20+
#define PARSING_ERR 0xFC
2021
#define MALFORMED_CALL_ERR 0xFD
2122
#define FUNCTION_NOT_FOUND_ERR 0xFE
2223
#define GENERIC_ERR 0xFF
@@ -34,6 +35,11 @@ struct RpcError {
3435
RpcError(const int c, MsgPack::str_t tb)
3536
: code(c), traceback(std::move(tb)) {}
3637

38+
void copy(const RpcError& err) {
39+
code = err.code;
40+
traceback = err.traceback;
41+
}
42+
3743
MSGPACK_DEFINE(code, traceback); // -> [code, traceback]
3844
};
3945

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)