Skip to content

Commit cfbdadb

Browse files
committed
feat: add JSON body parsing on Request
1 parent 12542ca commit cfbdadb

File tree

1 file changed

+24
-0
lines changed

1 file changed

+24
-0
lines changed

crates/raw/src/request.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ use std::collections::HashMap;
55
use http::Method;
66
use hyper::{Body, Request as HyperRequest};
77

8+
use crate::error::RawError;
9+
810
#[derive(Debug)]
911
pub struct Request {
1012
inner: HyperRequest<Body>,
@@ -45,6 +47,16 @@ impl Request {
4547
pub fn into_body(self) -> Body {
4648
self.inner.into_body()
4749
}
50+
51+
pub async fn json<T>(self) -> Result<T, RawError>
52+
where
53+
T: serde::de::DeserializeOwned,
54+
{
55+
let bytes = hyper::body::to_bytes(self.inner.into_body())
56+
.await
57+
.map_err(|_| RawError::BadRequest)?;
58+
serde_json::from_slice(&bytes).map_err(|_| RawError::BadRequest)
59+
}
4860
}
4961

5062
fn parse_query(query: Option<&str>) -> HashMap<String, String> {
@@ -69,11 +81,23 @@ fn parse_query(query: Option<&str>) -> HashMap<String, String> {
6981
#[cfg(test)]
7082
mod tests {
7183
use super::parse_query;
84+
use super::Request;
85+
use hyper::Body;
86+
use std::collections::HashMap;
7287

7388
#[test]
7489
fn parse_query_pairs() {
7590
let parsed = parse_query(Some("name=raw&mode=fast"));
7691
assert_eq!(parsed.get("name"), Some(&"raw".to_string()));
7792
assert_eq!(parsed.get("mode"), Some(&"fast".to_string()));
7893
}
94+
95+
#[tokio::test]
96+
async fn parse_json_body() {
97+
let body = Body::from(r#"{"status":"ok"}"#);
98+
let request = hyper::Request::new(body);
99+
let request = Request::new(request, HashMap::new());
100+
let parsed: serde_json::Value = request.json().await.expect("json");
101+
assert_eq!(parsed["status"], "ok");
102+
}
79103
}

0 commit comments

Comments
 (0)