use bun_picohttp as picohttp;
pub mod api {
pub use bun_http_types::ETag::StringPointer;
}
pub use bun_http_types::Method::HeaderName;
pub use bun_http_types::ETag::{HeaderEntry as Entry, HeaderEntryList as EntryList, Headers};
pub trait HeadersExt {
fn from_pico_http_headers(headers: &[picohttp::Header]) -> Headers;
}
impl HeadersExt for Headers {
fn from_pico_http_headers(headers: &[picohttp::Header]) -> Headers {
let header_count = headers.len();
let mut result = Headers {
entries: EntryList::default(),
buf: Vec::new(),
};
let mut buf_len: usize = 0;
for header in headers {
buf_len += header.name().len() + header.value().len();
}
result
.entries
.ensure_total_capacity(header_count)
.expect("OOM"); result.buf.reserve_exact(buf_len);
for header in headers {
let name = header.name();
let value = header.value();
let name_offset = result.buf.len() as u32;
result.buf.extend_from_slice(name);
let value_offset = result.buf.len() as u32;
result.buf.extend_from_slice(value);
result.entries.append_assume_capacity(Entry {
name: api::StringPointer {
offset: name_offset,
length: name.len() as u32,
},
value: api::StringPointer {
offset: value_offset,
length: value.len() as u32,
},
});
}
result
}
}
#[inline]
pub fn append_etag(bytes: &[u8], headers: &mut Headers) {
let _ = bun_http_types::ETag::append_to_headers(bytes, headers);
}