diff --git a/src/header/common/location.rs b/src/header/common/location.rs new file mode 100644 index 00000000..6f185a44 --- /dev/null +++ b/src/header/common/location.rs @@ -0,0 +1,33 @@ +use header::Header; +use std::fmt::{mod, Show}; +use super::from_one_raw_str; + +/// The `Location` header. +/// +/// The Location response-header field is used to redirect the recipient to +/// a location other than the Request-URI for completion of the request or identification +/// of a new resource. For 201 (Created) responses, the Location is that of the new +/// resource which was created by the request. For 3xx responses, the location SHOULD +/// indicate the server's preferred URI for automatic redirection to the resource. +/// The field value consists of a single absolute URI. +/// +/// Currently is just a String, but it should probably become a better type, +/// like url::Url or something. +#[deriving(Clone, PartialEq, Show)] +pub struct Location(pub String); + +impl Header for Location { + fn header_name(_: Option) -> &'static str { + "Location" + } + + fn parse_header(raw: &[Vec]) -> Option { + from_one_raw_str(raw).map(|s| Location(s)) + } + + fn fmt_header(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + let Location(ref value) = *self; + value.fmt(fmt) + } +} + diff --git a/src/header/common/mod.rs b/src/header/common/mod.rs index bff73bc6..46dfd5db 100644 --- a/src/header/common/mod.rs +++ b/src/header/common/mod.rs @@ -15,6 +15,7 @@ pub use self::transfer_encoding::TransferEncoding; pub use self::user_agent::UserAgent; pub use self::server::Server; pub use self::date::Date; +pub use self::location::Location; use std::from_str::FromStr; use std::str::from_utf8; @@ -46,6 +47,9 @@ pub mod server; /// Exposes the Date header. pub mod date; +/// Exposes the Location header. +pub mod location; + fn from_one_raw_str(raw: &[Vec]) -> Option { if raw.len() != 1 { return None;