Skip to main content

rama_http/service/web/endpoint/extract/
request.rs

1use super::{FromOwnedRequestParts, FromRequest};
2use crate::{Request, request::Parts};
3use std::convert::Infallible;
4
5impl FromRequest for Request {
6    type Rejection = Infallible;
7
8    async fn from_request(req: Request) -> Result<Self, Self::Rejection> {
9        Ok(req)
10    }
11}
12
13impl FromOwnedRequestParts for Parts {
14    type Rejection = Infallible;
15
16    fn from_owned_request_parts(
17        parts: Parts,
18    ) -> impl Future<Output = Result<Self, Self::Rejection>> + Send + 'static {
19        std::future::ready(Ok(parts))
20    }
21}
22
23#[cfg(test)]
24mod tests {
25    use super::*;
26    use crate::{
27        Body, Method, StatusCode,
28        body::util::BodyExt,
29        header,
30        service::web::{WebService, extract::Json, response},
31    };
32    use rama_core::Service;
33
34    #[tokio::test]
35    async fn owned_parts_compose_with_json_body_extractor() {
36        #[derive(serde::Deserialize)]
37        struct Input {
38            value: String,
39        }
40
41        let service = WebService::default().with_post(
42            "/items",
43            async |parts: Parts, Json(input): Json<Input>| -> response::Result<String> {
44                assert_eq!(parts.method, Method::POST);
45                assert_eq!(parts.uri.to_string(), "/items");
46                assert_eq!(parts.headers.get("x-request-id").unwrap(), "parts-test");
47                Ok(input.value)
48            },
49        );
50        let request = Request::builder()
51            .method(Method::POST)
52            .uri("/items")
53            .header(header::CONTENT_TYPE, "application/json")
54            .header("x-request-id", "parts-test")
55            .body(Body::from(r#"{"value":"payload"}"#))
56            .unwrap();
57
58        let response = service.serve(request).await.unwrap();
59
60        assert_eq!(response.status(), StatusCode::OK);
61        let body = response.into_body().collect().await.unwrap().to_bytes();
62        assert_eq!(body, "payload");
63    }
64}