Add a method to buffer a request body into memory, and a method to access the request body when it is already buffered. (#801)
This commit is contained in:
		| @@ -80,6 +80,38 @@ impl Body { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /// Returns the body as a byte slice if the body is already buffered in | ||||||
|  |     /// memory. For streamed requests this method returns `None`. | ||||||
|  |     pub fn as_bytes(&self) -> Option<&[u8]> { | ||||||
|  |         match self.kind { | ||||||
|  |             Kind::Reader(_, _) => None, | ||||||
|  |             Kind::Bytes(ref bytes) => Some(bytes.as_ref()), | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// Converts streamed requests to their buffered equivalent and | ||||||
|  |     /// returns a reference to the buffer. If the request is already | ||||||
|  |     /// buffered, this has no effect. | ||||||
|  |     ///  | ||||||
|  |     /// Be aware that for large requests this method is expensive | ||||||
|  |     /// and may cause your program to run out of memory. | ||||||
|  |     pub fn buffer(&mut self) -> Result<&[u8], crate::Error> { | ||||||
|  |         match self.kind { | ||||||
|  |             Kind::Reader(ref mut reader, maybe_len) => { | ||||||
|  |                 let mut bytes = if let Some(len) = maybe_len { | ||||||
|  |                     Vec::with_capacity(len as usize) | ||||||
|  |                 } else { | ||||||
|  |                     Vec::new() | ||||||
|  |                 }; | ||||||
|  |                 io::copy(reader, &mut bytes) | ||||||
|  |                     .map_err(crate::error::builder)?; | ||||||
|  |                 self.kind = Kind::Bytes(bytes.into()); | ||||||
|  |                 self.buffer() | ||||||
|  |             }, | ||||||
|  |             Kind::Bytes(ref bytes) => Ok(bytes.as_ref()), | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     pub(crate) fn len(&self) -> Option<u64> { |     pub(crate) fn len(&self) -> Option<u64> { | ||||||
|         match self.kind { |         match self.kind { | ||||||
|             Kind::Reader(_, len) => len, |             Kind::Reader(_, len) => len, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user