diff --git a/worker-sys/src/ext.rs b/worker-sys/src/ext.rs index d75484231..2e68d5f37 100644 --- a/worker-sys/src/ext.rs +++ b/worker-sys/src/ext.rs @@ -1,5 +1,6 @@ mod abort_controller; mod cache_storage; +mod headers; mod request; mod response; mod response_init; @@ -7,6 +8,7 @@ mod websocket; pub use abort_controller::*; pub use cache_storage::*; +pub use headers::HeadersExt; pub use request::*; pub use response::*; pub use response_init::*; diff --git a/worker-sys/src/ext/headers.rs b/worker-sys/src/ext/headers.rs new file mode 100644 index 000000000..c4bc55ab7 --- /dev/null +++ b/worker-sys/src/ext/headers.rs @@ -0,0 +1,24 @@ +use wasm_bindgen::prelude::*; + +mod glue { + use super::*; + + #[wasm_bindgen] + extern "C" { + #[wasm_bindgen(extends = js_sys::Object)] + pub type Headers; + + #[wasm_bindgen(method, js_name = getAll)] + pub fn get_all(this: &Headers, name: &str) -> js_sys::Array; + } +} + +pub trait HeadersExt { + fn get_all(&self, name: &str) -> js_sys::Array; +} + +impl HeadersExt for web_sys::Headers { + fn get_all(&self, name: &str) -> js_sys::Array { + self.unchecked_ref::().get_all(name) + } +} diff --git a/worker/src/headers.rs b/worker/src/headers.rs index e2c2bbdbf..7cd977327 100644 --- a/worker/src/headers.rs +++ b/worker/src/headers.rs @@ -9,6 +9,7 @@ use std::{ use http::{header::HeaderName, HeaderMap, HeaderValue}; use js_sys::Array; use wasm_bindgen::JsValue; +use worker_sys::ext::HeadersExt; /// A [Headers](https://developer.mozilla.org/en-US/docs/Web/API/Headers) representation used in /// Request and Response objects. @@ -90,6 +91,18 @@ impl Headers { // The values iterator.next() will always return a proper value containing a string .map(|a| a.unwrap().as_string().unwrap()) } + + /// Returns all the values of a header within a `Headers` object with a given name. + pub fn get_all(&self, name: &str) -> Result> { + let array = self.0.get_all(name); + array + .iter() + .map(|v| { + v.as_string() + .ok_or_else(|| Error::JsError("Invalid header value".into())) + }) + .collect() + } } impl Default for Headers {