Skip to content

Commit 1e57366

Browse files
committed
Support URL-encoded values for OTEL_EXPORTER_OTLP_HEADERS
1 parent ab9415a commit 1e57366

File tree

5 files changed

+30
-7
lines changed

5 files changed

+30
-7
lines changed

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,4 @@ tracing = { version = "0.1", default-features = false }
6666
tracing-core = { version = "0.1", default-features = false }
6767
tracing-subscriber = { version = "0.3", default-features = false }
6868
url = { version = "2.2", default-features = false }
69+
urlencoding = { version = "2.1.3" }

opentelemetry-otlp/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ reqwest = { workspace = true, optional = true }
4242
http = { workspace = true, optional = true }
4343
serde = { workspace = true, features = ["derive"], optional = true }
4444
thiserror = { workspace = true }
45+
urlencoding = { workspace = true }
4546

4647
[dev-dependencies]
4748
tokio-stream = { workspace = true, features = ["net"] }

opentelemetry-otlp/src/exporter/http/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ fn add_header_from_string(input: &str, headers: &mut HashMap<HeaderName, HeaderV
310310
headers.extend(parse_header_string(input).filter_map(|(key, value)| {
311311
Some((
312312
HeaderName::from_str(key).ok()?,
313-
HeaderValue::from_str(value).ok()?,
313+
HeaderValue::from_str(&value).ok()?,
314314
))
315315
}));
316316
}

opentelemetry-otlp/src/exporter/mod.rs

+26-5
Original file line numberDiff line numberDiff line change
@@ -211,18 +211,25 @@ impl<B: HasExportConfig> WithExportConfig for B {
211211
}
212212

213213
#[cfg(any(feature = "grpc-tonic", feature = "http-proto"))]
214-
fn parse_header_string(value: &str) -> impl Iterator<Item = (&str, &str)> {
214+
fn parse_header_string(value: &str) -> impl Iterator<Item = (&str, String)> {
215215
value
216216
.split_terminator(',')
217217
.map(str::trim)
218218
.filter_map(parse_header_key_value_string)
219219
}
220220

221221
#[cfg(any(feature = "grpc-tonic", feature = "http-proto"))]
222-
fn parse_header_key_value_string(key_value_string: &str) -> Option<(&str, &str)> {
222+
fn parse_header_key_value_string(key_value_string: &str) -> Option<(&str, String)> {
223223
key_value_string
224224
.split_once('=')
225-
.map(|(key, value)| (key.trim(), value.trim()))
225+
.map(|(key, value)| {
226+
(
227+
key.trim(),
228+
urlencoding::decode(value.trim())
229+
.unwrap_or_default()
230+
.into_owned(),
231+
)
232+
})
226233
.filter(|(key, value)| !key.is_empty() && !value.is_empty())
227234
}
228235

@@ -280,7 +287,10 @@ mod tests {
280287
for (input_str, expected_headers) in test_cases {
281288
assert_eq!(
282289
super::parse_header_string(input_str).collect::<Vec<_>>(),
283-
expected_headers,
290+
expected_headers
291+
.into_iter()
292+
.map(|(k, v)| (k, v.to_string()))
293+
.collect::<Vec<_>>(),
284294
)
285295
}
286296
}
@@ -290,6 +300,14 @@ mod tests {
290300
let test_cases = vec![
291301
// Format: (input_str, expected_header)
292302
("k1=v1", Some(("k1", "v1"))),
303+
(
304+
"Authentication=Basic AAA",
305+
Some(("Authentication", "Basic AAA")),
306+
),
307+
(
308+
"Authentication=Basic%20AAA",
309+
Some(("Authentication", "Basic AAA")),
310+
),
293311
("", None),
294312
("=v1", None),
295313
("k1=", None),
@@ -298,7 +316,10 @@ mod tests {
298316
for (input_str, expected_headers) in test_cases {
299317
assert_eq!(
300318
super::parse_header_key_value_string(input_str),
301-
expected_headers,
319+
match expected_headers {
320+
Some((k, v)) => Some((k, v.to_string())),
321+
None => None,
322+
}
302323
)
303324
}
304325
}

opentelemetry-otlp/src/exporter/tonic/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,7 @@ fn parse_headers_from_env(signal_headers_var: &str) -> HeaderMap {
381381
.filter_map(|(key, value)| {
382382
Some((
383383
HeaderName::from_str(key).ok()?,
384-
HeaderValue::from_str(value).ok()?,
384+
HeaderValue::from_str(&value).ok()?,
385385
))
386386
})
387387
.collect::<HeaderMap>()

0 commit comments

Comments
 (0)