@@ -43,6 +43,21 @@ impl Extractor for HeaderExtractor<'_> {
4343 . map ( |value| value. as_str ( ) )
4444 . collect :: < Vec < _ > > ( )
4545 }
46+
47+ /// Get all the values for a key from the HeaderMap
48+ fn get_all ( & self , key : & str ) -> Option < Vec < & str > > {
49+ if !self . 0 . contains_key ( key) {
50+ return None ;
51+ }
52+
53+ Some (
54+ self . 0
55+ . get_all ( key)
56+ . iter ( )
57+ . filter_map ( |value| value. to_str ( ) . ok ( ) )
58+ . collect ( ) ,
59+ )
60+ }
4661}
4762
4863pub type HttpError = Box < dyn std:: error:: Error + Send + Sync + ' static > ;
@@ -236,6 +251,8 @@ impl<T> ResponseExt for Response<T> {
236251
237252#[ cfg( test) ]
238253mod tests {
254+ use http:: HeaderValue ;
255+
239256 use super :: * ;
240257
241258 #[ test]
@@ -250,6 +267,32 @@ mod tests {
250267 )
251268 }
252269
270+ #[ test]
271+ fn http_headers_get_all ( ) {
272+ let mut carrier = http:: HeaderMap :: new ( ) ;
273+ carrier. append ( "headerName" , HeaderValue :: from_static ( "value" ) ) ;
274+ carrier. append ( "headerName" , HeaderValue :: from_static ( "value2" ) ) ;
275+ carrier. append ( "headerName" , HeaderValue :: from_static ( "value3" ) ) ;
276+
277+ assert_eq ! (
278+ HeaderExtractor ( & carrier) . get_all( "HEADERNAME" ) ,
279+ Some ( vec![ "value" , "value2" , "value3" ] ) ,
280+ "all values from a key extraction"
281+ )
282+ }
283+
284+ #[ test]
285+ fn http_headers_get_all_missing_key ( ) {
286+ let mut carrier = http:: HeaderMap :: new ( ) ;
287+ carrier. append ( "headerName" , HeaderValue :: from_static ( "value" ) ) ;
288+
289+ assert_eq ! (
290+ HeaderExtractor ( & carrier) . get_all( "not_existing" ) ,
291+ None ,
292+ "all values from a missing key extraction"
293+ )
294+ }
295+
253296 #[ test]
254297 fn http_headers_keys ( ) {
255298 let mut carrier = http:: HeaderMap :: new ( ) ;
0 commit comments