From 45d61696105fb52b8c406d30081750836788ee3e Mon Sep 17 00:00:00 2001 From: Anthony Nowell Date: Tue, 8 Nov 2016 01:14:18 -0700 Subject: [PATCH] Body conversion for File --- src/body.rs | 21 ++++++++++++++++++--- src/client.rs | 4 ++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/body.rs b/src/body.rs index a2da5ba..43ae94b 100644 --- a/src/body.rs +++ b/src/body.rs @@ -1,4 +1,5 @@ use std::io::Read; +use std::fs::File; /// Body type for a request. pub struct Body { @@ -60,19 +61,33 @@ impl<'a> From<&'a str> for Body { } } +impl From for Body { + #[inline] + fn from(f: File) -> Body { + let len = f.metadata().map(|m| m.len()).ok(); + Body { + reader: Kind::Reader(Box::new(f), len), + } + } +} // Wraps a `std::io::Write`. //pub struct Pipe(Kind); -pub fn as_hyper_body<'a>(body: &'a Body) -> ::hyper::client::Body<'a> { +pub fn as_hyper_body<'a>(body: &'a mut Body) -> ::hyper::client::Body<'a> { match body.reader { Kind::Bytes(ref bytes) => { let len = bytes.len(); ::hyper::client::Body::BufBody(bytes, len) - }, - Kind::Reader(..) => unimplemented!() + } + Kind::Reader(ref mut reader, len_opt) => { + match len_opt { + Some(len) => ::hyper::client::Body::SizedBody(reader, len), + None => ::hyper::client::Body::ChunkedBody(reader), + } + } } } diff --git a/src/client.rs b/src/client.rs index 6952367..33f4123 100644 --- a/src/client.rs +++ b/src/client.rs @@ -167,8 +167,8 @@ impl<'a> RequestBuilder<'a> { let mut req = client.inner.request(method.clone(), url.clone()) .headers(headers.clone()); - if let Some(ref b) = body { - let body = body::as_hyper_body(&b); + if let Some(ref mut b) = body { + let body = body::as_hyper_body(b); req = req.body(body); }