@@ -5,6 +5,8 @@ use std::collections::HashMap;
55use http:: Method ;
66use hyper:: { Body , Request as HyperRequest } ;
77
8+ use crate :: error:: RawError ;
9+
810#[ derive( Debug ) ]
911pub 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
5062fn parse_query ( query : Option < & str > ) -> HashMap < String , String > {
@@ -69,11 +81,23 @@ fn parse_query(query: Option<&str>) -> HashMap<String, String> {
6981#[ cfg( test) ]
7082mod 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