Skip to content

Commit 9e1b5c9

Browse files
committed
http(p3): Add tests for forbidden field names
1 parent 310c04c commit 9e1b5c9

1 file changed

Lines changed: 62 additions & 0 deletions

File tree

tests/rust/wasm32-wasip3/src/bin/http-fields.rs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
333394
struct Component;
334395
export!(Component);
335396
impl 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

Comments
 (0)