kodumaro_http_cli/request/
http_request.rs1use reqwest::header::{HeaderName, HeaderValue};
2use reqwest::redirect::Policy;
3use reqwest::{Method, Request, Url};
4
5use super::payload::Payload;
6use super::verb::Verb;
7
8#[derive(Debug)]
9pub struct HttpRequest {
10
11 pub verb: Verb,
12 pub url: Url,
13 pub payload: Payload,
14 pub headers: Vec<(HeaderName, HeaderValue)>,
15 pub output: Option<String>,
16 pub follow: bool,
17 pub max_redirects: usize,
18 pub verify: bool,
19 pub fail: bool,
20 pub verbose: bool,
21 pub dry_run: bool,
22}
23
24impl Default for HttpRequest {
25
26 fn default() -> Self {
27 Self {
28 verb: Verb::GET,
29 url: "http://localhost/".try_into()
30 .expect("parsing localhost shouldn’t crash"),
31 payload: Payload::NoContent,
32 headers: Vec::new(),
33 output: None,
34 follow: false,
35 max_redirects: 0,
36 verify: false,
37 fail: false,
38 verbose: false,
39 dry_run: false,
40 }
41 }
42}
43
44impl From<&HttpRequest> for Request {
45
46 fn from(request: &HttpRequest) -> Self {
47 let method: Method = request.verb.into();
48 let mut res = Request::new(method, request.url.clone());
49 for (name, content) in &request.headers {
50 let _ = res.headers_mut().insert(name.to_owned(), content.to_owned());
51 }
52 res
53 }
54}
55
56impl From<&HttpRequest> for Policy {
57
58 fn from(request: &HttpRequest) -> Self {
59 if request.follow {
60 Policy::limited(request.max_redirects)
61 } else {
62 Policy::none()
63 }
64 }
65}