1mod cli;
2mod error;
3mod http;
4mod logs;
5mod proxy;
6mod requester;
7
8use cli::output::{handle_output, Output};
9use cli::Input;
10use error::Error;
11use http::request::Request;
12use requester::connector::{Connector, ProxyConnector, RegularConnector};
13use requester::Requester;
14use url::Url;
15
16pub fn process(args: Vec<String>) {
17 match handle_arguments(args) {
18 Ok(()) => {}
19 Err(error) => eprintln!("{}", error),
20 }
21}
22
23fn handle_arguments(args: Vec<String>) -> Result<(), Error> {
24 let (input, output) = cli::parse_args(args)?;
25 handle_input(input, output)
26}
27
28fn handle_input(input: Input, output: Output) -> Result<(), Error> {
29 let allow_proxy = input.allow_proxy;
30 let timeout = input.timeout;
31 let request = setup_request(input)?;
32
33 let connector: Box<dyn Connector> = match (request.proxy, allow_proxy) {
34 (true, true) => Box::new(ProxyConnector::new(timeout)),
35 _ => Box::new(RegularConnector::new(timeout)),
36 };
37
38 let requester = Requester::new(connector);
39
40 let request_output = serde_json::to_value(&request)?;
41 let response = requester.send_request(request)?;
42
43 handle_output(response, request_output, output)
44}
45
46fn setup_request(input: Input) -> Result<Request, Error> {
47 let parsed_url = parse_url(&input.url)?;
48 match input.body {
49 Some(body) => Request::with_body(parsed_url, input.method, input.headers, &body),
50 None => Request::new(parsed_url, input.method, input.headers),
51 }
52}
53
54fn parse_url(url: &str) -> Result<Url, Error> {
55 let parsed_url = match Url::parse(url) {
56 Ok(url) => url,
57 Err(why) => error!(&why.to_string()),
58 };
59 if !parsed_url.has_host() {
60 error!("no host in input");
61 }
62 Ok(parsed_url)
63}