Skip to content

Commit 485c017

Browse files
committed
feat: use FileIoAction
1 parent 0f59327 commit 485c017

File tree

1 file changed

+38
-32
lines changed

1 file changed

+38
-32
lines changed

compiler-cli/src/http.rs

+38-32
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@ use std::convert::TryInto;
22
use std::sync::OnceLock;
33

44
use async_trait::async_trait;
5-
use gleam_core::{Error, Result};
5+
use camino::Utf8PathBuf;
6+
use gleam_core::{
7+
error::{FileIoAction, FileKind},
8+
Error, Result,
9+
};
610
use http::{Request, Response};
11+
use reqwest::{Certificate, Client};
712

8-
static REQWEST_CLIENT: OnceLock<reqwest::Client> = OnceLock::new();
9-
static CERTS_ENV_VAR: &str = "GLEAM_CACERTS_PATH";
13+
static REQWEST_CLIENT: OnceLock<Client> = OnceLock::new();
1014

1115
#[derive(Debug)]
1216
pub struct HttpClient;
@@ -27,11 +31,8 @@ impl gleam_core::io::HttpClient for HttpClient {
2731
let request = request
2832
.try_into()
2933
.expect("Unable to convert HTTP request for use by reqwest library");
30-
let mut response = REQWEST_CLIENT
31-
.get_or_init(init_client)
32-
.execute(request)
33-
.await
34-
.map_err(Error::http)?;
34+
let client = init_client().map_err(Error::http)?;
35+
let mut response = client.execute(request).await.map_err(Error::http)?;
3536
let mut builder = Response::builder()
3637
.status(response.status())
3738
.version(response.version());
@@ -44,31 +45,36 @@ impl gleam_core::io::HttpClient for HttpClient {
4445
}
4546
}
4647

47-
fn init_client() -> reqwest::Client {
48-
if let Some(cert) = get_certificate() {
49-
return reqwest::Client::builder()
50-
.add_root_certificate(cert)
51-
.build()
52-
.expect("Unable to initialize a reqwest HTTP client");
53-
} else {
54-
return reqwest::Client::new();
48+
fn init_client() -> Result<&'static Client, Error> {
49+
if let Some(client) = REQWEST_CLIENT.get() {
50+
return Ok(client);
5551
}
56-
}
5752

58-
fn get_certificate() -> Option<reqwest::Certificate> {
59-
match std::env::var(CERTS_ENV_VAR) {
60-
Ok(certs_path) => {
61-
let data = std::fs::read(certs_path).expect(&format!(
62-
"Unable to read certs file set as `{}`",
63-
CERTS_ENV_VAR
64-
));
65-
let cert = reqwest::Certificate::from_pem(&data).expect(&format!(
66-
"Unable to construct a certificate from certs file set as `{}`",
67-
CERTS_ENV_VAR
68-
));
53+
let certificate_path = std::env::var("GLEAM_CACERTS_PATH").map_err(|error| Error::FileIo {
54+
kind: FileKind::Directory,
55+
action: FileIoAction::Read,
56+
path: Utf8PathBuf::new(),
57+
err: Some(error.to_string()),
58+
})?;
6959

70-
Some(cert)
71-
}
72-
_ => None,
73-
}
60+
let certificate_bytes = std::fs::read(&certificate_path).map_err(|error| Error::FileIo {
61+
kind: FileKind::File,
62+
action: FileIoAction::Parse,
63+
path: Utf8PathBuf::from(&certificate_path),
64+
err: Some(error.to_string()),
65+
})?;
66+
67+
let certificate = Certificate::from_pem(&certificate_bytes).map_err(|error| Error::FileIo {
68+
kind: FileKind::File,
69+
action: FileIoAction::Parse,
70+
path: Utf8PathBuf::from(&certificate_path),
71+
err: Some(error.to_string()),
72+
})?;
73+
74+
Ok(REQWEST_CLIENT.get_or_init(|| {
75+
Client::builder()
76+
.add_root_certificate(certificate)
77+
.build()
78+
.expect("Failed to create reqwest client")
79+
}))
7480
}

0 commit comments

Comments
 (0)