@@ -330,6 +330,67 @@ fn test_field_name_case_insensitivity() {
330330 ) ;
331331}
332332
333+ fn test_forbidden_field_name_cased ( name : & str ) {
334+ let fields = Fields :: new ( ) ;
335+ assert_eq ! (
336+ fields. set( name, & [ b"x" . to_vec( ) ] ) ,
337+ Err ( HeaderError :: Forbidden ) ,
338+ "set({name:?}) should be forbidden"
339+ ) ;
340+ assert_eq ! (
341+ fields. append( name, b"x" ) ,
342+ Err ( HeaderError :: Forbidden ) ,
343+ "append({name:?}) should be forbidden"
344+ ) ;
345+ assert_eq ! (
346+ Fields :: from_list( & [ ( name. to_string( ) , b"x" . to_vec( ) ) ] ) . unwrap_err( ) ,
347+ HeaderError :: Forbidden ,
348+ "from_list([{name:?}]) should be forbidden"
349+ ) ;
350+ assert ! (
351+ !fields. has( name) ,
352+ "forbidden field {name:?} must not be present"
353+ ) ;
354+ }
355+
356+ fn title_case ( name : & str ) -> String {
357+ name. split ( '-' )
358+ . map ( |seg| {
359+ let mut chars = seg. chars ( ) ;
360+ match chars. next ( ) {
361+ Some ( first) => first. to_uppercase ( ) . collect :: < String > ( ) + chars. as_str ( ) ,
362+ None => String :: new ( ) ,
363+ }
364+ } )
365+ . collect :: < Vec < _ > > ( )
366+ . join ( "-" )
367+ }
368+
369+ fn test_forbidden_field_name ( name : & str ) {
370+ // Field names are case insensitive for equality checking purposes.
371+ test_forbidden_field_name_cased ( name) ;
372+ test_forbidden_field_name_cased ( & name. to_uppercase ( ) ) ;
373+ test_forbidden_field_name_cased ( & title_case ( name) ) ;
374+ }
375+
376+ // The list of definitely forbidden field names is not in the spec yet.
377+ // See https://github.com/WebAssembly/WASI/issues/940
378+ fn test_forbidden_field_names ( ) {
379+ for name in [
380+ "connection" ,
381+ "keep-alive" ,
382+ "proxy-authenticate" ,
383+ "proxy-authorization" ,
384+ "proxy-connection" ,
385+ "transfer-encoding" ,
386+ "upgrade" ,
387+ "http2-settings" ,
388+ "host" ,
389+ ] {
390+ test_forbidden_field_name ( name) ;
391+ }
392+ }
393+
333394struct Component ;
334395export ! ( Component ) ;
335396impl Guest for Component {
@@ -341,6 +402,7 @@ impl Guest for Component {
341402 test_invalid_field_values ( ) ;
342403 test_valid_field_values ( ) ;
343404 test_field_name_case_insensitivity ( ) ;
405+ test_forbidden_field_names ( ) ;
344406 Ok ( ( ) )
345407 }
346408}
0 commit comments