Skip to content

Commit f101cd4

Browse files
committed
standardize
1 parent 4351dc6 commit f101cd4

File tree

2 files changed

+50
-5
lines changed

2 files changed

+50
-5
lines changed

src/headers/constants.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,9 @@ pub const RETRY_AFTER: HeaderName = HeaderName::from_lowercase_str("retry-after"
137137
/// The `Server` Header
138138
pub const SERVER: HeaderName = HeaderName::from_lowercase_str("server");
139139

140+
/// The `Server` Header
141+
pub const SERVER_TIMING: HeaderName = HeaderName::from_lowercase_str("server-timing");
142+
140143
/// The `Te` Header
141144
pub const TE: HeaderName = HeaderName::from_lowercase_str("te");
142145

src/trace/server_timing/mod.rs

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@ pub use entry::Entry;
77
use parse::parse_header;
88

99
use std::convert::AsMut;
10+
use std::fmt::Write;
1011
use std::iter::Iterator;
12+
use std::option;
1113
use std::slice;
1214

13-
use crate::headers::HeaderValue;
14-
use crate::Headers;
15+
use crate::headers::{HeaderName, HeaderValue, Headers, ToHeaderValues, SERVER_TIMING};
1516

1617
/// Metrics and descriptions for the given request-response cycle.
1718
///
@@ -29,10 +30,11 @@ impl ServerTiming {
2930
pub fn new() -> Self {
3031
Self { timings: vec![] }
3132
}
33+
3234
/// Create a new instance from headers.
3335
pub fn from_headers(headers: impl AsRef<Headers>) -> crate::Result<Self> {
3436
let mut timings = vec![];
35-
let values = headers.as_ref().get("server-timing");
37+
let values = headers.as_ref().get(SERVER_TIMING);
3638
for value in values.iter().map(|h| h.iter()).flatten() {
3739
parse_header(value.as_str(), &mut timings)?;
3840
}
@@ -43,8 +45,26 @@ impl ServerTiming {
4345
pub fn apply(&self, mut headers: impl AsMut<Headers>) {
4446
for timing in &self.timings {
4547
let value: HeaderValue = timing.clone().into();
46-
headers.as_mut().insert("server-timing", value);
48+
headers.as_mut().insert(SERVER_TIMING, value);
49+
}
50+
}
51+
52+
/// Get the `HeaderName`.
53+
pub fn name(&self) -> HeaderName {
54+
SERVER_TIMING
55+
}
56+
57+
/// Get the `HeaderValue`.
58+
pub fn value(&self) -> HeaderValue {
59+
let mut output = String::new();
60+
for (n, timing) in self.timings.iter().enumerate() {
61+
let timing: HeaderValue = timing.into();
62+
match n {
63+
1 => write!(output, "{}", timing),
64+
_ => write!(output, ", {}", timing),
65+
};
4766
}
67+
output.as_ref().into()
4868
}
4969

5070
/// Push an entry into the list of entries.
@@ -88,7 +108,7 @@ impl<'a> IntoIterator for &'a ServerTiming {
88108
type Item = &'a Entry;
89109
type IntoIter = Iter<'a>;
90110

91-
#[inline]
111+
// #[inline]serv
92112
fn into_iter(self) -> Self::IntoIter {
93113
self.iter()
94114
}
@@ -161,6 +181,14 @@ impl<'a> Iterator for IterMut<'a> {
161181
}
162182
}
163183

184+
impl ToHeaderValues for ServerTiming {
185+
type Iter = option::IntoIter<HeaderValue>;
186+
fn to_header_values(&self) -> crate::Result<Self::Iter> {
187+
// A HeaderValue will always convert into itself.
188+
Ok(self.value().to_header_values().unwrap())
189+
}
190+
}
191+
164192
#[cfg(test)]
165193
mod test {
166194
use super::*;
@@ -179,4 +207,18 @@ mod test {
179207
assert_eq!(entry.name(), "server");
180208
Ok(())
181209
}
210+
211+
#[test]
212+
fn to_header_values() {
213+
let mut timings = ServerTiming::new();
214+
timings.push(Entry::new("server".to_owned(), None, None)?);
215+
216+
let mut headers = Headers::new();
217+
timings.apply(&mut headers);
218+
219+
let timings = ServerTiming::from_headers(headers)?;
220+
let entry = timings.iter().next().unwrap();
221+
assert_eq!(entry.name(), "server");
222+
Ok(())
223+
}
182224
}

0 commit comments

Comments
 (0)