Skip to content

Commit 24c4630

Browse files
authored
Merge pull request #2800 from vibe-d/fix_spurious_rpc_serialization
Avoid serializing AuthInfo and input streams in RPC interfaces
2 parents 983cd88 + 5bfe84a commit 24c4630

File tree

1 file changed

+9
-5
lines changed

1 file changed

+9
-5
lines changed

web/vibe/web/rpc.d

+9-5
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ module vibe.web.rpc;
8888
import vibe.core.log;
8989
import vibe.core.core : Task, runTask, yield;
9090
import vibe.core.path : InetPath;
91+
import vibe.core.stream : isInputStream;
9192
import vibe.data.bson;
9293
import vibe.inet.url : URL;
9394
import vibe.http.router;
@@ -243,14 +244,14 @@ final class WebRPCPeerImpl(I, RootI, string method_prefix) : I
243244

244245
mixin(generateWebRPCPeerMethods!I());
245246

246-
private auto performCall(alias method, PARAMS...)(auto ref PARAMS params)
247+
private ReturnType!method performCall(alias method, PARAMS...)(auto ref PARAMS params)
247248
{
248249
alias outparams = refOutParameterIndices!method;
249250
alias paramnames = ParameterIdentifierTuple!method;
250251

251252
Bson args = Bson.emptyObject;
252253
foreach (i, pname; ParameterIdentifierTuple!method)
253-
static if (!is(typeof(args[i]) == AuthInfo!I) && !(ParameterStorageClassTuple!method[i] & ParameterStorageClass.out_))
254+
static if (!is(ParameterTypeTuple!method[i] == AuthInfo!I) && !(ParameterStorageClassTuple!method[i] & ParameterStorageClass.out_))
254255
args[pname] = serializeToBson(params[i]);
255256
auto seq = m_handler.sendCall(method_prefix ~ __traits(identifier, method), args);
256257
auto ret = m_handler.waitForResponse(seq);
@@ -259,8 +260,11 @@ final class WebRPCPeerImpl(I, RootI, string method_prefix) : I
259260
params[pi] = ret[paramnames[pi]].deserializeBson!(PARAMS[pi]);
260261
static if (!is(ReturnType!method == void))
261262
return ret["return"].deserializeBson!(ReturnType!method);
262-
} else static if (!is(ReturnType!method == void))
263+
} else static if (isInputStream!(ReturnType!method)) {
264+
throw new Exception("Stream type results are not yet supported");
265+
} else static if (!is(ReturnType!method == void)) {
263266
return ret.deserializeBson!(ReturnType!method);
267+
}
264268
}
265269
}
266270

@@ -736,9 +740,9 @@ private final class WebSocketHandler(I) {
736740
bret = Bson.emptyObject;
737741
foreach (pi; outparams)
738742
bret[paramnames[pi]] = serializeToBson(args[pi]);
739-
static if (is(typeof(ret)))
743+
static if (is(typeof(ret)) && !isInputStream!(typeof(ret)))
740744
bret["return"] = serializeToBson(ret);
741-
} else static if (is(typeof(ret))) {
745+
} else static if (is(typeof(ret)) && !isInputStream!(typeof(ret))) {
742746
bret = serializeToBson(ret);
743747
}
744748
return bret;

0 commit comments

Comments
 (0)