From 5faaa4a1e0ca432742d3a49f8640d40c58f148bd Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Thu, 11 Aug 2022 15:57:52 +0200 Subject: [PATCH 1/4] fix(http client): serde_json::Value -> T This PR changes the http client to decode the reponse as `Response -> Response` In order to get a more user-friendly error message Before: ``` response: Err(ParseError(Error("missing field `error`", line: 1, column: 3752798))) ``` After ``` 2022-08-11T13:57:12.033043Z INFO http: r: Parse error: invalid type: string "lo", expected u8 ``` --- client/http-client/src/client.rs | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/client/http-client/src/client.rs b/client/http-client/src/client.rs index 541459c03e..9dba12d690 100644 --- a/client/http-client/src/client.rs +++ b/client/http-client/src/client.rs @@ -207,16 +207,19 @@ impl ClientT for HttpClient { } }; - let response: Response<_> = match serde_json::from_slice(&body) { - Ok(response) => response, - Err(_) => { - let err: ErrorResponse = serde_json::from_slice(&body).map_err(Error::ParseError)?; - return Err(Error::Call(CallError::Custom(err.error_object().clone().into_owned()))); - } - }; + let response: Response = + match serde_json::from_slice::>(&body) { + Ok(response) => response, + Err(_) => { + let err: ErrorResponse = serde_json::from_slice(&body).map_err(Error::ParseError)?; + return Err(Error::Call(CallError::Custom(err.error_object().clone().into_owned()))); + } + }; + + let result = serde_json::from_value(response.result).map_err(Error::ParseError)?; if response.id == id { - Ok(response.result) + Ok(result) } else { Err(Error::InvalidRequestId) } @@ -254,7 +257,7 @@ impl ClientT for HttpClient { Ok(Err(e)) => return Err(Error::Transport(e.into())), }; - let rps: Vec> = + let rps: Vec> = serde_json::from_slice(&body).map_err(|_| match serde_json::from_slice::(&body) { Ok(e) => Error::Call(CallError::Custom(e.error_object().clone().into_owned())), Err(e) => Error::ParseError(e), @@ -267,7 +270,8 @@ impl ClientT for HttpClient { Some(pos) => *pos, None => return Err(Error::InvalidRequestId), }; - responses[pos] = rp.result + let result = serde_json::from_value(rp.result).map_err(Error::ParseError)?; + responses[pos] = result; } Ok(responses) } From 43d415c5411ed8c35877c0c1e10a9f1b4fc87bd9 Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Wed, 17 Aug 2022 13:45:42 +0200 Subject: [PATCH 2/4] address grumbles --- client/http-client/src/client.rs | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/client/http-client/src/client.rs b/client/http-client/src/client.rs index 9dba12d690..871d68d5c7 100644 --- a/client/http-client/src/client.rs +++ b/client/http-client/src/client.rs @@ -33,7 +33,7 @@ use async_trait::async_trait; use hyper::http::HeaderMap; use jsonrpsee_core::client::{CertificateStore, ClientT, IdKind, RequestIdManager, Subscription, SubscriptionClientT}; use jsonrpsee_core::tracing::RpcTracing; -use jsonrpsee_core::{Error, TEN_MB_SIZE_BYTES}; +use jsonrpsee_core::{Error, JsonRawValue, TEN_MB_SIZE_BYTES}; use jsonrpsee_types::error::CallError; use rustc_hash::FxHashMap; use serde::de::DeserializeOwned; @@ -207,16 +207,17 @@ impl ClientT for HttpClient { } }; - let response: Response = - match serde_json::from_slice::>(&body) { - Ok(response) => response, - Err(_) => { - let err: ErrorResponse = serde_json::from_slice(&body).map_err(Error::ParseError)?; - return Err(Error::Call(CallError::Custom(err.error_object().clone().into_owned()))); - } - }; + // NOTE: it's decoded first `JsonRawValue` and then to `R` below to get + // a better error message if `R` couldn't be decoded. + let response: Response<&JsonRawValue> = match serde_json::from_slice(&body) { + Ok(response) => response, + Err(_) => { + let err: ErrorResponse = serde_json::from_slice(&body).map_err(Error::ParseError)?; + return Err(Error::Call(CallError::Custom(err.error_object().clone().into_owned()))); + } + }; - let result = serde_json::from_value(response.result).map_err(Error::ParseError)?; + let result = serde_json::from_str(response.result.get()).map_err(Error::ParseError)?; if response.id == id { Ok(result) @@ -257,7 +258,9 @@ impl ClientT for HttpClient { Ok(Err(e)) => return Err(Error::Transport(e.into())), }; - let rps: Vec> = + // NOTE: it's decoded first `JsonRawValue` and then to `R` below to get + // a better error message if `R` couldn't be decoded. + let rps: Vec> = serde_json::from_slice(&body).map_err(|_| match serde_json::from_slice::(&body) { Ok(e) => Error::Call(CallError::Custom(e.error_object().clone().into_owned())), Err(e) => Error::ParseError(e), @@ -270,7 +273,7 @@ impl ClientT for HttpClient { Some(pos) => *pos, None => return Err(Error::InvalidRequestId), }; - let result = serde_json::from_value(rp.result).map_err(Error::ParseError)?; + let result = serde_json::from_str(rp.result.get()).map_err(Error::ParseError)?; responses[pos] = result; } Ok(responses) From 42c55a6481951d7f00c566d591281ff7f972fc0b Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Wed, 17 Aug 2022 18:17:26 +0200 Subject: [PATCH 3/4] Update client/http-client/src/client.rs --- client/http-client/src/client.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/http-client/src/client.rs b/client/http-client/src/client.rs index 871d68d5c7..1d91c6671b 100644 --- a/client/http-client/src/client.rs +++ b/client/http-client/src/client.rs @@ -207,7 +207,7 @@ impl ClientT for HttpClient { } }; - // NOTE: it's decoded first `JsonRawValue` and then to `R` below to get + // NOTE: it's decoded first to `JsonRawValue` and then to `R` below to get // a better error message if `R` couldn't be decoded. let response: Response<&JsonRawValue> = match serde_json::from_slice(&body) { Ok(response) => response, From db083b897b91910462dd393d5a584df6259143dc Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Wed, 17 Aug 2022 18:17:41 +0200 Subject: [PATCH 4/4] Update client/http-client/src/client.rs --- client/http-client/src/client.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/http-client/src/client.rs b/client/http-client/src/client.rs index 1d91c6671b..6d83dc8c23 100644 --- a/client/http-client/src/client.rs +++ b/client/http-client/src/client.rs @@ -258,7 +258,7 @@ impl ClientT for HttpClient { Ok(Err(e)) => return Err(Error::Transport(e.into())), }; - // NOTE: it's decoded first `JsonRawValue` and then to `R` below to get + // NOTE: it's decoded first to `JsonRawValue` and then to `R` below to get // a better error message if `R` couldn't be decoded. let rps: Vec> = serde_json::from_slice(&body).map_err(|_| match serde_json::from_slice::(&body) {