usesuper::{ETag, LastModified}; use util::{EntityTag, HttpDate}; use HeaderValue;
/// `If-Range` header, defined in [RFC7233](http://tools.ietf.org/html/rfc7233#section-3.2) /// /// If a client has a partial copy of a representation and wishes to have /// an up-to-date copy of the entire representation, it could use the /// Range header field with a conditional GET (using either or both of /// If-Unmodified-Since and If-Match.) However, if the precondition /// fails because the representation has been modified, the client would /// then have to make a second request to obtain the entire current /// representation. /// /// The `If-Range` header field allows a client to \"short-circuit\" the /// second request. Informally, its meaning is as follows: if the /// representation is unchanged, send me the part(s) that I am requesting /// in Range; otherwise, send me the entire representation. /// /// # ABNF /// /// ```text /// If-Range = entity-tag / HTTP-date /// ``` /// /// # Example values /// /// * `Sat, 29 Oct 1994 19:43:31 GMT` /// * `\"xyzzy\"` /// /// # Examples /// /// ``` /// # extern crate headers; /// use headers::IfRange; /// use std::time::{SystemTime, Duration}; /// /// let fetched = SystemTime::now() - Duration::from_secs(60 * 60 * 24); /// let if_range = IfRange::date(fetched); /// ``` #[derive(Clone, Debug, PartialEq)] pubstruct IfRange(IfRange_);
derive_header! {
IfRange(_),
name: IF_RANGE
}
impl IfRange { /// Create an `IfRange` header with an entity tag. pubfn etag(tag: ETag) -> IfRange {
IfRange(IfRange_::EntityTag(tag.0))
}
/// Create an `IfRange` header with a date value. pubfn date(time: SystemTime) -> IfRange {
IfRange(IfRange_::Date(time.into()))
}
/// Checks if the resource has been modified, or if the range request /// can be served. pubfn is_modified(&self, etag: Option<&ETag>, last_modified: Option<&LastModified>) -> bool { matchself.0 {
IfRange_::Date(since) => last_modified.map(|time| since < time.0).unwrap_or(true),
IfRange_::EntityTag(ref entity) => {
etag.map(|etag| !etag.0.strong_eq(entity)).unwrap_or(true)
}
}
}
}
#[derive(Clone, Debug, PartialEq)] enum IfRange_ { /// The entity-tag the client has of the resource
EntityTag(EntityTag), /// The date when the client retrieved the resource
Date(HttpDate),
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.