headers/common/
retry_after.rs1use std::time::{Duration, SystemTime};
2
3use util::{HttpDate, Seconds, TryFromValues};
4use HeaderValue;
5
6#[derive(Debug, Clone, PartialEq, Eq)]
28pub struct RetryAfter(After);
29
30derive_header! {
31 RetryAfter(_),
32 name: RETRY_AFTER
33}
34
35#[derive(Debug, Clone, PartialEq, Eq)]
36enum After {
37 DateTime(HttpDate),
39 Delay(Seconds),
41}
42
43impl RetryAfter {
44 pub fn date(time: SystemTime) -> RetryAfter {
46 RetryAfter(After::DateTime(time.into()))
47 }
48
49 pub fn delay(dur: Duration) -> RetryAfter {
51 RetryAfter(After::Delay(dur.into()))
52 }
53}
54
55impl TryFromValues for After {
56 fn try_from_values<'i, I>(values: &mut I) -> Result<Self, ::Error>
57 where
58 I: Iterator<Item = &'i HeaderValue>,
59 {
60 values
61 .next()
62 .and_then(|val| {
63 if let Some(delay) = Seconds::from_val(val) {
64 return Some(After::Delay(delay));
65 }
66
67 let date = HttpDate::from_val(val)?;
68 Some(After::DateTime(date))
69 })
70 .ok_or_else(::Error::invalid)
71 }
72}
73
74impl<'a> From<&'a After> for HeaderValue {
75 fn from(after: &'a After) -> HeaderValue {
76 match *after {
77 After::Delay(ref delay) => delay.into(),
78 After::DateTime(ref date) => date.into(),
79 }
80 }
81}
82
83#[cfg(test)]
84mod tests {
85 use super::super::test_decode;
86 use super::RetryAfter;
87 use std::time::Duration;
88 use util::HttpDate;
89
90 #[test]
91 fn delay_decode() {
92 let r: RetryAfter = test_decode(&["1234"]).unwrap();
93 assert_eq!(r, RetryAfter::delay(Duration::from_secs(1234)),);
94 }
95
96 macro_rules! test_retry_after_datetime {
97 ($name:ident, $s:expr) => {
98 #[test]
99 fn $name() {
100 let r: RetryAfter = test_decode(&[$s]).unwrap();
101 let dt = "Sun, 06 Nov 1994 08:49:37 GMT".parse::<HttpDate>().unwrap();
102
103 assert_eq!(r, RetryAfter(super::After::DateTime(dt)));
104 }
105 };
106 }
107
108 test_retry_after_datetime!(date_decode_rfc1123, "Sun, 06 Nov 1994 08:49:37 GMT");
109 test_retry_after_datetime!(date_decode_rfc850, "Sunday, 06-Nov-94 08:49:37 GMT");
110 test_retry_after_datetime!(date_decode_asctime, "Sun Nov 6 08:49:37 1994");
111}