Skip to content

Commit 4ad248f

Browse files
committed
fix: wrapper not unpacking param array. feat: error check on param # mismatch
1 parent 3f34c61 commit 4ad248f

File tree

6 files changed

+46
-8
lines changed

6 files changed

+46
-8
lines changed

examples/rpc_lite_server/rpc_lite_server.ino

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ int add(int a, int b){
88
return a+b;
99
}
1010

11+
MsgPack::str_t greet(){
12+
return MsgPack::str_t ("Hello Friend");
13+
}
1114

1215
void setup() {
1316
Serial2.begin(115200);
@@ -17,6 +20,7 @@ void setup() {
1720
while(!Serial);
1821

1922
server.bind("add", add);
23+
server.bind("greet", greet);
2024

2125
}
2226

examples/wrapper_example/wrapper_example.ino

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ void setup() {
4646
void loop() {
4747

4848
packer.clear();
49-
packer.serialize(a, b);
49+
MsgPack::arr_size_t param_size(2);
50+
packer.serialize(param_size, a, b);
5051

5152
unpacker.clear();
5253
unpacker.feed(packer.data(), packer.size());
@@ -76,7 +77,7 @@ void loop() {
7677
float denominator = 0;
7778

7879
packer.clear();
79-
packer.serialize(numerator, denominator);
80+
packer.serialize(param_size, numerator, denominator);
8081
unpacker.clear();
8182
unpacker.feed(packer.data(), packer.size());
8283
out_packer.clear();

extras/examples/serial_client_example.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,11 @@
44

55
client = SerialClient(port=PORT, baudrate=115200)
66

7-
client.call("add", 15, 7)
7+
8+
client.call("add", 10) # not enough args
9+
10+
client.call("add", 15, 7) # just enough args
11+
12+
client.call("add", 1, 2, 3) # too many args
13+
14+
client.call("greet")

src/error.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
#include "MsgPack.h"
1010

1111

12+
#define NO_ERR 0x00
13+
#define MALFORMED_CALL_ERR 0xFD
1214
#define FUNCTION_NOT_FOUND_ERR 0xFE
1315
#define GENERIC_ERR 0xFF
1416

src/server.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class RPCServer {
5151
packer.serialize(resp_size, RESP_MSG, msg_id);
5252

5353
dispatcher.call(method, unpacker, packer);
54-
54+
flush_buffer();
5555
send_msg(transport, packer.packet());
5656

5757
}

src/wrapper.h

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,26 +77,50 @@ class RpcFunctionWrapper<R(Args...)>: public IFunctionWrapper {
7777
}
7878

7979
bool operator()(MsgPack::Unpacker& unpacker, MsgPack::Packer& packer) override {
80-
auto args = deserialize_all<Args...>(unpacker);
80+
8181
MsgPack::object::nil_t nil;
8282

8383
#ifdef HANDLE_RPC_ERRORS
8484
try {
8585
#endif
86+
87+
// First check the parameters size
88+
if (!unpacker.isArray()){
89+
RpcError error(MALFORMED_CALL_ERR, "Unserializable parameters array");
90+
packer.serialize(error, nil);
91+
return false;
92+
}
93+
94+
MsgPack::arr_size_t param_size;
95+
96+
unpacker.deserialize(param_size);
97+
if (param_size.size() < sizeof...(Args)){
98+
RpcError error(MALFORMED_CALL_ERR, "Missing call parameters (WARNING: Default param resolution is not implemented)");
99+
packer.serialize(error, nil);
100+
return false;
101+
}
102+
103+
if (param_size.size() > sizeof...(Args)){
104+
RpcError error(MALFORMED_CALL_ERR, "Too many parameters");
105+
packer.serialize(error, nil);
106+
return false;
107+
}
108+
109+
auto args = deserialize_all<Args...>(unpacker);
86110
if constexpr (std::is_void<R>::value){
87111
invoke_with_tuple(_func, args, make_index_sequence<sizeof...(Args)>{});
88112
packer.serialize(nil, nil);
89113
return true;
90114
} else {
91115
R out = invoke_with_tuple(_func, args, make_index_sequence<sizeof...(Args)>{});
116+
Serial.println(out);
92117
packer.serialize(nil, out);
93118
return true;
94119
}
95120
#ifdef HANDLE_RPC_ERRORS
96121
} catch (const std::exception& e) {
97-
RpcError error;
98-
error.code = 0xFE;
99-
error.traceback = "RPC error";
122+
// Should be specialized according to the exception type
123+
RpcError error(GENERIC_ERR, "RPC error");
100124
packer.serialize(error, nil);
101125
return false;
102126
}

0 commit comments

Comments
 (0)