@@ -25,10 +25,11 @@ use crate::{
25
25
create_radon_script_from_filters_and_reducer, execute_radon_script, unpack_radon_script,
26
26
RadonScriptExecutionSettings ,
27
27
} ,
28
- types:: { array:: RadonArray , bytes:: RadonBytes , string:: RadonString , RadonTypes } ,
28
+ types:: { array:: RadonArray , bytes:: RadonBytes , string:: RadonString , map :: RadonMap , RadonTypes } ,
29
29
user_agents:: UserAgent ,
30
30
} ;
31
31
use core:: convert:: From ;
32
+ use std:: collections:: BTreeMap ;
32
33
use witnet_net:: client:: http:: { WitnetHttpBody , WitnetHttpRequest } ;
33
34
34
35
pub mod conditions;
@@ -173,6 +174,25 @@ fn string_response_with_data_report(
173
174
execute_radon_script ( input, & radon_script, context, settings)
174
175
}
175
176
177
+ /// Handle HTTP-HEAD response with data, and return a `RadonReport`.
178
+ fn headers_response_with_data_report (
179
+ retrieve : & RADRetrieve ,
180
+ response : & str ,
181
+ context : & mut ReportContext < RadonTypes > ,
182
+ settings : RadonScriptExecutionSettings ,
183
+ ) -> Result < RadonReport < RadonTypes > > {
184
+ let headers: BTreeMap < String , RadonTypes > = response. split ( "\r \n " ) . map ( |line| {
185
+ let parts: Vec < & str > = line. split ( ":" ) . map ( |part| part. trim ( ) ) . collect ( ) ;
186
+ // todo: check there are two parts, and two parts only
187
+ // todo: make sure that values from repeated keys get appended within a RadonArray
188
+ ( String :: from ( parts[ 0 ] ) , RadonTypes :: from ( RadonString :: from ( parts[ 1 ] ) ) )
189
+ } ) . collect ( ) ;
190
+ let input = RadonTypes :: from ( RadonMap :: from ( headers) ) ;
191
+ let radon_script = unpack_radon_script ( & retrieve. script ) ?;
192
+
193
+ execute_radon_script ( input, & radon_script, context, settings)
194
+ }
195
+
176
196
/// Handle Rng response with data report
177
197
fn rng_response_with_data_report (
178
198
response : & str ,
@@ -196,7 +216,10 @@ pub fn run_retrieval_with_data_report(
196
216
RADType :: Rng => rng_response_with_data_report ( response, context) ,
197
217
RADType :: HttpPost => {
198
218
string_response_with_data_report ( retrieve, response, context, settings)
199
- }
219
+ } ,
220
+ RADType :: HttpHead => {
221
+ headers_response_with_data_report ( retrieve, response, context, settings)
222
+ } ,
200
223
_ => Err ( RadError :: UnknownRetrieval ) ,
201
224
}
202
225
}
@@ -214,7 +237,7 @@ pub fn run_retrieval_with_data(
214
237
. map ( RadonReport :: into_inner)
215
238
}
216
239
217
- /// Handle generic HTTP (GET/POST) response
240
+ /// Handle generic HTTP (GET/POST/HEAD ) response
218
241
async fn http_response (
219
242
retrieve : & RADRetrieve ,
220
243
context : & mut ReportContext < RadonTypes > ,
@@ -258,7 +281,11 @@ async fn http_response(
258
281
builder. method ( "POST" ) . uri ( & retrieve. url ) ,
259
282
WitnetHttpBody :: from ( retrieve. body . clone ( ) ) ,
260
283
)
261
- }
284
+ } ,
285
+ RADType :: HttpHead => (
286
+ builder. method ( "HEAD" ) . uri ( & retrieve. url ) ,
287
+ WitnetHttpBody :: empty ( ) ,
288
+ ) ,
262
289
_ => panic ! (
263
290
"Called http_response with invalid retrieval kind {:?}" ,
264
291
retrieve. kind
@@ -357,6 +384,7 @@ pub async fn run_retrieval_report(
357
384
RADType :: HttpGet => http_response ( retrieve, context, settings, client) . await ,
358
385
RADType :: Rng => rng_response ( context, settings) . await ,
359
386
RADType :: HttpPost => http_response ( retrieve, context, settings, client) . await ,
387
+ RADType :: HttpHead => http_response ( retrieve, context, settings, client) . await ,
360
388
_ => Err ( RadError :: UnknownRetrieval ) ,
361
389
}
362
390
}
0 commit comments