kodumaro_http_cli/request/
http_request.rs

1use 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}