Skip to content
This repository was archived by the owner on Dec 29, 2022. It is now read-only.

Commit 4b61cf0

Browse files
authored
Merge pull request #1041 from alexheretic/permissive-void-param-requests
Avoid void-params deserialize errors
2 parents 502a46e + 25bcb21 commit 4b61cf0

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

src/server/message.rs

+12-4
Original file line numberDiff line numberDiff line change
@@ -269,10 +269,18 @@ impl RawMessage {
269269
Id::Null => None,
270270
};
271271

272-
let params = R::Params::deserialize(&self.params).map_err(|e| {
273-
debug!("error when parsing as request: {}", e);
274-
jsonrpc::Error::invalid_params(format!("{}", e))
275-
})?;
272+
let params = R::Params::deserialize(&self.params)
273+
.or_else(|e| {
274+
// Avoid tedious type errors trying to deserialize `()`
275+
if std::mem::size_of::<R::Params>() == 0 {
276+
R::Params::deserialize(&serde_json::Value::Null).map_err(|_| e)
277+
} else {
278+
Err(e)
279+
}
280+
}).map_err(|e| {
281+
debug!("error when parsing as request: {}", e);
282+
jsonrpc::Error::invalid_params(format!("{}", e))
283+
})?;
276284

277285
match parsed_id {
278286
Some(id) => Ok(Request {

src/server/mod.rs

+14
Original file line numberDiff line numberDiff line change
@@ -465,4 +465,18 @@ mod test {
465465

466466
assert_eq!(get_root_path(&params), root_path);
467467
}
468+
469+
/// Some clients send empty object params for void params requests (see #1038)
470+
#[test]
471+
fn parse_shutdown_object_params() {
472+
let raw = RawMessage::try_parse(
473+
r#"{"jsonrpc": "2.0", "id": 2, "method": "shutdown", "params": {}}"#,
474+
).ok()
475+
.and_then(|x| x)
476+
.expect("raw parse failed");
477+
478+
let _request: Request<ShutdownRequest> = raw
479+
.parse_as_request()
480+
.expect("Boring validation is happening");
481+
}
468482
}

0 commit comments

Comments
 (0)