move Read impl of Body to private function
This commit is contained in:
41
src/body.rs
41
src/body.rs
@@ -1,5 +1,4 @@
|
|||||||
use std::io::{Cursor, Read};
|
use std::io::Read;
|
||||||
use std::io;
|
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
|
||||||
@@ -28,10 +27,18 @@ impl Body {
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Read for Body {
|
// useful for tests, but not publicly exposed
|
||||||
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
|
#[cfg(test)]
|
||||||
self.reader.read(buf)
|
pub fn read_to_string(mut body: Body) -> ::std::io::Result<String> {
|
||||||
}
|
let mut s = String::new();
|
||||||
|
match body.reader {
|
||||||
|
Kind::Reader(ref mut reader, _) => {
|
||||||
|
reader.read_to_string(&mut s)
|
||||||
|
}
|
||||||
|
Kind::Bytes(ref mut bytes) => {
|
||||||
|
(&**bytes).read_to_string(&mut s)
|
||||||
|
}
|
||||||
|
}.map(|_| s)
|
||||||
}
|
}
|
||||||
|
|
||||||
enum Kind {
|
enum Kind {
|
||||||
@@ -39,28 +46,6 @@ enum Kind {
|
|||||||
Bytes(Vec<u8>),
|
Bytes(Vec<u8>),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Read for Kind {
|
|
||||||
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
|
|
||||||
match *self {
|
|
||||||
Kind::Reader(ref mut reader, _) => {
|
|
||||||
reader.read(buf)
|
|
||||||
}
|
|
||||||
Kind::Bytes(ref mut bytes) => {
|
|
||||||
// To make sure the bytes are removed properly when you read
|
|
||||||
// them, you need to use `drain()`
|
|
||||||
// FIXME: this will probably have poor performance for larger
|
|
||||||
// bodies due to allocating more than necessary.
|
|
||||||
let drained_bytes: Vec<u8> = bytes.drain(..).collect();
|
|
||||||
|
|
||||||
// then you need a Cursor because a standard Vec doesn't implement
|
|
||||||
// Read
|
|
||||||
let mut cursor = Cursor::new(drained_bytes);
|
|
||||||
cursor.read(buf)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<Vec<u8>> for Body {
|
impl From<Vec<u8>> for Body {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn from(v: Vec<u8>) -> Body {
|
fn from(v: Vec<u8>) -> Body {
|
||||||
|
|||||||
@@ -291,11 +291,11 @@ impl Read for Response {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
use ::body;
|
||||||
use hyper::method::Method;
|
use hyper::method::Method;
|
||||||
use hyper::Url;
|
use hyper::Url;
|
||||||
use hyper::header::{Host, Headers, ContentType};
|
use hyper::header::{Host, Headers, ContentType};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::io::Read;
|
|
||||||
use serde_urlencoded;
|
use serde_urlencoded;
|
||||||
use serde_json;
|
use serde_json;
|
||||||
|
|
||||||
@@ -378,8 +378,7 @@ mod tests {
|
|||||||
|
|
||||||
r = r.body(body);
|
r = r.body(body);
|
||||||
|
|
||||||
let mut buf = String::new();
|
let buf = body::read_to_string(r.body.unwrap().unwrap()).unwrap();
|
||||||
r.body.unwrap().unwrap().read_to_string(&mut buf).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(buf, body);
|
assert_eq!(buf, body);
|
||||||
}
|
}
|
||||||
@@ -398,8 +397,7 @@ mod tests {
|
|||||||
// Make sure the content type was set
|
// Make sure the content type was set
|
||||||
assert_eq!(r.headers.get::<ContentType>(), Some(&ContentType::form_url_encoded()));
|
assert_eq!(r.headers.get::<ContentType>(), Some(&ContentType::form_url_encoded()));
|
||||||
|
|
||||||
let mut buf = String::new();
|
let buf = body::read_to_string(r.body.unwrap().unwrap()).unwrap();
|
||||||
r.body.unwrap().unwrap().read_to_string(&mut buf).unwrap();
|
|
||||||
|
|
||||||
let body_should_be = serde_urlencoded::to_string(&form_data).unwrap();
|
let body_should_be = serde_urlencoded::to_string(&form_data).unwrap();
|
||||||
assert_eq!(buf, body_should_be);
|
assert_eq!(buf, body_should_be);
|
||||||
@@ -419,8 +417,7 @@ mod tests {
|
|||||||
// Make sure the content type was set
|
// Make sure the content type was set
|
||||||
assert_eq!(r.headers.get::<ContentType>(), Some(&ContentType::json()));
|
assert_eq!(r.headers.get::<ContentType>(), Some(&ContentType::json()));
|
||||||
|
|
||||||
let mut buf = String::new();
|
let buf = body::read_to_string(r.body.unwrap().unwrap()).unwrap();
|
||||||
r.body.unwrap().unwrap().read_to_string(&mut buf).unwrap();
|
|
||||||
|
|
||||||
let body_should_be = serde_json::to_string(&json_data).unwrap();
|
let body_should_be = serde_json::to_string(&json_data).unwrap();
|
||||||
assert_eq!(buf, body_should_be);
|
assert_eq!(buf, body_should_be);
|
||||||
|
|||||||
Reference in New Issue
Block a user