| //! Support for `multipart/form-data` bodies in [Nickel](https://nickel.rs). |
| pub extern crate nickel; |
| |
| use self::nickel::hyper; |
| use self::hyper::header::ContentType; |
| |
| pub use self::nickel::Request as NickelRequest; |
| pub use self::nickel::hyper::server::Request as HyperRequest; |
| |
| use server::{HttpRequest, Multipart}; |
| |
| /// A wrapper for `&mut nickel::Request` which implements `multipart::server::HttpRequest`. |
| /// |
| /// Necessary because this crate cannot directly provide an impl of `HttpRequest` for |
| /// `&mut NickelRequest`. |
| pub struct Maybe<'r, 'mw: 'r, 'server: 'mw, D: 'mw>(pub &'r mut NickelRequest<'mw, 'server, D>); |
| |
| impl<'r, 'mw: 'r, 'server: 'mw, D: 'mw> HttpRequest for Maybe<'r, 'mw, 'server, D> { |
| type Body = &'r mut HyperRequest<'mw, 'server>; |
| |
| fn multipart_boundary(&self) -> Option<&str> { |
| // we can't use the impl from the `hyper` module because it might be the wrong version |
| let cont_type = try_opt!(self.0.origin.headers.get::<ContentType>()); |
| cont_type.get_param("boundary").map(|v| v.as_str()) |
| } |
| |
| fn body(self) -> Self::Body { |
| &mut self.0.origin |
| } |
| } |
| |
| /// Extension trait for getting the `multipart/form-data` body from `nickel::Request`. |
| /// |
| /// Implemented for `nickel::Request`. |
| pub trait MultipartBody<'mw, 'server> { |
| /// Get a multipart reader for the request body, if the request is of the right type. |
| fn multipart_body(&mut self) -> Option<Multipart<&mut HyperRequest<'mw, 'server>>>; |
| } |
| |
| impl<'mw, 'server, D: 'mw> MultipartBody<'mw, 'server> for NickelRequest<'mw, 'server, D> { |
| fn multipart_body(&mut self) -> Option<Multipart<&mut HyperRequest<'mw, 'server>>> { |
| Multipart::from_request(Maybe(self)).ok() |
| } |
| } |
| |
| impl<'r, 'mw: 'r, 'server: 'mw, D: 'mw> AsRef<&'r mut NickelRequest<'mw, 'server, D>> for Maybe<'r, 'mw, 'server, D> { |
| fn as_ref(&self) -> &&'r mut NickelRequest<'mw, 'server, D> { |
| &self.0 |
| } |
| } |
| |
| impl<'r, 'mw: 'r, 'server: 'mw, D: 'mw> AsMut<&'r mut NickelRequest<'mw, 'server, D>> for Maybe<'r, 'mw, 'server, D> { |
| fn as_mut(&mut self) -> &mut &'r mut NickelRequest<'mw, 'server, D> { |
| &mut self.0 |
| } |
| } |
| |
| impl<'r, 'mw: 'r, 'server: 'mw, D: 'mw> Into<&'r mut NickelRequest<'mw, 'server, D>> for Maybe<'r, 'mw, 'server, D> { |
| fn into(self) -> &'r mut NickelRequest<'mw, 'server, D> { |
| self.0 |
| } |
| } |
| |
| impl<'r, 'mw: 'r, 'server: 'mw, D: 'mw> From<&'r mut NickelRequest<'mw, 'server, D>> for Maybe<'r, 'mw, 'server, D> { |
| fn from(req: &'r mut NickelRequest<'mw, 'server, D>) -> Self { |
| Maybe(req) |
| } |
| } |
| |