make body return borrowed decoder

This commit is contained in:
Ashley Mannix
2017-08-19 16:32:00 +10:00
parent e2fa97254e
commit 2cb70c872a
7 changed files with 69 additions and 23 deletions

View File

@@ -66,6 +66,13 @@ pub struct Chunk {
inner: ::hyper::Chunk,
}
impl AsRef<[u8]> for Chunk {
#[inline]
fn as_ref(&self) -> &[u8] {
&*self
}
}
impl ::std::ops::Deref for Chunk {
type Target = [u8];
#[inline]

View File

@@ -82,6 +82,19 @@ impl fmt::Debug for Decoder {
}
impl Decoder {
/// An empty decoder.
///
/// This decoder will produce a single 0 byte chunk.
#[inline]
pub fn empty() -> Decoder {
Decoder {
inner: Inner::PlainText(body::empty())
}
}
/// A plain text decoder.
///
/// This decoder will emit the underlying chunks as-is.
#[inline]
fn plain_text(body: Body) -> Decoder {
Decoder {
@@ -89,6 +102,9 @@ impl Decoder {
}
}
/// A gzip decoder.
///
/// This decoder will buffer and decompress chunks that are gzipped.
#[inline]
fn gzip(mut body: Body) -> Decoder {
Decoder {
@@ -385,14 +401,6 @@ impl<S> ReadableChunks<S>
// pub(crate)
#[inline]
pub fn take(decoder: &mut Decoder) -> Decoder {
let inner = mem::replace(&mut decoder.inner, Inner::PlainText(body::empty()));
Decoder {
inner: inner,
}
}
/// Constructs a Decoder from a hyper request.
///
/// A decoder is just a wrapper around the hyper request that knows

View File

@@ -63,17 +63,17 @@ impl Response {
///
/// This function will replace the body on the response with an empty one.
#[inline]
pub fn body(&mut self) -> Decoder {
decoder::take(&mut self.body)
pub fn body(&self) -> &Decoder {
&self.body
}
/// Try to deserialize the response body as JSON using `serde`.
#[inline]
pub fn json<T: DeserializeOwned>(&mut self) -> Json<T> {
let body = self.body().concat2();
let body = mem::replace(&mut self.body, Decoder::empty());
Json {
concat: body,
concat: body.concat2(),
_marker: PhantomData,
}
}