Skip to content

Commit 72f64fb

Browse files
committed
Extractor::get_all default and HeaderExtractor implementations
1 parent 8882c31 commit 72f64fb

File tree

2 files changed

+72
-0
lines changed
  • opentelemetry/src/propagation
  • opentelemetry-http/src

2 files changed

+72
-0
lines changed

opentelemetry-http/src/lib.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,21 @@ impl Extractor for HeaderExtractor<'_> {
4343
.map(|value| value.as_str())
4444
.collect::<Vec<_>>()
4545
}
46+
47+
/// Get all the values for a key from the HeaderMap
48+
fn get_all(&self, key: &str) -> Option<Vec<&str>> {
49+
if !self.0.contains_key(key) {
50+
return None;
51+
}
52+
53+
Some(
54+
self.0
55+
.get_all(key)
56+
.iter()
57+
.filter_map(|value| value.to_str().ok())
58+
.collect(),
59+
)
60+
}
4661
}
4762

4863
pub type HttpError = Box<dyn std::error::Error + Send + Sync + 'static>;
@@ -236,6 +251,8 @@ impl<T> ResponseExt for Response<T> {
236251

237252
#[cfg(test)]
238253
mod tests {
254+
use http::HeaderValue;
255+
239256
use super::*;
240257

241258
#[test]
@@ -250,6 +267,32 @@ mod tests {
250267
)
251268
}
252269

270+
#[test]
271+
fn http_headers_get_all() {
272+
let mut carrier = http::HeaderMap::new();
273+
carrier.append("headerName", HeaderValue::from_static("value"));
274+
carrier.append("headerName", HeaderValue::from_static("value2"));
275+
carrier.append("headerName", HeaderValue::from_static("value3"));
276+
277+
assert_eq!(
278+
HeaderExtractor(&carrier).get_all("HEADERNAME"),
279+
Some(vec!["value", "value2", "value3"]),
280+
"all values from a key extraction"
281+
)
282+
}
283+
284+
#[test]
285+
fn http_headers_get_all_missing_key() {
286+
let mut carrier = http::HeaderMap::new();
287+
carrier.append("headerName", HeaderValue::from_static("value"));
288+
289+
assert_eq!(
290+
HeaderExtractor(&carrier).get_all("not_existing"),
291+
None,
292+
"all values from a missing key extraction"
293+
)
294+
}
295+
253296
#[test]
254297
fn http_headers_keys() {
255298
let mut carrier = http::HeaderMap::new();

opentelemetry/src/propagation/mod.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ pub trait Extractor {
4040

4141
/// Collect all the keys from the underlying data.
4242
fn keys(&self) -> Vec<&str>;
43+
44+
/// Get all values from a key from the underlying data.
45+
fn get_all(&self, key: &str) -> Option<Vec<&str>> {
46+
self.get(key).map(|value| vec![value])
47+
}
4348
}
4449

4550
impl<S: std::hash::BuildHasher> Injector for HashMap<String, String, S> {
@@ -77,6 +82,30 @@ mod tests {
7782
);
7883
}
7984

85+
#[test]
86+
fn hash_map_get_all() {
87+
let mut carrier = HashMap::new();
88+
carrier.set("headerName", "value".to_string());
89+
90+
assert_eq!(
91+
Extractor::get_all(&carrier, "HEADERNAME"),
92+
Some(vec!["value"]),
93+
"case insensitive get_all extraction"
94+
);
95+
}
96+
97+
#[test]
98+
fn hash_map_get_all_missing_key() {
99+
let mut carrier = HashMap::new();
100+
carrier.set("headerName", "value".to_string());
101+
102+
assert_eq!(
103+
Extractor::get_all(&carrier, "missing_key"),
104+
None,
105+
"case insensitive get_all extraction"
106+
);
107+
}
108+
80109
#[test]
81110
fn hash_map_keys() {
82111
let mut carrier = HashMap::new();

0 commit comments

Comments
 (0)