Skip to content

Commit 9cfe855

Browse files
authored
Support inclusion of headers in a request (#38)
1 parent 8fc913d commit 9cfe855

File tree

1 file changed

+45
-8
lines changed

1 file changed

+45
-8
lines changed

src/clients.rs

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::fmt;
22

3+
use axum::http::HeaderMap;
34
use reqwest::Url;
45
use serde::de::DeserializeOwned;
56
use tracing::{info, instrument};
@@ -15,35 +16,44 @@ pub struct TiledClient {
1516

1617
impl TiledClient {
1718
#[instrument(skip(self))]
18-
async fn request<T: DeserializeOwned>(&self, endpoint: &str) -> ClientResult<T> {
19+
async fn request<T: DeserializeOwned>(
20+
&self,
21+
endpoint: &str,
22+
headers: Option<HeaderMap>,
23+
) -> ClientResult<T> {
1924
info!("Requesting from tiled: {}", endpoint);
2025
let url = self.address.join(endpoint)?;
21-
let response = reqwest::get(url).await?.error_for_status()?;
26+
let client = reqwest::Client::new();
27+
let request = match headers {
28+
Some(headers) => client.get(url).headers(headers),
29+
None => client.get(url),
30+
};
31+
let response = request.send().await?.error_for_status()?;
2232
let body = response.text().await?;
2333
serde_json::from_str(&body).map_err(|e| ClientError::InvalidResponse(e, body))
2434
}
2535
pub async fn app_metadata(&self) -> ClientResult<app::AppMetadata> {
26-
self.request("/api/v1/").await
36+
self.request("/api/v1/", None).await
2737
}
2838
pub async fn run_metadata(&self, id: Uuid) -> ClientResult<run::RunMetadataRoot> {
29-
self.request(&format!("/api/v1/metadata/{id}")).await
39+
self.request(&format!("/api/v1/metadata/{id}"), None).await
3040
}
3141
pub async fn event_stream_metadata(
3242
&self,
3343
id: Uuid,
3444
stream: String,
3545
) -> ClientResult<event_stream::EventStreamMetadataRoot> {
36-
self.request(&format!("/api/v1/metadata/{id}/{stream}"))
46+
self.request(&format!("/api/v1/metadata/{id}/{stream}"), None)
3747
.await
3848
}
3949
pub async fn search_root(&self) -> ClientResult<run::RunRoot> {
40-
self.request("/api/v1/search/").await
50+
self.request("/api/v1/search/", None).await
4151
}
4252
pub async fn search_run_container(
4353
&self,
4454
id: Uuid,
4555
) -> ClientResult<event_stream::EventStreamRoot> {
46-
self.request(&format!("/api/v1/search/{id}")).await
56+
self.request(&format!("/api/v1/search/{id}"), None).await
4757
}
4858
}
4959

@@ -78,6 +88,7 @@ impl std::fmt::Display for ClientError {
7888

7989
#[cfg(test)]
8090
mod tests {
91+
use axum::http::HeaderMap;
8192
use httpmock::MockServer;
8293
use url::Url;
8394

@@ -96,7 +107,33 @@ mod tests {
96107
address: Url::parse(&server.base_url()).unwrap(),
97108
};
98109
assert_eq!(
99-
client.request::<Vec<u8>>("/demo/api").await.unwrap(),
110+
client.request::<Vec<u8>>("/demo/api", None).await.unwrap(),
111+
vec![1, 2, 3]
112+
);
113+
mock.assert();
114+
}
115+
#[tokio::test]
116+
async fn request_with_headers() {
117+
let server = MockServer::start();
118+
let mock = server
119+
.mock_async(|when, then| {
120+
when.method("GET")
121+
.path("/demo/api")
122+
.header("api-key", "foo");
123+
then.status(200).body("[1,2,3]");
124+
})
125+
.await;
126+
let client = TiledClient {
127+
address: Url::parse(&server.base_url()).unwrap(),
128+
};
129+
let mut headers = HeaderMap::new();
130+
headers.insert("api-key", "foo".parse().unwrap());
131+
132+
assert_eq!(
133+
client
134+
.request::<Vec<u8>>("/demo/api", Some(headers))
135+
.await
136+
.unwrap(),
100137
vec![1, 2, 3]
101138
);
102139
mock.assert();

0 commit comments

Comments
 (0)