use std::borrow::Cow;
use http::header::HeaderMap;
use http::{Method, Uri};
use crate::request::{RequestView, ToRequestView};
impl ToRequestView for http::request::Parts {
fn request_view(&self) -> RequestView<'_> {
view(&self.method, &self.uri, &self.headers)
}
}
impl<B> ToRequestView for http::Request<B> {
fn request_view(&self) -> RequestView<'_> {
view(self.method(), self.uri(), self.headers())
}
}
fn view<'r>(method: &'r Method, uri: &'r Uri, headers: &'r HeaderMap) -> RequestView<'r> {
let view = RequestView::new(method.as_str(), uri.path()).with_headers(headers.iter().map(
|(name, value)| {
let value = match value.to_str() {
Ok(text) => Cow::Borrowed(text),
Err(_) => Cow::Owned(String::from_utf8_lossy(value.as_bytes()).into_owned()),
};
(Cow::Borrowed(name.as_str()), value)
},
));
match uri.query() {
Some(query) => view.with_query(query),
None => view,
}
}