Skip to content

Commit 124336f

Browse files
committed
mod: RPCRequest sizeable buffer. impr: naming
1 parent 18e8da9 commit 124336f

File tree

3 files changed

+84
-51
lines changed

3 files changed

+84
-51
lines changed

src/decoder.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ class RpcDecoder {
8282
return send(reinterpret_cast<const uint8_t*>(packer.data()), packer.size()) == packer.size();
8383
}
8484

85-
MsgPack::str_t fetch_method(){
85+
MsgPack::str_t fetch_rpc_method(){
8686

8787
if (!packet_incoming()){return "";}
8888

src/request.h

Lines changed: 65 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,84 @@
11
#ifndef RPCLITE_REQUEST_H
22
#define RPCLITE_REQUEST_H
33

4-
#define RPC_BUFFER_SIZE 1024
4+
#define DEFAULT_RPC_BUFFER_SIZE 256
55

66

77
#include "rpclite_utils.h"
88

9+
template<size_t BufferSize = DEFAULT_RPC_BUFFER_SIZE>
910
class RPCRequest {
1011

1112
public:
12-
uint8_t buffer[RPC_BUFFER_SIZE];
13+
uint8_t buffer[BufferSize];
1314
size_t size = 0;
1415
int type = NO_MSG;
15-
MsgPack::Packer res_packer;
16+
uint32_t msg_id = 0;
17+
MsgPack::str_t method;
18+
MsgPack::Packer packer;
19+
MsgPack::Unpacker unpacker;
20+
21+
// void print(){
22+
23+
// Serial.print("internal buffer ");
24+
// for (size_t i=0; i<size; i++){
25+
// Serial.print(buffer[i], HEX);
26+
// }
27+
// Serial.println("");
28+
// }
29+
30+
size_t get_buffer_size() const {
31+
return BufferSize;
32+
}
33+
34+
bool unpack_request_headers(){
35+
if (size == 0) return false;
36+
37+
unpacker.clear();
38+
if (!unpacker.feed(buffer, size)) return false;
39+
40+
int msg_type;
41+
uint32_t req_id;
42+
MsgPack::str_t req_method;
43+
MsgPack::arr_size_t req_size;
44+
45+
if (!unpacker.deserialize(req_size, msg_type)) {
46+
return false; // Header not unpackable
47+
}
48+
49+
if (msg_type == CALL_MSG && req_size.size() == REQUEST_SIZE) {
50+
if (!unpacker.deserialize(req_id, req_method)) {
51+
return false; // Method not unpackable
52+
}
53+
} else if (msg_type == NOTIFY_MSG && req_size.size() == NOTIFY_SIZE) {
54+
if (!unpacker.deserialize(req_method)) {
55+
return false; // Method not unpackable
56+
}
57+
} else {
58+
return false; // Invalid request size/type
59+
}
60+
61+
method = req_method;
62+
type = msg_type;
63+
msg_id = req_id;
64+
65+
return true;
66+
67+
}
68+
69+
void pack_response_headers(){
70+
packer.clear();
71+
MsgPack::arr_size_t resp_size(RESPONSE_SIZE);
72+
if (type == CALL_MSG) packer.serialize(resp_size, RESP_MSG, msg_id);
73+
}
1674

1775
void reset(){
1876
size = 0;
1977
type = NO_MSG;
20-
res_packer.clear();
78+
msg_id = 0;
79+
method = "";
80+
unpacker.clear();
81+
packer.clear();
2182
}
2283

2384
};

src/server.h

Lines changed: 18 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -33,77 +33,49 @@ class RPCServer {
3333

3434
void run() {
3535

36-
RPCRequest req;
37-
if (get_rpc(req)) { // Populate local request
38-
process_request(req); // Process local data
39-
send_response(req); // Send from local data
40-
}
36+
RPCRequest<> req;
37+
38+
if (!get_rpc(req)) return; // Populate local request
39+
40+
process_request(req); // Process local data
41+
42+
send_response(req); // Send from local data
4143

4244
}
4345

44-
bool get_rpc(RPCRequest& req, MsgPack::str_t tag="") {
46+
bool get_rpc(RPCRequest<>& req, MsgPack::str_t tag="") {
4547
decoder->decode();
4648

47-
MsgPack::str_t method = decoder->fetch_method();
49+
MsgPack::str_t method = decoder->fetch_rpc_method();
4850

4951
if (method == "" || !hasTag(method, tag)) return false;
5052

51-
req.size = decoder->get_request(req.buffer, RPC_BUFFER_SIZE); // todo overload get_request(RPCRequest& req) so all the request info is in req
53+
req.size = decoder->get_request(req.buffer, req.get_buffer_size()); // todo overload get_request(RPCRequest& req) so all the request info is in req
5254
return req.size > 0;
5355
}
5456

55-
void process_request(RPCRequest& req) {
56-
if (req.size == 0) return;
57-
58-
MsgPack::Unpacker unpacker;
59-
60-
unpacker.clear();
61-
if (!unpacker.feed(req.buffer, req.size)) return;
57+
void process_request(RPCRequest<>& req) {
6258

63-
int msg_type;
64-
uint32_t msg_id;
65-
MsgPack::str_t method;
66-
MsgPack::arr_size_t req_size;
67-
68-
if (!unpacker.deserialize(req_size, msg_type)) {
59+
if (!req.unpack_request_headers()) {
6960
req.reset();
70-
return; // Header not unpackable
61+
return;
7162
}
7263

73-
if (msg_type == CALL_MSG && req_size.size() == REQUEST_SIZE) {
74-
if (!unpacker.deserialize(msg_id, method)) {
75-
req.reset();
76-
return; // Method not unpackable
77-
}
78-
} else if (msg_type == NOTIFY_MSG && req_size.size() == NOTIFY_SIZE) {
79-
if (!unpacker.deserialize(method)) {
80-
req.reset();
81-
return; // Method not unpackable
82-
}
83-
} else {
84-
req.reset();
85-
return; // Invalid request size/type
86-
}
87-
88-
req.type = msg_type;
89-
90-
MsgPack::arr_size_t resp_size(RESPONSE_SIZE);
91-
req.res_packer.clear();
92-
if (msg_type == CALL_MSG) req.res_packer.serialize(resp_size, RESP_MSG, msg_id);
64+
req.pack_response_headers();
9365

94-
dispatcher.call(method, unpacker, req.res_packer);
66+
dispatcher.call(req.method, req.unpacker, req.packer);
9567

9668
}
9769

98-
bool send_response(RPCRequest& req) {
70+
bool send_response(RPCRequest<>& req) {
9971

100-
if (req.type == NO_MSG || req.res_packer.size() == 0) {
72+
if (req.type == NO_MSG || req.packer.size() == 0) {
10173
return true; // No response to send
10274
}
10375

10476
if (req.type == NOTIFY_MSG) return true;
10577

106-
return decoder->send_response(req.res_packer);
78+
return decoder->send_response(req.packer);
10779

10880
}
10981

0 commit comments

Comments
 (0)