cas_lib/http/
mod.rs

1use reqwest::{Client, cookie::Jar};
2use std::sync::{Arc, Mutex};
3use url::Url;
4
5pub mod types;
6use crate::http::types::{BenchmarkRequest};
7
8static API_KEY: Mutex<String> = Mutex::new(String::new());
9static BASE_URL: Mutex<String> = Mutex::new(String::new());
10
11static TOKEN: Mutex<String> = Mutex::new(String::new());
12static REFRESH_TOKEN: Mutex<String> = Mutex::new(String::new());
13static BENCHMARK_SENDER_CLIENT: Mutex<Option<Client>> = Mutex::new(None);
14
15fn create_benchmark_sender_client(token: String, refresh_token: String) -> Client {
16    let cookie_store = Arc::new(Jar::default());
17    let base_url = Url::parse(BASE_URL.lock().unwrap().as_str()).unwrap();
18    cookie_store.add_cookie_str(&format!("Token={}; Path=/", token), &base_url);
19    cookie_store.add_cookie_str(&format!("RefreshToken={}; Path=/", refresh_token), &base_url);
20    Client::builder()
21        .cookie_provider(cookie_store)
22        .build()
23        .unwrap()
24}
25
26fn determine_api_route() -> String {
27    let base_url = BASE_URL.lock().unwrap();
28    if base_url.contains("cryptographicapiservices.com") {
29        "api/userapi".to_string()
30    } else {
31        "api".to_string()
32    }
33}
34
35pub async fn set_api_key_in_cache(api_key: String) {
36    let mut key = API_KEY.lock().unwrap();
37    *key = api_key.clone();
38    set_tokens_in_cache(api_key).await;
39}
40
41pub fn set_base_url_in_cache(base_url: String) {
42    let mut url = BASE_URL.lock().unwrap();
43    *url = base_url
44}
45
46pub async fn set_tokens_in_cache(api_key: String) {
47    let client = Client::new();
48    let base_url = BASE_URL.lock().unwrap().clone();
49    let url = format!("{}/{}/APIKey/GetToken", base_url, determine_api_route());
50    let response_task = client
51        .get(url)
52        .header("Authorization", api_key)
53        .send()
54        .await;
55    let response = response_task.unwrap().json::<types::AuthResponse>().await;
56    match response {
57        Ok(auth_response) => {
58            {
59                let mut token = TOKEN.lock().unwrap();
60                *token = auth_response.token.clone();
61            }
62            {
63                let mut refresh = REFRESH_TOKEN.lock().unwrap();
64                *refresh = auth_response.refresh_token.clone();
65            }
66            {
67                let mut bench_client = BENCHMARK_SENDER_CLIENT.lock().unwrap();
68                *bench_client = Some(create_benchmark_sender_client(
69                    auth_response.token,
70                    auth_response.refresh_token,
71                ));
72            }
73        }
74
75        Err(_) => {
76            *TOKEN.lock().unwrap() = String::new();
77            *REFRESH_TOKEN.lock().unwrap() = String::new();
78        }
79    }
80}
81
82pub async fn send_benchmark(time_in_milliseconds: i64, class_name: String, method_name: String) {
83    let payload = BenchmarkRequest {
84        class_name,
85        method_name,
86        time_in_milliseconds,
87    };
88    let base_url = BASE_URL.lock().unwrap().clone();
89    let client = BENCHMARK_SENDER_CLIENT.lock().unwrap().as_ref().unwrap().clone();
90    
91    let response = client
92        .post(format!("{}/{}/Benchmark", base_url, determine_api_route()))
93        .json(&payload)
94        .send()
95        .await;
96}