| // Copyright 2016 `multipart` Crate Developers | |
| // | |
| // Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or | |
| // http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or | |
| // http://opensource.org/licenses/MIT>, at your option. This file may not be | |
| // copied, modified, or distributed except according to those terms. | |
| //! Client-side integration with [Hyper](https://github.com/hyperium/hyper). | |
| //! Enabled with the `hyper` feature (on by default). | |
| //! | |
| //! Contains `impl HttpRequest for Request<Fresh>` and `impl HttpStream for Request<Streaming>`. | |
| //! | |
| //! Also see: [`lazy::Multipart::client_request()`](../lazy/struct.Multipart.html#method.client_request) | |
| //! and [`lazy::Multipart::client_request_mut()`](../lazy/struct.Multipart.html#method.client_request_mut) | |
| //! (adaptors for `hyper::client::RequestBuilder`). | |
| use hyper::client::request::Request; | |
| use hyper::client::response::Response; | |
| use hyper::header::{ContentType, ContentLength}; | |
| use hyper::method::Method; | |
| use hyper::net::{Fresh, Streaming}; | |
| use hyper::Error as HyperError; | |
| use hyper::mime::{Mime, TopLevel, SubLevel, Attr, Value}; | |
| use super::{HttpRequest, HttpStream}; | |
| /// #### Feature: `hyper` | |
| impl HttpRequest for Request<Fresh> { | |
| type Stream = Request<Streaming>; | |
| type Error = HyperError; | |
| /// # Panics | |
| /// If `self.method() != Method::Post`. | |
| fn apply_headers(&mut self, boundary: &str, content_len: Option<u64>) -> bool { | |
| if self.method() != Method::Post { | |
| error!( | |
| "Expected Hyper request method to be `Post`, was actually `{:?}`", | |
| self.method() | |
| ); | |
| return false; | |
| } | |
| let headers = self.headers_mut(); | |
| headers.set(ContentType(multipart_mime(boundary))); | |
| if let Some(size) = content_len { | |
| headers.set(ContentLength(size)); | |
| } | |
| debug!("Hyper headers: {}", headers); | |
| true | |
| } | |
| fn open_stream(self) -> Result<Self::Stream, Self::Error> { | |
| self.start() | |
| } | |
| } | |
| /// #### Feature: `hyper` | |
| impl HttpStream for Request<Streaming> { | |
| type Request = Request<Fresh>; | |
| type Response = Response; | |
| type Error = HyperError; | |
| fn finish(self) -> Result<Self::Response, Self::Error> { | |
| self.send() | |
| } | |
| } | |
| /// Create a `Content-Type: multipart/form-data;boundary={bound}` | |
| pub fn content_type(bound: &str) -> ContentType { | |
| ContentType(multipart_mime(bound)) | |
| } | |
| fn multipart_mime(bound: &str) -> Mime { | |
| Mime( | |
| TopLevel::Multipart, SubLevel::Ext("form-data".into()), | |
| vec![(Attr::Ext("boundary".into()), Value::Ext(bound.into()))] | |
| ) | |
| } |