1+ #ifndef RPCLITE_REQUEST_H
2+ #define RPCLITE_REQUEST_H
3+
4+ #define RPC_BUFFER_SIZE 1024
5+
6+
7+ #include " rpclite_utils.h"
8+
9+ class RPCRequest {
10+
11+ public:
12+ uint8_t buffer[RPC_BUFFER_SIZE];
13+ size_t size = 0 ;
14+ int type = NO_MSG;
15+ int req_id;
16+ MsgPack::Packer res_packer;
17+ MsgPack::Unpacker req_unpacker;
18+ MsgPack::str_t method;
19+
20+ bool unpack_request_headers (){
21+ if (size == 0 ) return false ;
22+
23+ MsgPack::Unpacker unpacker;
24+
25+ req_unpacker.clear ();
26+ if (!req_unpacker.feed (buffer, size)) return false ;
27+
28+ int msg_type;
29+ uint32_t msg_id;
30+ MsgPack::str_t method;
31+ MsgPack::arr_size_t req_size;
32+
33+ if (!req_unpacker.deserialize (req_size, msg_type)) {
34+ return false ; // Header not unpackable
35+ }
36+
37+ if (msg_type == CALL_MSG && req_size.size () == REQUEST_SIZE) {
38+ if (!req_unpacker.deserialize (msg_id, method)) {
39+ return false ; // Method not unpackable
40+ }
41+ } else if (msg_type == NOTIFY_MSG && req_size.size () == NOTIFY_SIZE) {
42+ if (!req_unpacker.deserialize (method)) {
43+ return false ; // Method not unpackable
44+ }
45+ } else {
46+ return false ; // Invalid request size/type
47+ }
48+
49+ type = msg_type;
50+ req_id = msg_id;
51+ return true ;
52+
53+ }
54+
55+ void pack_response_headers (){
56+ res_packer.clear ();
57+ MsgPack::arr_size_t resp_size (RESPONSE_SIZE);
58+ if (msg_type == CALL_MSG) req.res_packer .serialize (resp_size, RESP_MSG, msg_id);
59+ }
60+
61+ void reset (){
62+ size = 0 ;
63+ type = NO_MSG;
64+ method = " " ;
65+ req_unpacker.clear ();
66+ res_packer.clear ();
67+ }
68+
69+ };
70+
71+ #endif RPCLITE_REQUEST_H
0 commit comments