@@ -25,10 +25,11 @@ use crate::{
2525 create_radon_script_from_filters_and_reducer, execute_radon_script, unpack_radon_script,
2626 RadonScriptExecutionSettings ,
2727 } ,
28- types:: { array:: RadonArray , bytes:: RadonBytes , string:: RadonString , RadonTypes } ,
28+ types:: { array:: RadonArray , bytes:: RadonBytes , string:: RadonString , map :: RadonMap , RadonTypes } ,
2929 user_agents:: UserAgent ,
3030} ;
3131use core:: convert:: From ;
32+ use std:: collections:: BTreeMap ;
3233use witnet_net:: client:: http:: { WitnetHttpBody , WitnetHttpRequest } ;
3334
3435pub mod conditions;
@@ -173,6 +174,25 @@ fn string_response_with_data_report(
173174 execute_radon_script ( input, & radon_script, context, settings)
174175}
175176
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+
176196/// Handle Rng response with data report
177197fn rng_response_with_data_report (
178198 response : & str ,
@@ -196,7 +216,10 @@ pub fn run_retrieval_with_data_report(
196216 RADType :: Rng => rng_response_with_data_report ( response, context) ,
197217 RADType :: HttpPost => {
198218 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+ } ,
200223 _ => Err ( RadError :: UnknownRetrieval ) ,
201224 }
202225}
@@ -214,7 +237,7 @@ pub fn run_retrieval_with_data(
214237 . map ( RadonReport :: into_inner)
215238}
216239
217- /// Handle generic HTTP (GET/POST) response
240+ /// Handle generic HTTP (GET/POST/HEAD ) response
218241async fn http_response (
219242 retrieve : & RADRetrieve ,
220243 context : & mut ReportContext < RadonTypes > ,
@@ -258,7 +281,11 @@ async fn http_response(
258281 builder. method ( "POST" ) . uri ( & retrieve. url ) ,
259282 WitnetHttpBody :: from ( retrieve. body . clone ( ) ) ,
260283 )
261- }
284+ } ,
285+ RADType :: HttpHead => (
286+ builder. method ( "HEAD" ) . uri ( & retrieve. url ) ,
287+ WitnetHttpBody :: empty ( ) ,
288+ ) ,
262289 _ => panic ! (
263290 "Called http_response with invalid retrieval kind {:?}" ,
264291 retrieve. kind
@@ -357,6 +384,7 @@ pub async fn run_retrieval_report(
357384 RADType :: HttpGet => http_response ( retrieve, context, settings, client) . await ,
358385 RADType :: Rng => rng_response ( context, settings) . await ,
359386 RADType :: HttpPost => http_response ( retrieve, context, settings, client) . await ,
387+ RADType :: HttpHead => http_response ( retrieve, context, settings, client) . await ,
360388 _ => Err ( RadError :: UnknownRetrieval ) ,
361389 }
362390}
0 commit comments