| // 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()))] |
| ) |
| } |