mirror of
https://github.com/denoland/deno.git
synced 2024-11-28 16:20:57 -05:00
perf(http): avoid per header alloc (#14051)
This commit is contained in:
parent
1414dc503b
commit
45ef3c91c2
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());
|
builder.headers_mut().unwrap().reserve(headers.len());
|
||||||
for (key, value) in &headers {
|
for (key, value) in &headers {
|
||||||
match &*key.to_ascii_lowercase() {
|
if key.eq_ignore_ascii_case(b"cache-control") {
|
||||||
b"cache-control" => {
|
if let Ok(value) = std::str::from_utf8(value) {
|
||||||
if let Ok(value) = std::str::from_utf8(value) {
|
if let Some(cache_control) = CacheControl::from_value(value) {
|
||||||
if let Some(cache_control) = CacheControl::from_value(value) {
|
// We skip compression if the cache-control header value is set to
|
||||||
// We skip compression if the cache-control header value is set to
|
// "no-transform"
|
||||||
// "no-transform"
|
if cache_control.no_transform {
|
||||||
if cache_control.no_transform {
|
headers_allow_compression = false;
|
||||||
headers_allow_compression = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
headers_allow_compression = false;
|
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
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
|
|
||||||
headers_allow_compression = false;
|
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 store the values of ETag and Vary and skip adding them for now, as
|
||||||
// we may need to modify or change.
|
// we may need to modify or change.
|
||||||
b"etag" => {
|
etag_header = Some(value);
|
||||||
if !value.is_empty() {
|
continue;
|
||||||
etag_header = Some(value);
|
} else if key.eq_ignore_ascii_case(b"vary") && !value.is_empty() {
|
||||||
continue;
|
vary_header = Some(value);
|
||||||
}
|
continue;
|
||||||
}
|
|
||||||
b"vary" => {
|
|
||||||
if !value.is_empty() {
|
|
||||||
vary_header = Some(value);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
}
|
}
|
||||||
builder = builder.header(key.as_ref(), value.as_ref());
|
builder = builder.header(key.as_ref(), value.as_ref());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue