Skip to content

Commit 4aed87b

Browse files
committed
Use from_reader_eager instead of from_reader when deserialize Json
`serde_json::from_reader` is considerably slow for some reason. serde-rs/json#160
1 parent de8e197 commit 4aed87b

File tree

1 file changed

+18
-1
lines changed

1 file changed

+18
-1
lines changed

contrib/src/json.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,23 @@ use serde_json;
1414

1515
pub use serde_json::error::Error as SerdeError;
1616

17+
/// Like [`from_reader`] but eagerly reads the content of the reader to a string
18+
/// and delegates to `from_str`.
19+
///
20+
/// [`from_reader`]: https://docs.serde.rs/serde_json/fn.from_reader.html
21+
fn from_reader_eager<R, T>(mut reader: R) -> serde_json::Result<T>
22+
where
23+
R: Read,
24+
T: DeserializeOwned,
25+
{
26+
let mut s = String::new();
27+
if let Err(io_err) = reader.read_to_string(&mut s) {
28+
// Error::io is private to serde_json. Do not use.
29+
return Err(SerdeError::io(io_err));
30+
}
31+
serde_json::from_str(&s)
32+
}
33+
1734
/// The JSON type: implements `FromData` and `Responder`, allowing you to easily
1835
/// consume and respond with JSON.
1936
///
@@ -97,7 +114,7 @@ impl<T: DeserializeOwned> FromData for Json<T> {
97114
}
98115

99116
let size_limit = request.limits().get("json").unwrap_or(LIMIT);
100-
serde_json::from_reader(data.open().take(size_limit))
117+
from_reader_eager(data.open().take(size_limit))
101118
.map(|val| Json(val))
102119
.map_err(|e| { error_!("Couldn't parse JSON body: {:?}", e); e })
103120
.into_outcome(Status::BadRequest)

0 commit comments

Comments
 (0)