From df857aa3f86ffeb750030a4881368f6d81bc48dd Mon Sep 17 00:00:00 2001 From: Konstantin Stepanov Date: Sun, 11 Jan 2015 02:19:29 +0300 Subject: [PATCH] add referer header definition --- src/header/common/mod.rs | 5 +++++ src/header/common/referer.rs | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 src/header/common/referer.rs diff --git a/src/header/common/mod.rs b/src/header/common/mod.rs index ed684f84..b01c8232 100644 --- a/src/header/common/mod.rs +++ b/src/header/common/mod.rs @@ -28,6 +28,7 @@ pub use self::user_agent::UserAgent; pub use self::vary::Vary; pub use self::server::Server; pub use self::set_cookie::SetCookie; +pub use self::referer::Referer; macro_rules! bench_header( ($name:ident, $ty:ty, $value:expr) => { @@ -144,3 +145,7 @@ pub mod user_agent; /// Exposes the Vary header. pub mod vary; + +/// Exposes the Referer header +pub mod referer; + diff --git a/src/header/common/referer.rs b/src/header/common/referer.rs new file mode 100644 index 00000000..f3ef197e --- /dev/null +++ b/src/header/common/referer.rs @@ -0,0 +1,35 @@ +use header::{Header, HeaderFormat}; +use std::fmt::{self, Show}; +use header::shared::util::from_one_raw_str; + +/// The `Referer` header. +/// +/// The Referer header is used by user agents to inform server about +/// the page URL user has came from. +/// +/// See alse [RFC 1945, section 10.13](http://tools.ietf.org/html/rfc1945#section-10.13). +/// +/// Currently just a string, but maybe better replace it with url::Url or something like it. +#[derive(Clone, PartialEq, Show)] +pub struct Referer(pub String); + +deref!(Referer => String); + +impl Header for Referer { + fn header_name(_: Option) -> &'static str { + "Referer" + } + + fn parse_header(raw: &[Vec]) -> Option { + from_one_raw_str(raw).map(|s| Referer(s)) + } +} + +impl HeaderFormat for Referer { + fn fmt_header(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + let Referer(ref value) = *self; + value.fmt(fmt) + } +} + +bench_header!(bench, Referer, { vec![b"http://foo.com/hello:3000".to_vec()] });