@@ -43,6 +43,16 @@ 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+ let all_iter = self . 0 . get_all ( key) . iter ( ) ;
50+ if let ( 0 , Some ( 0 ) ) = all_iter. size_hint ( ) {
51+ return None ;
52+ }
53+
54+ Some ( all_iter. filter_map ( |value| value. to_str ( ) . ok ( ) ) . collect ( ) )
55+ }
4656}
4757
4858pub type HttpError = Box < dyn std:: error:: Error + Send + Sync + ' static > ;
@@ -242,6 +252,7 @@ impl<T> ResponseExt for Response<T> {
242252#[ cfg( test) ]
243253mod tests {
244254 use super :: * ;
255+ use http:: HeaderValue ;
245256
246257 #[ test]
247258 fn http_headers_get ( ) {
@@ -254,6 +265,31 @@ mod tests {
254265 "case insensitive extraction"
255266 )
256267 }
268+ #[ test]
269+ fn http_headers_get_all ( ) {
270+ let mut carrier = http:: HeaderMap :: new ( ) ;
271+ carrier. append ( "headerName" , HeaderValue :: from_static ( "value" ) ) ;
272+ carrier. append ( "headerName" , HeaderValue :: from_static ( "value2" ) ) ;
273+ carrier. append ( "headerName" , HeaderValue :: from_static ( "value3" ) ) ;
274+
275+ assert_eq ! (
276+ HeaderExtractor ( & carrier) . get_all( "HEADERNAME" ) ,
277+ Some ( vec![ "value" , "value2" , "value3" ] ) ,
278+ "all values from a key extraction"
279+ )
280+ }
281+
282+ #[ test]
283+ fn http_headers_get_all_missing_key ( ) {
284+ let mut carrier = http:: HeaderMap :: new ( ) ;
285+ carrier. append ( "headerName" , HeaderValue :: from_static ( "value" ) ) ;
286+
287+ assert_eq ! (
288+ HeaderExtractor ( & carrier) . get_all( "not_existing" ) ,
289+ None ,
290+ "all values from a missing key extraction"
291+ )
292+ }
257293
258294 #[ test]
259295 fn http_headers_keys ( ) {
0 commit comments