rama-http 0.4.0

rama http layers, services and other utilities
Documentation
use super::FromOwnedRequestParts;
use crate::request::Parts;
use rama_net::uri::Uri;
use std::convert::Infallible;

impl FromOwnedRequestParts for Uri {
    type Rejection = Infallible;

    fn from_owned_request_parts(
        parts: Parts,
    ) -> impl Future<Output = Result<Self, Self::Rejection>> + Send + 'static {
        std::future::ready(Ok(parts.uri))
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::{
        Body, Method, Request, StatusCode,
        body::util::BodyExt,
        header,
        service::web::{
            WebService,
            extract::{Form, Text},
        },
    };
    use rama_core::Service;

    #[tokio::test]
    async fn owned_uri_composes_with_text_body_extractor() {
        let service = WebService::default()
            .with_post("/items", async |uri: Uri, Text(body): Text| {
                format!("{uri}: {body}")
            });
        let request = Request::builder()
            .method(Method::POST)
            .uri("/items?source=test")
            .header(header::CONTENT_TYPE, "text/plain")
            .body(Body::from("payload"))
            .unwrap();

        let response = service.serve(request).await.unwrap();

        assert_eq!(response.status(), StatusCode::OK);
        let body = response.into_body().collect().await.unwrap().to_bytes();
        assert_eq!(body, "/items?source=test: payload");
    }

    #[tokio::test]
    async fn owned_uri_remains_available_after_form_reads_its_query() {
        #[derive(serde::Deserialize)]
        struct Input {
            source: String,
        }

        let service = WebService::default()
            .with_get("/items", async |uri: Uri, Form(input): Form<Input>| {
                format!("{uri}: {}", input.source)
            });
        let request = Request::builder()
            .method(Method::GET)
            .uri("/items?source=query")
            .body(Body::empty())
            .unwrap();

        let response = service.serve(request).await.unwrap();

        assert_eq!(response.status(), StatusCode::OK);
        let body = response.into_body().collect().await.unwrap().to_bytes();
        assert_eq!(body, "/items?source=query: query");
    }
}