use std::borrow::Cow;
use crate::request::{RequestView, ToRequestView};
impl ToRequestView for reqwest::Request {
fn request_view(&self) -> RequestView<'_> {
view(
self.method().as_str(),
self.url(),
self.headers(),
self.body().and_then(reqwest::Body::as_bytes),
)
}
}
impl ToRequestView for reqwest::blocking::Request {
fn request_view(&self) -> RequestView<'_> {
view(
self.method().as_str(),
self.url(),
self.headers(),
self.body().and_then(reqwest::blocking::Body::as_bytes),
)
}
}
fn view<'r>(
method: &'r str,
url: &'r reqwest::Url,
headers: &'r reqwest::header::HeaderMap,
body: Option<&'r [u8]>,
) -> RequestView<'r> {
let mut view =
RequestView::new(method, url.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)
}));
if let Some(query) = url.query() {
view = view.with_query(query);
}
match body {
Some(body) => view.with_body(body),
None => view,
}
}