use iron::{self, Request};
use std::borrow::Cow;
pub trait RequestExt {
fn is_browser(&self) -> bool;
fn get_length(&self) -> Option<u64>;
fn url_segment_n(&self, n: usize) -> Option<&str>;
fn get_arg(&self, arg: &str) -> Option<Cow<str>>;
}
impl<'a, 'b> RequestExt for Request<'a, 'b> {
fn is_browser(&self) -> bool {
lazy_static! {
static ref BROWSERS: Vec<&'static str> =
vec!["Gecko/", "AppleWebKit/", "Opera/", "Trident/", "Chrome/"];
}
self.headers.get::<iron::headers::UserAgent>()
.map(|agent| {
debug!("User agent: [{}]", agent);
BROWSERS.iter().any(|browser| agent.contains(browser))
})
.unwrap_or(false)
}
fn get_length(&self) -> Option<u64> {
self.headers.get::<iron::headers::ContentLength>()
.map(|length_header| {
let length = length_header.0;
debug!("Content length: {}", length);
length
})
}
fn url_segment_n(&self, n: usize) -> Option<&str> {
self.url.as_ref()
.path_segments()
.and_then(|mut it| it.nth(n))
.and_then(|s| {
if s.is_empty() {
None
} else {
Some(s)
}
})
}
fn get_arg(&self, arg: &str) -> Option<Cow<str>> {
self.url.as_ref()
.query_pairs()
.find(|&(ref name, _)| name == arg)
.map(|(_, value)| value)
}
}