67
67
}
68
68
69
69
/// Make a get request and parse into JSON
70
- pub async fn get_json < T : DeserializeOwned > ( & self , endpoint : & str ) -> Result < T , C :: Error > {
71
- C :: get_json ( self . get ( endpoint) ) . await
70
+ pub async fn get_json < T : DeserializeOwned > (
71
+ & self ,
72
+ endpoint : & str ,
73
+ interval : Option < u64 > ,
74
+ ) -> Result < T , C :: Error > {
75
+ let mut request = self . get ( endpoint) ;
76
+ if let Some ( interval) = interval {
77
+ request = C :: header (
78
+ request,
79
+ & C :: build_header ( "unleash-interval" ) ?,
80
+ & interval. to_string ( ) ,
81
+ ) ;
82
+ }
83
+ C :: get_json ( request) . await
72
84
}
73
85
74
86
/// Perform a POST. Returns errors per HttpClient::post.
83
95
& self ,
84
96
endpoint : & str ,
85
97
content : T ,
98
+ interval : Option < u64 > ,
86
99
) -> Result < bool , C :: Error > {
87
- C :: post_json ( self . post ( endpoint) , & content) . await
100
+ let mut request = self . post ( endpoint) ;
101
+ if let Some ( interval) = interval {
102
+ request = C :: header (
103
+ request,
104
+ & C :: build_header ( "unleash-interval" ) ?,
105
+ & interval. to_string ( ) ,
106
+ ) ;
107
+ }
108
+ C :: post_json ( request, & content) . await
88
109
}
89
110
90
111
fn attach_headers ( & self , request : C :: RequestBuilder ) -> C :: RequestBuilder {
@@ -114,11 +135,14 @@ mod tests {
114
135
use super :: * ;
115
136
use async_trait:: async_trait;
116
137
use regex:: Regex ;
138
+ use serde_json:: json;
139
+ use std:: collections:: HashMap ;
140
+ use std:: sync:: { Arc , RwLock } ;
117
141
use uuid:: Uuid ;
118
142
119
143
#[ derive( Clone , Default ) ]
120
144
struct MockHttpClient {
121
- headers : std :: collections :: HashMap < String , String > ,
145
+ headers : Arc < RwLock < HashMap < String , String > > > ,
122
146
}
123
147
124
148
#[ async_trait]
@@ -131,8 +155,10 @@ mod tests {
131
155
Ok ( name. to_string ( ) )
132
156
}
133
157
134
- fn header ( mut builder : Self , key : & Self :: HeaderName , value : & str ) -> Self :: RequestBuilder {
135
- builder. headers . insert ( key. clone ( ) , value. to_string ( ) ) ;
158
+ fn header ( builder : Self , key : & Self :: HeaderName , value : & str ) -> Self :: RequestBuilder {
159
+ if let Ok ( mut headers) = builder. headers . write ( ) {
160
+ headers. insert ( key. clone ( ) , value. to_string ( ) ) ;
161
+ }
136
162
builder
137
163
}
138
164
@@ -147,14 +173,14 @@ mod tests {
147
173
async fn get_json < T : DeserializeOwned > (
148
174
_req : Self :: RequestBuilder ,
149
175
) -> Result < T , Self :: Error > {
150
- unimplemented ! ( )
176
+ Ok ( serde_json :: from_value ( json ! ( { } ) ) . unwrap ( ) )
151
177
}
152
178
153
179
async fn post_json < T : Serialize + Sync > (
154
180
_req : Self :: RequestBuilder ,
155
181
_content : & T ,
156
182
) -> Result < bool , Self :: Error > {
157
- unimplemented ! ( )
183
+ Ok ( true )
158
184
}
159
185
}
160
186
@@ -168,41 +194,29 @@ mod tests {
168
194
)
169
195
. unwrap ( ) ;
170
196
171
- let request_builder = http_client. client . post ( "http://example.com" ) ;
172
- let request_with_headers = http_client. attach_headers ( request_builder) ;
197
+ let _ = http_client
198
+ . get_json :: < serde_json:: Value > ( "http://example.com" , Some ( 15 ) )
199
+ . await ;
200
+ let headers = & http_client. client . headers . read ( ) . unwrap ( ) ;
173
201
202
+ assert_eq ! ( headers. get( "unleash-appname" ) . unwrap( ) , "my_app" ) ;
203
+ assert_eq ! ( headers. get( "instance_id" ) . unwrap( ) , "my_instance_id" ) ;
174
204
assert_eq ! (
175
- request_with_headers. headers. get( "unleash-appname" ) . unwrap( ) ,
176
- "my_app"
177
- ) ;
178
- assert_eq ! (
179
- request_with_headers. headers. get( "instance_id" ) . unwrap( ) ,
180
- "my_instance_id"
181
- ) ;
182
- assert_eq ! (
183
- request_with_headers
184
- . headers
185
- . get( "unleash-connection-id" )
186
- . unwrap( ) ,
205
+ headers. get( "unleash-connection-id" ) . unwrap( ) ,
187
206
"d512f8ec-d972-40a5-9a30-a0a6e85d93ac"
188
207
) ;
189
- assert_eq ! (
190
- request_with_headers. headers. get( "authorization" ) . unwrap( ) ,
191
- "auth_token"
192
- ) ;
208
+ assert_eq ! ( headers. get( "unleash-interval" ) . unwrap( ) , "15" ) ;
209
+ assert_eq ! ( headers. get( "authorization" ) . unwrap( ) , "auth_token" ) ;
193
210
194
211
let version_regex = Regex :: new ( r"^unleash-client-rust:\d+\.\d+\.\d+$" ) . unwrap ( ) ;
195
- let sdk_version = request_with_headers . headers . get ( "unleash-sdk" ) . unwrap ( ) ;
212
+ let sdk_version = headers. get ( "unleash-sdk" ) . unwrap ( ) ;
196
213
assert ! (
197
214
version_regex. is_match( sdk_version) ,
198
215
"Version output did not match expected format: {}" ,
199
216
sdk_version
200
217
) ;
201
218
202
- let connection_id = request_with_headers
203
- . headers
204
- . get ( "unleash-connection-id" )
205
- . unwrap ( ) ;
219
+ let connection_id = headers. get ( "unleash-connection-id" ) . unwrap ( ) ;
206
220
assert ! (
207
221
Uuid :: parse_str( connection_id) . is_ok( ) ,
208
222
"Connection ID is not a valid UUID"
0 commit comments