Merge pull request #699 from kaedroho/fix/698

fix(server): Removed check for GET/HEAD request when parsing body
This commit is contained in:
Sean McArthur
2015-11-30 09:38:18 -08:00

View File

@@ -9,7 +9,7 @@ use std::time::Duration;
use buffer::BufReader; use buffer::BufReader;
use net::NetworkStream; use net::NetworkStream;
use version::{HttpVersion}; use version::{HttpVersion};
use method::Method::{self, Get, Head}; use method::Method;
use header::{Headers, ContentLength, TransferEncoding}; use header::{Headers, ContentLength, TransferEncoding};
use http::h1::{self, Incoming, HttpReader}; use http::h1::{self, Incoming, HttpReader};
use http::h1::HttpReader::{SizedReader, ChunkedReader, EmptyReader}; use http::h1::HttpReader::{SizedReader, ChunkedReader, EmptyReader};
@@ -41,9 +41,7 @@ impl<'a, 'b: 'a> Request<'a, 'b> {
debug!("Request Line: {:?} {:?} {:?}", method, uri, version); debug!("Request Line: {:?} {:?} {:?}", method, uri, version);
debug!("{:?}", headers); debug!("{:?}", headers);
let body = if method == Get || method == Head { let body = if headers.has::<ContentLength>() {
EmptyReader(stream)
} else if headers.has::<ContentLength>() {
match headers.get::<ContentLength>() { match headers.get::<ContentLength>() {
Some(&ContentLength(len)) => SizedReader(stream, len), Some(&ContentLength(len)) => SizedReader(stream, len),
None => unreachable!() None => unreachable!()
@@ -159,6 +157,24 @@ mod tests {
assert_eq!(read_to_string(req).unwrap(), "".to_owned()); assert_eq!(read_to_string(req).unwrap(), "".to_owned());
} }
#[test]
fn test_get_with_body() {
let mut mock = MockStream::with_input(b"\
GET / HTTP/1.1\r\n\
Host: example.domain\r\n\
Content-Length: 19\r\n\
\r\n\
I'm a good request.\r\n\
");
// FIXME: Use Type ascription
let mock: &mut NetworkStream = &mut mock;
let mut stream = BufReader::new(mock);
let req = Request::new(&mut stream, sock("127.0.0.1:80")).unwrap();
assert_eq!(read_to_string(req).unwrap(), "I'm a good request.".to_owned());
}
#[test] #[test]
fn test_head_empty_body() { fn test_head_empty_body() {
let mut mock = MockStream::with_input(b"\ let mut mock = MockStream::with_input(b"\