mirror of
https://github.com/denoland/deno.git
synced 2024-11-30 16:40:57 -05:00
perf(http): avoid per header alloc (#14051)
This commit is contained in:
parent
fc8aa5ad8b
commit
f896666455
1 changed files with 24 additions and 38 deletions
|
@ -517,50 +517,36 @@ async fn op_http_write_headers(
|
|||
|
||||
builder.headers_mut().unwrap().reserve(headers.len());
|
||||
for (key, value) in &headers {
|
||||
match &*key.to_ascii_lowercase() {
|
||||
b"cache-control" => {
|
||||
if let Ok(value) = std::str::from_utf8(value) {
|
||||
if let Some(cache_control) = CacheControl::from_value(value) {
|
||||
// We skip compression if the cache-control header value is set to
|
||||
// "no-transform"
|
||||
if cache_control.no_transform {
|
||||
headers_allow_compression = false;
|
||||
}
|
||||
if key.eq_ignore_ascii_case(b"cache-control") {
|
||||
if let Ok(value) = std::str::from_utf8(value) {
|
||||
if let Some(cache_control) = CacheControl::from_value(value) {
|
||||
// We skip compression if the cache-control header value is set to
|
||||
// "no-transform"
|
||||
if cache_control.no_transform {
|
||||
headers_allow_compression = false;
|
||||
}
|
||||
} else {
|
||||
headers_allow_compression = false;
|
||||
}
|
||||
}
|
||||
b"content-range" => {
|
||||
// we skip compression if the `content-range` header value is set, as it
|
||||
// indicates the contents of the body were negotiated based directly
|
||||
// with the user code and we can't compress the response
|
||||
headers_allow_compression = false;
|
||||
}
|
||||
b"content-type" => {
|
||||
if !value.is_empty() {
|
||||
content_type_header = Some(value);
|
||||
}
|
||||
}
|
||||
b"content-encoding" => {
|
||||
// we don't compress if a content-encoding header was provided
|
||||
} else {
|
||||
headers_allow_compression = false;
|
||||
}
|
||||
} else if key.eq_ignore_ascii_case(b"content-range") {
|
||||
// we skip compression if the `content-range` header value is set, as it
|
||||
// indicates the contents of the body were negotiated based directly
|
||||
// with the user code and we can't compress the response
|
||||
headers_allow_compression = false;
|
||||
} else if key.eq_ignore_ascii_case(b"content-type") && !value.is_empty() {
|
||||
content_type_header = Some(value);
|
||||
} else if key.eq_ignore_ascii_case(b"content-encoding") {
|
||||
// we don't compress if a content-encoding header was provided
|
||||
headers_allow_compression = false;
|
||||
} else if key.eq_ignore_ascii_case(b"etag") && !value.is_empty() {
|
||||
// we store the values of ETag and Vary and skip adding them for now, as
|
||||
// we may need to modify or change.
|
||||
b"etag" => {
|
||||
if !value.is_empty() {
|
||||
etag_header = Some(value);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
b"vary" => {
|
||||
if !value.is_empty() {
|
||||
vary_header = Some(value);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
etag_header = Some(value);
|
||||
continue;
|
||||
} else if key.eq_ignore_ascii_case(b"vary") && !value.is_empty() {
|
||||
vary_header = Some(value);
|
||||
continue;
|
||||
}
|
||||
builder = builder.header(key.as_ref(), value.as_ref());
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue