Skip to content

Commit 722c99c

Browse files
committed
feat: Add ability to apply custom headers to requests
1 parent dc69bd0 commit 722c99c

1 file changed

Lines changed: 29 additions & 10 deletions

File tree

src/client.rs

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use bytes::Bytes;
22
use freedom_config::Config;
3-
use reqwest::{Response, StatusCode};
3+
use reqwest::{RequestBuilder, Response, StatusCode};
44
use url::Url;
55

66
use crate::api::{Api, Inner, Value};
@@ -13,6 +13,7 @@ use crate::api::{Api, Inner, Value};
1313
pub struct Client {
1414
pub(crate) config: Config,
1515
pub(crate) client: reqwest::Client,
16+
universal_headers: Vec<(String, String)>,
1617
}
1718

1819
impl PartialEq for Client {
@@ -42,6 +43,7 @@ impl Client {
4243
Self {
4344
config,
4445
client: reqwest::Client::new(),
46+
universal_headers: Vec::new(),
4547
}
4648
}
4749

@@ -56,6 +58,23 @@ impl Client {
5658
let config = Config::from_env()?;
5759
Ok(Self::from_config(config))
5860
}
61+
62+
/// Adds a universal header key and value to all GET POST, and DELETEs made with the client
63+
pub fn with_universal_header(
64+
mut self,
65+
key: impl Into<String>,
66+
value: impl Into<String>,
67+
) -> Self {
68+
self.universal_headers.push((key.into(), value.into()));
69+
self
70+
}
71+
72+
fn append_headers(&self, mut req: RequestBuilder) -> RequestBuilder {
73+
for (header, value) in self.universal_headers.iter() {
74+
req = req.header(header, value);
75+
}
76+
req
77+
}
5978
}
6079

6180
impl Api for Client {
@@ -64,9 +83,9 @@ impl Api for Client {
6483
async fn get(&self, url: Url) -> Result<(Bytes, StatusCode), crate::error::Error> {
6584
tracing::trace!("GET to {}", url);
6685

67-
let resp = self
68-
.client
69-
.get(url.clone())
86+
let req = self.append_headers(self.client.get(url.clone()));
87+
88+
let resp = req
7089
.basic_auth(self.config.key(), Some(&self.config.expose_secret()))
7190
.send()
7291
.await?;
@@ -84,9 +103,9 @@ impl Api for Client {
84103
async fn delete(&self, url: Url) -> Result<Response, crate::error::Error> {
85104
tracing::trace!("DELETE to {}", url);
86105

87-
self.client
88-
.delete(url.clone())
89-
.basic_auth(self.config.key(), Some(self.config.expose_secret()))
106+
let req = self.append_headers(self.client.delete(url.clone()));
107+
108+
req.basic_auth(self.config.key(), Some(self.config.expose_secret()))
90109
.send()
91110
.await
92111
.inspect_err(|error| tracing::warn!(%error, %url, "Failed to DELETE"))
@@ -100,9 +119,9 @@ impl Api for Client {
100119
{
101120
tracing::trace!("POST to {}", url);
102121

103-
self.client
104-
.post(url.clone())
105-
.basic_auth(self.config.key(), Some(self.config.expose_secret()))
122+
let req = self.append_headers(self.client.post(url.clone()));
123+
124+
req.basic_auth(self.config.key(), Some(self.config.expose_secret()))
106125
.json(&msg)
107126
.send()
108127
.await

0 commit comments

Comments
 (0)