1 use std::time::SystemTime; 2 use util::HttpDate; 3 4 /// `If-Unmodified-Since` header, defined in 5 /// [RFC7232](http://tools.ietf.org/html/rfc7232#section-3.4) 6 /// 7 /// The `If-Unmodified-Since` header field makes the request method 8 /// conditional on the selected representation's last modification date 9 /// being earlier than or equal to the date provided in the field-value. 10 /// This field accomplishes the same purpose as If-Match for cases where 11 /// the user agent does not have an entity-tag for the representation. 12 /// 13 /// # ABNF 14 /// 15 /// ```text 16 /// If-Unmodified-Since = HTTP-date 17 /// ``` 18 /// 19 /// # Example values 20 /// 21 /// * `Sat, 29 Oct 1994 19:43:31 GMT` 22 /// 23 /// # Example 24 /// 25 /// ``` 26 /// # extern crate headers; 27 /// use headers::IfUnmodifiedSince; 28 /// use std::time::{SystemTime, Duration}; 29 /// 30 /// let time = SystemTime::now() - Duration::from_secs(60 * 60 * 24); 31 /// let if_unmod = IfUnmodifiedSince::from(time); 32 /// ``` 33 #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Header)] 34 pub struct IfUnmodifiedSince(HttpDate); 35 36 impl IfUnmodifiedSince { 37 /// Check if the supplied time passes the precondtion. precondition_passes(&self, last_modified: SystemTime) -> bool38 pub fn precondition_passes(&self, last_modified: SystemTime) -> bool { 39 self.0 >= last_modified.into() 40 } 41 } 42 43 impl From<SystemTime> for IfUnmodifiedSince { from(time: SystemTime) -> IfUnmodifiedSince44 fn from(time: SystemTime) -> IfUnmodifiedSince { 45 IfUnmodifiedSince(time.into()) 46 } 47 } 48 49 impl From<IfUnmodifiedSince> for SystemTime { from(date: IfUnmodifiedSince) -> SystemTime50 fn from(date: IfUnmodifiedSince) -> SystemTime { 51 date.0.into() 52 } 53 } 54 55 #[cfg(test)] 56 mod tests { 57 use std::time::Duration; 58 use super::*; 59 60 #[test] precondition_passes()61 fn precondition_passes() { 62 let newer = SystemTime::now(); 63 let exact = newer - Duration::from_secs(2); 64 let older = newer - Duration::from_secs(4); 65 66 let if_unmod = IfUnmodifiedSince::from(exact); 67 assert!(!if_unmod.precondition_passes(newer)); 68 assert!(if_unmod.precondition_passes(exact)); 69 assert!(if_unmod.precondition_passes(older)); 70 } 71 } 72