Skip to content

Commit 2456b81

Browse files
committed
avoid unwrap in typed-header-encode
also make it easier to use typed headers in SetRequest/Response layers, while still preserving unique encodes per call
1 parent 03de5a7 commit 2456b81

File tree

19 files changed

+119
-65
lines changed

19 files changed

+119
-65
lines changed

examples/http_mitm_proxy_boring.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ use rama::{
6262
client::EasyHttpWebClient,
6363
conn::TargetHttpVersion,
6464
headers::{
65-
HeaderEncode, HeaderMapExt as _, SecWebSocketExtensions, TypedHeader,
65+
HeaderMapExt as _, SecWebSocketExtensions, TypedHeader as _,
6666
sec_websocket_extensions::Extension,
6767
},
6868
io::upgrade,
@@ -432,10 +432,8 @@ where
432432
}) {
433433
tracing::debug!("use deflate ext for ingress ws cfg: {accept_pmd_cfg:?}");
434434
ingress_socket_cfg.per_message_deflate = Some((&accept_pmd_cfg).into());
435-
let _ = response_parts.headers.insert(
436-
SecWebSocketExtensions::name(),
437-
SecWebSocketExtensions::per_message_deflate_with_config(accept_pmd_cfg)
438-
.encode_to_value(),
435+
response_parts.headers.typed_insert(
436+
SecWebSocketExtensions::per_message_deflate_with_config(accept_pmd_cfg),
439437
);
440438
} else {
441439
tracing::debug!(

examples/http_web_router.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use rama::{
3131
extensions::ExtensionsRef,
3232
http::{
3333
Request,
34-
headers::{HeaderEncode, TypedHeader, exotic::XClacksOverhead},
34+
headers::exotic::XClacksOverhead,
3535
layer::set_header::SetResponseHeaderLayer,
3636
layer::{match_redirect::UriMatchRedirectLayer, trace::TraceLayer},
3737
matcher::UriParams,
@@ -113,9 +113,7 @@ async fn main() {
113113

114114
let middlewares = (
115115
TraceLayer::new_for_http(),
116-
SetResponseHeaderLayer::if_not_present_fn(XClacksOverhead::name().clone(), || {
117-
std::future::ready(XClacksOverhead::new().encode_to_value())
118-
}),
116+
SetResponseHeaderLayer::if_not_present_typed(XClacksOverhead::new()),
119117
UriMatchRedirectLayer::permanent([
120118
UriMatchReplaceRule::try_new("*/v1/*", "$1/v2/$2").unwrap(), // upgrade users as-is to v2 (backwards compatible)
121119
// this is now a new endpoint,

rama-cli/src/cmd/serve/fp/mod.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ use rama::{
1111
HeaderName, HeaderValue, Request,
1212
header::COOKIE,
1313
headers::{
14-
Cookie, HeaderEncode, HeaderMapExt, SecWebSocketProtocol, TypedHeader,
15-
all_client_hint_header_name_strings,
14+
Cookie, HeaderMapExt, SecWebSocketProtocol, all_client_hint_header_name_strings,
1615
exotic::XClacksOverhead,
1716
forwarded::{CFConnectingIp, ClientIp, TrueClientIp, XClientIp, XRealIp},
1817
sec_websocket_extensions,
@@ -172,9 +171,7 @@ pub async fn run(graceful: ShutdownGuard, cfg: CliCommandFingerprint) -> Result<
172171
TraceLayer::new_for_http(),
173172
CompressionLayer::new(),
174173
CatchPanicLayer::new(),
175-
SetResponseHeaderLayer::if_not_present_fn(XClacksOverhead::name().clone(), || {
176-
std::future::ready(XClacksOverhead::new().encode_to_value())
177-
}),
174+
SetResponseHeaderLayer::if_not_present_typed(XClacksOverhead::new()),
178175
AddRequiredResponseHeadersLayer::default(),
179176
SetResponseHeaderLayer::overriding(
180177
HeaderName::from_static("x-sponsored-by"),

rama-http-headers/src/header.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
use rama_core::telemetry::tracing;
21
use rama_http_types::{HeaderName, HeaderValue};
32

43
use std::error;
@@ -48,13 +47,12 @@ pub trait HeaderEncode: TypedHeader {
4847
fn encode<E: Extend<HeaderValue>>(&self, values: &mut E);
4948

5049
/// Encode this header to [`HeaderValue`].
51-
fn encode_to_value(&self) -> HeaderValue {
50+
///
51+
/// [`None`] is returned in case no header was encoded.
52+
fn encode_to_value(&self) -> Option<HeaderValue> {
5253
let mut container = ExtendOnce(None);
5354
self.encode(&mut container);
54-
container.0.unwrap_or_else(|| {
55-
tracing::warn!("failed to get an encoded HeaderValue; default to empty");
56-
HeaderValue::from_static("")
57-
})
55+
container.0
5856
}
5957
}
6058

@@ -65,7 +63,7 @@ impl<H: HeaderEncode> HeaderEncode for &H {
6563
}
6664

6765
#[inline]
68-
fn encode_to_value(&self) -> HeaderValue {
66+
fn encode_to_value(&self) -> Option<HeaderValue> {
6967
(*self).encode_to_value()
7068
}
7169
}
@@ -77,7 +75,7 @@ impl<H: HeaderEncode> HeaderEncode for Arc<H> {
7775
}
7876

7977
#[inline]
80-
fn encode_to_value(&self) -> HeaderValue {
78+
fn encode_to_value(&self) -> Option<HeaderValue> {
8179
self.as_ref().encode_to_value()
8280
}
8381
}

rama-http-headers/src/req_builder_ext.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,11 @@ impl HttpRequestBuilderExt for request::Builder {
1616
where
1717
H: HeaderEncode,
1818
{
19-
self.header(H::name(), header.encode_to_value())
19+
if let Some(value) = header.encode_to_value() {
20+
self.header(H::name(), value)
21+
} else {
22+
self
23+
}
2024
}
2125
}
2226

rama-http-headers/src/resp_builder_ext.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,11 @@ impl HttpResponseBuilderExt for response::Builder {
1616
where
1717
H: HeaderEncode,
1818
{
19-
self.header(H::name(), header.encode_to_value())
19+
if let Some(value) = header.encode_to_value() {
20+
self.header(H::name(), value)
21+
} else {
22+
self
23+
}
2024
}
2125
}
2226

rama-http-headers/src/x_robots_tag/header.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ mod tests {
137137
"BadBot: noindex, nofollow, googlebot: nofollow",
138138
),
139139
] {
140-
let value = header_value.encode_to_value();
140+
let value = header_value.encode_to_value().unwrap();
141141
let s = value.to_str().unwrap();
142142
assert_eq!(expected, s);
143143
}

rama-http/src/convert/curl.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -194,8 +194,9 @@ fn write_curl_command_for_request_parts(
194194
.or_else(|| parts.extensions().get())
195195
{
196196
writer.write_tuple("-x", proxy_addr, true);
197-
if let Some(ProxyCredential::Bearer(bearer)) = &proxy_addr.credential {
198-
let value = ProxyAuthorization(bearer.clone()).encode_to_value();
197+
if let Some(ProxyCredential::Bearer(bearer)) = &proxy_addr.credential
198+
&& let Some(value) = ProxyAuthorization(bearer.clone()).encode_to_value()
199+
{
199200
let s_value = String::from_utf8_lossy(value.as_bytes());
200201
writer.write_header(
201202
Http1HeaderName::from(crate::header::PROXY_AUTHORIZATION),

rama-http/src/layer/har/spec.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,8 @@ impl Response {
536536
let redirect_url = parts
537537
.headers
538538
.typed_get::<Location>()
539-
.and_then(|h| h.encode_to_value().to_str().ok().map(ToOwned::to_owned));
539+
.and_then(|h| h.encode_to_value())
540+
.and_then(|v| v.to_str().ok().map(ToOwned::to_owned));
540541

541542
let cookies = parts
542543
.headers

rama-http/src/layer/set_header/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,5 @@ pub use self::{
1010
request::{SetRequestHeader, SetRequestHeaderLayer},
1111
response::{SetResponseHeader, SetResponseHeaderLayer},
1212
};
13+
14+
pub mod utils;

0 commit comments

Comments
 (0)