gotham_header_routematcher/
lib.rs

1use gotham::router::non_match::RouteNonMatch;
2use gotham::router::route::matcher::RouteMatcher;
3use gotham::state::{FromState, State};
4use gotham::hyper::{HeaderMap, StatusCode};
5
6#[cfg(test)]
7mod unittest;
8
9/// Check whether a header is present and contains a specified value.
10#[derive(Clone)]
11pub struct HeaderEqualsRouteMatcher {
12    header_name: String,
13    header_value: Vec<u8>,
14}
15
16impl HeaderEqualsRouteMatcher {
17    /// Create a new `HeaderEqualsRouteMatcher`
18    pub fn new(header_name: String, header_value: Vec<u8>) -> Self {
19        HeaderEqualsRouteMatcher {
20            header_name,
21            header_value,
22        }
23    }
24}
25
26impl RouteMatcher for HeaderEqualsRouteMatcher {
27    /// Determines if the `Request` was made with a header that equals the
28    /// value exactly.
29    fn is_match(&self, state: &State) -> Result<(), RouteNonMatch> {
30        match HeaderMap::borrow_from(state).get(&self.header_name) {
31            None => Err(RouteNonMatch::new(StatusCode::NOT_FOUND)),
32            Some(hv) => if self.header_value == hv.as_bytes() {
33                Ok(())
34            } else {
35                Err(RouteNonMatch::new(StatusCode::NOT_FOUND))
36            },
37        }
38    }
39}