From dff55fda4e83271e3517da6e56d273a4572e02ff Mon Sep 17 00:00:00 2001 From: Kade Robertson Date: Mon, 13 Feb 2023 16:05:11 -0500 Subject: [PATCH] feat: bidirectional http request conversion --- src/request.rs | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/request.rs b/src/request.rs index 39bf002..c7cb507 100644 --- a/src/request.rs +++ b/src/request.rs @@ -500,6 +500,55 @@ impl Request { } } +#[cfg(feature = "http")] +impl From for Request { + fn from(value: http::request::Builder) -> Self { + let mut new_request = crate::agent().request( + value.method_ref().map_or("GET", |m| m.as_str()), + &value + .uri_ref() + .map_or("https://example.com".to_string(), |u| u.to_string()), + ); + + if let Some(headers) = value.headers_ref() { + new_request = headers + .iter() + .filter_map(|header| { + header + .1 + .to_str() + .ok() + .map(|str_value| (header.0.as_str(), str_value)) + }) + .fold(new_request, |request, header| { + request.set(header.0, header.1) + }); + } + + new_request + } +} + +#[cfg(feature = "http")] +impl From for http::request::Builder { + fn from(value: Request) -> Self { + value + .headers + .iter() + .filter_map(|header| { + header + .value() + .map(|safe_value| (header.name().to_owned(), safe_value.to_owned())) + }) + .fold(http::Request::builder(), |builder, header| { + builder.header(header.0, header.1) + }) + .method(value.method()) + .version(http::Version::HTTP_11) + .uri(value.url()) + } +} + /// Parsed result of a request url with handy inspection methods. #[derive(Debug, Clone)] pub struct RequestUrl {