Skip to content

Commit 270b207

Browse files
committed
fix
1 parent a5662a6 commit 270b207

File tree

1 file changed

+36
-0
lines changed

1 file changed

+36
-0
lines changed

opentelemetry-http/src/lib.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,16 @@ 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+
let all_iter = self.0.get_all(key).iter();
50+
if let (0, Some(0)) = all_iter.size_hint() {
51+
return None;
52+
}
53+
54+
Some(all_iter.filter_map(|value| value.to_str().ok()).collect())
55+
}
4656
}
4757

4858
pub type HttpError = Box<dyn std::error::Error + Send + Sync + 'static>;
@@ -242,6 +252,7 @@ impl<T> ResponseExt for Response<T> {
242252
#[cfg(test)]
243253
mod tests {
244254
use super::*;
255+
use http::HeaderValue;
245256

246257
#[test]
247258
fn http_headers_get() {
@@ -254,6 +265,31 @@ mod tests {
254265
"case insensitive extraction"
255266
)
256267
}
268+
#[test]
269+
fn http_headers_get_all() {
270+
let mut carrier = http::HeaderMap::new();
271+
carrier.append("headerName", HeaderValue::from_static("value"));
272+
carrier.append("headerName", HeaderValue::from_static("value2"));
273+
carrier.append("headerName", HeaderValue::from_static("value3"));
274+
275+
assert_eq!(
276+
HeaderExtractor(&carrier).get_all("HEADERNAME"),
277+
Some(vec!["value", "value2", "value3"]),
278+
"all values from a key extraction"
279+
)
280+
}
281+
282+
#[test]
283+
fn http_headers_get_all_missing_key() {
284+
let mut carrier = http::HeaderMap::new();
285+
carrier.append("headerName", HeaderValue::from_static("value"));
286+
287+
assert_eq!(
288+
HeaderExtractor(&carrier).get_all("not_existing"),
289+
None,
290+
"all values from a missing key extraction"
291+
)
292+
}
257293

258294
#[test]
259295
fn http_headers_keys() {

0 commit comments

Comments
 (0)