1use std::{convert::Infallible, str::FromStr};
2
3use bytes::Bytes;
4use futures::StreamExt;
5use http_body_util::{combinators::BoxBody, StreamBody};
6use hyper::{body::Frame, Method, Request};
7
8use crate::IncomingMessage;
9
10impl From<&IncomingMessage> for Request<BoxBody<Bytes, Infallible>> {
11 fn from(message: &IncomingMessage) -> Self {
12 let body = message.body_stream();
13 let stream = body.map(|chunk| Ok::<_, Infallible>(Frame::data(chunk)));
14 let stream = StreamBody::new(stream);
15 let body: BoxBody<Bytes, Infallible> = BoxBody::new(stream);
16
17 let headers = message.headers_map();
18 let method = message.method();
19 let url = message.url();
20
21 let mut request_builder = Request::builder()
22 .method(Method::from_str(&method).expect("failed to parse method"))
23 .uri(url);
24 for (key, value) in headers {
25 request_builder = request_builder.header(key, value);
26 }
27
28 let request = request_builder.body(body).expect("failed to build request");
29 request
30 }
31}