Skip to content

Commit 5100f4e

Browse files
Implement get_all function to return non-folding set-cookie headers (#597)
* Add `get_all` function. (#423) * Implement get_all using wasm-bindgen * Refactor Headers get_all method and improve error handling - Update HeadersExt trait to return js_sys::Array directly - Modify Headers::get_all to handle potential invalid values - Adjust import order in ext.rs for consistency * Included in glue module along with other modules
1 parent ca61ce5 commit 5100f4e

File tree

3 files changed

+39
-0
lines changed

3 files changed

+39
-0
lines changed

worker-sys/src/ext.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
mod abort_controller;
22
mod cache_storage;
3+
mod headers;
34
mod request;
45
mod response;
56
mod response_init;
67
mod websocket;
78

89
pub use abort_controller::*;
910
pub use cache_storage::*;
11+
pub use headers::HeadersExt;
1012
pub use request::*;
1113
pub use response::*;
1214
pub use response_init::*;

worker-sys/src/ext/headers.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
use wasm_bindgen::prelude::*;
2+
3+
mod glue {
4+
use super::*;
5+
6+
#[wasm_bindgen]
7+
extern "C" {
8+
#[wasm_bindgen(extends = js_sys::Object)]
9+
pub type Headers;
10+
11+
#[wasm_bindgen(method, js_name = getAll)]
12+
pub fn get_all(this: &Headers, name: &str) -> js_sys::Array;
13+
}
14+
}
15+
16+
pub trait HeadersExt {
17+
fn get_all(&self, name: &str) -> js_sys::Array;
18+
}
19+
20+
impl HeadersExt for web_sys::Headers {
21+
fn get_all(&self, name: &str) -> js_sys::Array {
22+
self.unchecked_ref::<glue::Headers>().get_all(name)
23+
}
24+
}

worker/src/headers.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use std::{
99
use http::{header::HeaderName, HeaderMap, HeaderValue};
1010
use js_sys::Array;
1111
use wasm_bindgen::JsValue;
12+
use worker_sys::ext::HeadersExt;
1213

1314
/// A [Headers](https://developer.mozilla.org/en-US/docs/Web/API/Headers) representation used in
1415
/// Request and Response objects.
@@ -90,6 +91,18 @@ impl Headers {
9091
// The values iterator.next() will always return a proper value containing a string
9192
.map(|a| a.unwrap().as_string().unwrap())
9293
}
94+
95+
/// Returns all the values of a header within a `Headers` object with a given name.
96+
pub fn get_all(&self, name: &str) -> Result<Vec<String>> {
97+
let array = self.0.get_all(name);
98+
array
99+
.iter()
100+
.map(|v| {
101+
v.as_string()
102+
.ok_or_else(|| Error::JsError("Invalid header value".into()))
103+
})
104+
.collect()
105+
}
93106
}
94107

95108
impl Default for Headers {

0 commit comments

Comments
 (0)