use reqwest::header::{HeaderName, HeaderValue};
use reqwest::redirect::Policy;
use reqwest::{Method, Request, Url};
use super::payload::Payload;
use super::verb::Verb;
#[derive(Debug)]
pub struct HttpRequest {
pub verb: Verb,
pub url: Url,
pub payload: Payload,
pub headers: Vec<(HeaderName, HeaderValue)>,
pub output: Option<String>,
pub follow: bool,
pub max_redirects: usize,
pub verify: bool,
pub fail: bool,
pub verbose: bool,
pub dry_run: bool,
}
impl Default for HttpRequest {
fn default() -> Self {
Self {
verb: Verb::GET,
url: "http://localhost/".try_into()
.expect("parsing localhost shouldn’t crash"),
payload: Payload::NoContent,
headers: Vec::new(),
output: None,
follow: false,
max_redirects: 0,
verify: false,
fail: false,
verbose: false,
dry_run: false,
}
}
}
impl From<&HttpRequest> for Request {
fn from(request: &HttpRequest) -> Self {
let method: Method = request.verb.into();
let mut res = Request::new(method, request.url.clone());
for (name, content) in &request.headers {
let _ = res.headers_mut().insert(name.to_owned(), content.to_owned());
}
res
}
}
impl From<&HttpRequest> for Policy {
fn from(request: &HttpRequest) -> Self {
if request.follow {
Policy::limited(request.max_redirects)
} else {
Policy::none()
}
}
}