headers_ext/common/
access_control_request_method.rs

1use http::Method;
2use ::{Header, HeaderName, HeaderValue};
3
4/// `Access-Control-Request-Method` header, part of
5/// [CORS](http://www.w3.org/TR/cors/#access-control-request-method-request-header)
6///
7/// The `Access-Control-Request-Method` header indicates which method will be
8/// used in the actual request as part of the preflight request.
9/// # ABNF
10///
11/// ```text
12/// Access-Control-Request-Method: \"Access-Control-Request-Method\" \":\" Method
13/// ```
14///
15/// # Example values
16/// * `GET`
17///
18/// # Examples
19///
20/// ```
21/// # extern crate headers_ext as headers;
22/// extern crate http;
23/// use headers::AccessControlRequestMethod;
24/// use http::Method;
25///
26/// let req_method = AccessControlRequestMethod::from(Method::GET);
27/// ```
28#[derive(Clone, Debug, PartialEq, Eq, Hash)]
29pub struct AccessControlRequestMethod(Method);
30
31impl Header for AccessControlRequestMethod {
32    const NAME: &'static HeaderName = &::http::header::ACCESS_CONTROL_REQUEST_METHOD;
33
34    fn decode<'i, I: Iterator<Item = &'i HeaderValue>>(values: &mut I) -> Result<Self, ::Error> {
35        values.next()
36            .and_then(|value| {
37                Method::from_bytes(value.as_bytes()).ok()
38            })
39            .map(AccessControlRequestMethod)
40            .ok_or_else(::Error::invalid)
41    }
42
43    fn encode<E: Extend<::HeaderValue>>(&self, values: &mut E) {
44        // For the more common methods, try to use a static string.
45        let s = match self.0 {
46            Method::GET => "GET",
47            Method::POST => "POST",
48            Method::PUT => "PUT",
49            Method::DELETE => "DELETE",
50            _ => {
51                let val = HeaderValue::from_str(self.0.as_ref())
52                    .expect("Methods are also valid HeaderValues");
53                values.extend(::std::iter::once(val));
54                return;
55            }
56        };
57
58        values.extend(::std::iter::once(HeaderValue::from_static(s)));
59    }
60}
61
62impl From<Method> for AccessControlRequestMethod {
63    fn from(method: Method) -> AccessControlRequestMethod {
64        AccessControlRequestMethod(method)
65    }
66}
67