multipart/server/
nickel.rs

1//! Support for `multipart/form-data` bodies in [Nickel](https://nickel.rs).
2pub extern crate nickel;
3
4use self::nickel::hyper;
5use self::hyper::header::ContentType;
6
7pub use self::nickel::Request as NickelRequest;
8pub use self::nickel::hyper::server::Request as HyperRequest;
9
10use server::{HttpRequest, Multipart};
11
12/// A wrapper for `&mut nickel::Request` which implements `multipart::server::HttpRequest`.
13///
14/// Necessary because this crate cannot directly provide an impl of `HttpRequest` for
15/// `&mut NickelRequest`.
16pub struct Maybe<'r, 'mw: 'r, 'server: 'mw, D: 'mw>(pub &'r mut NickelRequest<'mw, 'server, D>);
17
18impl<'r, 'mw: 'r, 'server: 'mw, D: 'mw> HttpRequest for Maybe<'r, 'mw, 'server, D> {
19    type Body = &'r mut HyperRequest<'mw, 'server>;
20
21    fn multipart_boundary(&self) -> Option<&str> {
22        // we can't use the impl from the `hyper` module because it might be the wrong version
23        let cont_type = try_opt!(self.0.origin.headers.get::<ContentType>());
24        cont_type.get_param("boundary").map(|v| v.as_str())
25    }
26
27    fn body(self) -> Self::Body {
28        &mut self.0.origin
29    }
30}
31
32/// Extension trait for getting the `multipart/form-data` body from `nickel::Request`.
33///
34/// Implemented for `nickel::Request`.
35pub trait MultipartBody<'mw, 'server> {
36    /// Get a multipart reader for the request body, if the request is of the right type.
37    fn multipart_body(&mut self) -> Option<Multipart<&mut HyperRequest<'mw, 'server>>>;
38}
39
40impl<'mw, 'server, D: 'mw> MultipartBody<'mw, 'server> for NickelRequest<'mw, 'server, D> {
41    fn multipart_body(&mut self) -> Option<Multipart<&mut HyperRequest<'mw, 'server>>> {
42        Multipart::from_request(Maybe(self)).ok()
43    }
44}
45
46impl<'r, 'mw: 'r, 'server: 'mw, D: 'mw> AsRef<&'r mut NickelRequest<'mw, 'server, D>> for Maybe<'r, 'mw, 'server, D> {
47    fn as_ref(&self) -> &&'r mut NickelRequest<'mw, 'server, D> {
48        &self.0
49    }
50}
51
52impl<'r, 'mw: 'r, 'server: 'mw, D: 'mw> AsMut<&'r mut NickelRequest<'mw, 'server, D>> for Maybe<'r, 'mw, 'server, D> {
53    fn as_mut(&mut self) -> &mut &'r mut NickelRequest<'mw, 'server, D> {
54        &mut self.0
55    }
56}
57
58impl<'r, 'mw: 'r, 'server: 'mw, D: 'mw> Into<&'r mut NickelRequest<'mw, 'server, D>> for Maybe<'r, 'mw, 'server, D> {
59    fn into(self) -> &'r mut NickelRequest<'mw, 'server, D> {
60        self.0
61    }
62}
63
64impl<'r, 'mw: 'r, 'server: 'mw, D: 'mw> From<&'r mut NickelRequest<'mw, 'server, D>> for Maybe<'r, 'mw, 'server, D> {
65    fn from(req: &'r mut NickelRequest<'mw, 'server, D>) -> Self {
66        Maybe(req)
67    }
68}
69