diff --git a/src/header/common/mod.rs b/src/header/common/mod.rs index 372460d53c..3b29ede602 100644 --- a/src/header/common/mod.rs +++ b/src/header/common/mod.rs @@ -23,6 +23,7 @@ pub use self::host::Host; pub use self::if_modified_since::IfModifiedSince; pub use self::last_modified::LastModified; pub use self::location::Location; +pub use self::pragma::Pragma; pub use self::referer::Referer; pub use self::server::Server; pub use self::set_cookie::SetCookie; @@ -157,6 +158,7 @@ mod host; mod last_modified; mod if_modified_since; mod location; +mod pragma; mod referer; mod server; mod set_cookie; @@ -164,4 +166,3 @@ mod transfer_encoding; mod upgrade; mod user_agent; mod vary; - diff --git a/src/header/common/pragma.rs b/src/header/common/pragma.rs new file mode 100644 index 0000000000..d9551d9202 --- /dev/null +++ b/src/header/common/pragma.rs @@ -0,0 +1,61 @@ +use std::fmt; +use std::ascii::AsciiExt; + +use header::{Header, HeaderFormat, parsing}; + +/// The `Pragma` header defined by HTTP/1.0. +/// +/// > The "Pragma" header field allows backwards compatibility with +/// > HTTP/1.0 caches, so that clients can specify a "no-cache" request +/// > that they will understand (as Cache-Control was not defined until +/// > HTTP/1.1). When the Cache-Control header field is also present and +/// > understood in a request, Pragma is ignored. + +/// > In HTTP/1.0, Pragma was defined as an extensible field for +/// > implementation-specified directives for recipients. This +/// > specification deprecates such extensions to improve interoperability. +/// +/// Spec: https://tools.ietf.org/html/rfc7234#section-5.4 +#[derive(Clone, PartialEq, Debug)] +pub enum Pragma { + /// Corresponds to the `no-cache` value. + NoCache, + /// Every value other than `no-cache`. + Ext(String), +} + +impl Header for Pragma { + fn header_name() -> &'static str { + "Pragma" + } + + fn parse_header(raw: &[Vec]) -> Option { + parsing::from_one_raw_str(raw).and_then(|s: String| { + let slice = &s.to_ascii_lowercase()[]; + match slice { + "" => None, + "no-cache" => Some(Pragma::NoCache), + _ => Some(Pragma::Ext(s)), + } + }) + } +} + +impl HeaderFormat for Pragma { + fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + Pragma::NoCache => write!(f, "no-cache"), + Pragma::Ext(ref string) => write!(f, "{}", string), + } + } +} + +#[test] +fn test_parse_header() { + let a: Pragma = Header::parse_header([b"no-cache".to_vec()].as_slice()).unwrap(); + let b = Pragma::NoCache; + assert_eq!(a, b); + let c: Pragma = Header::parse_header([b"FoObar".to_vec()].as_slice()).unwrap(); + let d = Pragma::Ext("FoObar".to_string()); + assert_eq!(c, d); +}