Skip to content

Commit b0ccc7b

Browse files
committed
Make fields.get return an option
1 parent 03a14ac commit b0ccc7b

4 files changed

Lines changed: 21 additions & 12 deletions

File tree

crates/test-programs/src/bin/api_proxy.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,15 @@ impl bindings::exports::wasi::http::incoming_handler::Guest for T {
2424
let req_hdrs = request.headers();
2525

2626
assert!(
27-
req_hdrs.get(&header).is_empty(),
27+
req_hdrs.get(&header).is_none(),
2828
"forbidden `custom-forbidden-header` found in request"
2929
);
3030

3131
assert!(req_hdrs.delete(&header).is_err());
3232
assert!(req_hdrs.append(&header, &b"no".to_vec()).is_err());
3333

3434
assert!(
35-
req_hdrs.get(&header).is_empty(),
35+
req_hdrs.get(&header).is_none(),
3636
"append of forbidden header succeeded"
3737
);
3838

crates/wasi-http/src/types_impl.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -144,19 +144,24 @@ impl<T: WasiHttpView> crate::bindings::http::types::HostFields for T {
144144
&mut self,
145145
fields: Resource<HostFields>,
146146
name: String,
147-
) -> wasmtime::Result<Vec<Vec<u8>>> {
147+
) -> wasmtime::Result<Option<Vec<Vec<u8>>>> {
148+
let fields = get_fields(self.table(), &fields).context("[fields_get] getting fields")?;
149+
148150
let header = match hyper::header::HeaderName::from_bytes(name.as_bytes()) {
149151
Ok(header) => header,
150-
Err(_) => return Ok(vec![]),
152+
Err(_) => return Ok(None),
151153
};
152154

153-
let res = get_fields(self.table(), &fields)
154-
.context("[fields_get] getting fields")?
155-
.get_all(header)
155+
if !fields.contains_key(&header) {
156+
return Ok(None);
157+
}
158+
159+
let res = fields
160+
.get_all(&header)
156161
.into_iter()
157162
.map(|val| val.as_bytes().to_owned())
158163
.collect();
159-
Ok(res)
164+
Ok(Some(res))
160165
}
161166

162167
fn set(

crates/wasi-http/wit/deps/http/types.wit

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,10 @@ interface types {
169169
entries: list<tuple<field-key,field-value>>
170170
) -> result<fields, header-error>;
171171

172-
/// Get all of the values corresponding to a key.
173-
get: func(name: field-key) -> list<field-value>;
172+
/// Get all of the values corresponding to a key. Returns a `none` value
173+
/// when the key isn't present, to distinguish from the case where it's
174+
/// present but empty.
175+
get: func(name: field-key) -> option<list<field-value>>;
174176

175177
/// Set all of the values for a key. Clears any existing values for that
176178
/// key, if they have been set.

crates/wasi/wit/deps/http/types.wit

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,10 @@ interface types {
169169
entries: list<tuple<field-key,field-value>>
170170
) -> result<fields, header-error>;
171171

172-
/// Get all of the values corresponding to a key.
173-
get: func(name: field-key) -> list<field-value>;
172+
/// Get all of the values corresponding to a key. Returns a `none` value
173+
/// when the key isn't present, to distinguish from the case where it's
174+
/// present but empty.
175+
get: func(name: field-key) -> option<list<field-value>>;
174176

175177
/// Set all of the values for a key. Clears any existing values for that
176178
/// key, if they have been set.

0 commit comments

Comments
 (0)