1use reqwest::blocking::{Client, ClientBuilder};
2use reqwest::header::{HeaderMap, HeaderValue};
3use reqwest::redirect::Policy;
4use std::time::Duration;
5
6use crate::http::{feature::headers, Feature, DEFAULT_HTTP_TIMEOUT_SECONDS};
7use crate::settings::global_user::GlobalUser;
8
9pub fn client() -> Client {
11 builder()
12 .default_headers(headers(None))
13 .build()
14 .expect("could not create http client")
15}
16
17pub fn legacy_auth_client(user: &GlobalUser) -> Client {
18 get_client(user, None)
19}
20
21pub fn featured_legacy_auth_client(user: &GlobalUser, feature: Feature) -> Client {
22 get_client(user, Some(feature))
23}
24
25fn get_client(user: &GlobalUser, feature: Option<Feature>) -> Client {
26 let mut headers = headers(feature);
27 add_auth_headers(&mut headers, user);
28
29 builder()
30 .default_headers(headers)
31 .redirect(Policy::none())
32 .build()
33 .expect("could not create authenticated http client")
34}
35
36fn builder() -> ClientBuilder {
37 let builder = reqwest::blocking::Client::builder();
38 builder
39 .connect_timeout(Duration::from_secs(10))
40 .timeout(Duration::from_secs(DEFAULT_HTTP_TIMEOUT_SECONDS))
41}
42
43fn add_auth_headers(headers: &mut HeaderMap, user: &GlobalUser) {
44 match user {
45 GlobalUser::ApiTokenAuth { api_token } => {
46 headers.insert(
47 "Authorization",
48 HeaderValue::from_str(&format!("Bearer {}", &api_token)).unwrap(),
49 );
50 }
51 GlobalUser::OAuthTokenAuth {
52 oauth_token,
53 refresh_token: _,
54 expiration_time: _,
55 } => {
56 headers.insert(
57 "Authorization",
58 HeaderValue::from_str(&format!("Bearer {}", &oauth_token)).unwrap(),
59 );
60 }
61 GlobalUser::GlobalKeyAuth { email, api_key } => {
62 headers.insert("X-Auth-Email", HeaderValue::from_str(email).unwrap());
63 headers.insert("X-Auth-Key", HeaderValue::from_str(api_key).unwrap());
64 }
65 }
66}