11use std:: fmt;
22
3+ use axum:: http:: HeaderMap ;
34use reqwest:: Url ;
45use serde:: de:: DeserializeOwned ;
56use tracing:: { info, instrument} ;
@@ -15,35 +16,44 @@ pub struct TiledClient {
1516
1617impl 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) ]
8090mod 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