Skip to content

Commit

Permalink
Merge pull request hyperium#225 from pyfisch/accesscontrol
Browse files Browse the repository at this point in the history
Added AccessControl* family of headers.
  • Loading branch information
seanmonstar committed Jan 7, 2015
2 parents 3e892fb + c228a55 commit b45912d
Show file tree
Hide file tree
Showing 8 changed files with 194 additions and 0 deletions.
25 changes: 25 additions & 0 deletions src/header/common/access_control/allow_headers.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
use std::fmt::{self};

use header;
use header::shared;

#[derive(Clone)]
struct AccessControlAllowHeaders(pub Vec<String>);

impl header::Header for AccessControlAllowHeaders {
#[inline]
fn header_name(_: Option<AccessControlAllowHeaders>) -> &'static str {
"Access-Control-Allow-Headers"
}

fn parse_header(raw: &[Vec<u8>]) -> Option<AccessControlAllowHeaders> {
shared::from_comma_delimited(raw).map(AccessControlAllowHeaders)
}
}

impl header::HeaderFormat for AccessControlAllowHeaders {
fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
let AccessControlAllowHeaders(ref parts) = *self;
shared::fmt_comma_delimited(f, parts.as_slice())
}
}
26 changes: 26 additions & 0 deletions src/header/common/access_control/allow_methods.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
use std::fmt::{self};

use header;
use header::shared;
use method;

#[derive(Clone)]
struct AccessControlAllowMethods(pub Vec<method::Method>);

impl header::Header for AccessControlAllowMethods {
#[inline]
fn header_name(_: Option<AccessControlAllowMethods>) -> &'static str {
"Access-Control-Allow-Methods"
}

fn parse_header(raw: &[Vec<u8>]) -> Option<AccessControlAllowMethods> {
shared::from_comma_delimited(raw).map(AccessControlAllowMethods)
}
}

impl header::HeaderFormat for AccessControlAllowMethods {
fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
let AccessControlAllowMethods(ref parts) = *self;
shared::fmt_comma_delimited(f, parts.as_slice())
}
}
47 changes: 47 additions & 0 deletions src/header/common/access_control/allow_origin.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
extern crate url;

use std::fmt::{self};
use std::str;

use header;

#[derive(Clone)]
enum AccessControlAllowOrigin {
AllowStar,
AllowOrigin(url::Url),
}

impl header::Header for AccessControlAllowOrigin {
#[inline]
fn header_name(_: Option<AccessControlAllowOrigin>) -> &'static str {
"Access-Control-Allow-Origin"
}

fn parse_header(raw: &[Vec<u8>]) -> Option<AccessControlAllowOrigin> {
if raw.len() == 1 {
match str::from_utf8(unsafe { raw[].get_unchecked(0)[] }) {
Ok(s) => {
if s == "*" {
Some(AccessControlAllowOrigin::AllowStar)
} else {
url::Url::parse(s).ok().map(
|url| AccessControlAllowOrigin::AllowOrigin(url))
}
},
_ => return None,
}
} else {
return None;
}
}
}

impl header::HeaderFormat for AccessControlAllowOrigin {
fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
AccessControlAllowOrigin::AllowStar => write!(f, "*"),
AccessControlAllowOrigin::AllowOrigin(ref url) =>
write!(f, "{}", url)
}
}
}
25 changes: 25 additions & 0 deletions src/header/common/access_control/max_age.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
use std::fmt;

use header;
use header::shared;

#[derive(Clone)]
struct AccessControlMaxAge(pub u32);

impl header::Header for AccessControlMaxAge {
#[inline]
fn header_name(_: Option<AccessControlMaxAge>) -> &'static str {
"Access-Control-Max-Age"
}

fn parse_header(raw: &[Vec<u8>]) -> Option<AccessControlMaxAge> {
shared::from_one_raw_str(raw).map(AccessControlMaxAge)
}
}

impl header::HeaderFormat for AccessControlMaxAge {
fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
let AccessControlMaxAge(ref num) = *self;
write!(f, "{}", num)
}
}
17 changes: 17 additions & 0 deletions src/header/common/access_control/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/// Exposes the AccessControlAllowHeaders header
pub mod allow_headers;

/// Exposes the AccessControlAllowMethods header
pub mod allow_methods;

/// Exposes the AccessControlAllowOrigin header
pub mod allow_origin;

/// Exposes the AccessControlMaxAge header
pub mod max_age;

/// Exposes the AccessControlRequestHeaders header
pub mod request_headers;

/// Exposes the AccessControlRequestMethod header
pub mod request_method;
25 changes: 25 additions & 0 deletions src/header/common/access_control/request_headers.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
use std::fmt::{self};

use header;
use header::shared;

#[derive(Clone)]
struct AccessControlRequestHeaders(pub Vec<String>);

impl header::Header for AccessControlRequestHeaders {
#[inline]
fn header_name(_: Option<AccessControlRequestHeaders>) -> &'static str {
"Access-Control-Request-Headers"
}

fn parse_header(raw: &[Vec<u8>]) -> Option<AccessControlRequestHeaders> {
shared::from_comma_delimited(raw).map(AccessControlRequestHeaders)
}
}

impl header::HeaderFormat for AccessControlRequestHeaders {
fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
let AccessControlRequestHeaders(ref parts) = *self;
shared::fmt_comma_delimited(f, parts.as_slice())
}
}
26 changes: 26 additions & 0 deletions src/header/common/access_control/request_method.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
use std::fmt;

use header;
use header::shared;
use method::Method;

#[derive(Clone)]
struct AccessControlRequestMethod(pub Method);

impl header::Header for AccessControlRequestMethod {
#[inline]
fn header_name(_: Option<AccessControlRequestMethod>) -> &'static str {
"Access-Control-Request-Method"
}

fn parse_header(raw: &[Vec<u8>]) -> Option<AccessControlRequestMethod> {
shared::from_one_raw_str(raw).map(AccessControlRequestMethod)
}
}

impl header::HeaderFormat for AccessControlRequestMethod {
fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
let AccessControlRequestMethod(ref method) = *self;
write!(f, "{}", method)
}
}
3 changes: 3 additions & 0 deletions src/header/common/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,9 @@ macro_rules! deref(
}
);

/// Exposes the AccessControl* family of headers.
pub mod access_control;

/// Exposes the Accept header.
pub mod accept;

Expand Down

0 comments on commit b45912d

Please sign in to comment.