aleph_alpha_api/
http.rs

1use super::error::ApiError;
2use reqwest::header::{HeaderMap, HeaderValue};
3use reqwest::{header, Client, ClientBuilder, Error, StatusCode};
4
5pub fn create_client(api_token: &str) -> Result<Client, Error> {
6    let mut headers = HeaderMap::new();
7
8    let mut auth_value = HeaderValue::from_str(&format!("Bearer {api_token}")).unwrap();
9    // Consider marking security-sensitive headers with `set_sensitive`.
10    auth_value.set_sensitive(true);
11    headers.insert(header::AUTHORIZATION, auth_value);
12
13    Ok(ClientBuilder::new().default_headers(headers).build()?)
14}
15
16pub async fn translate_http_error(
17    response: reqwest::Response,
18) -> Result<reqwest::Response, ApiError> {
19    let status = response.status();
20    if !status.is_success() {
21        // Store body in a variable, so we can use it, even if it is not an Error emitted by
22        // the API, but an intermediate Proxy like NGinx, so we can still forward the error
23        // message.
24        let body = response.text().await?;
25        let translated_error = match status {
26            StatusCode::TOO_MANY_REQUESTS => ApiError::TooManyRequests,
27            StatusCode::SERVICE_UNAVAILABLE => ApiError::Busy,
28            _ => ApiError::Http {
29                status: status.as_u16(),
30                body,
31            },
32        };
33        Err(translated_error)
34    } else {
35        Ok(response)
36    }
37}
38
39pub async fn get(
40    client: &reqwest::Client,
41    base_url: &str,
42    path: &str,
43    query: Option<Vec<(String, String)>>,
44) -> Result<reqwest::Response, ApiError> {
45    let url = format!("{base_url}{path}");
46    let mut request = client.get(url);
47    println!("{:?}", request);
48    if let Some(q) = query {
49        request = request.query(&q);
50    }
51    let response = request.send().await?;
52    println!("response: {:?}", response);
53    translate_http_error(response).await
54}
55
56pub async fn delete(
57    client: &reqwest::Client,
58    base_url: &str,
59    path: &str,
60) -> Result<reqwest::Response, ApiError> {
61    let url = format!("{base_url}{path}");
62    let response = client.delete(url).send().await?;
63    translate_http_error(response).await
64}