1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
use reqwest::blocking::{Client, ClientBuilder};
use reqwest::header::{HeaderMap, HeaderValue};
use reqwest::redirect::Policy;
use std::time::Duration;

use crate::http::{feature::headers, Feature, DEFAULT_HTTP_TIMEOUT_SECONDS};
use crate::settings::global_user::GlobalUser;

// TODO: remove this and replace it entirely with cloudflare-rs
pub fn client() -> Client {
    builder()
        .default_headers(headers(None))
        .build()
        .expect("could not create http client")
}

pub fn legacy_auth_client(user: &GlobalUser) -> Client {
    get_client(user, None)
}

pub fn featured_legacy_auth_client(user: &GlobalUser, feature: Feature) -> Client {
    get_client(user, Some(feature))
}

fn get_client(user: &GlobalUser, feature: Option<Feature>) -> Client {
    let mut headers = headers(feature);
    add_auth_headers(&mut headers, user);

    builder()
        .default_headers(headers)
        .redirect(Policy::none())
        .build()
        .expect("could not create authenticated http client")
}

fn builder() -> ClientBuilder {
    let builder = reqwest::blocking::Client::builder();
    builder
        .connect_timeout(Duration::from_secs(10))
        .timeout(Duration::from_secs(DEFAULT_HTTP_TIMEOUT_SECONDS))
}

fn add_auth_headers(headers: &mut HeaderMap, user: &GlobalUser) {
    match user {
        GlobalUser::TokenAuth { api_token } => {
            headers.insert(
                "Authorization",
                HeaderValue::from_str(&format!("Bearer {}", &api_token)).unwrap(),
            );
        }
        GlobalUser::GlobalKeyAuth { email, api_key } => {
            headers.insert("X-Auth-Email", HeaderValue::from_str(&email).unwrap());
            headers.insert("X-Auth-Key", HeaderValue::from_str(&api_key).unwrap());
        }
    }
}