in src/connection.rs [1169:1231]
fn test_parse_headers() {
let (_, receiver) = UnixStream::pair().unwrap();
let mut conn = HttpConnection::new(receiver);
// Error case: end_cursor past buffer end.
assert_eq!(
conn.parse_headers(&mut 0, conn.buffer.len() + 1)
.unwrap_err(),
ConnectionError::ParseError(RequestError::Overflow)
);
// Error case: line_start_index is past end_cursor.
assert_eq!(
conn.parse_headers(&mut 1, 0).unwrap_err(),
ConnectionError::ParseError(RequestError::Underflow)
);
// Error case: no request pending.
// CRLF can be at the start of the buffer...
conn.buffer[0] = CR;
conn.buffer[1] = LF;
assert_eq!(
conn.parse_headers(&mut 0, BUFFER_SIZE).unwrap_err(),
ConnectionError::ParseError(RequestError::HeadersWithoutPendingRequest)
);
// ...or somewhere in the middle.
conn.buffer[0] = 0;
conn.buffer[1] = CR;
conn.buffer[2] = LF;
assert_eq!(
conn.parse_headers(&mut 0, BUFFER_SIZE).unwrap_err(),
ConnectionError::ParseError(RequestError::HeadersWithoutPendingRequest)
);
// Error case: invalid header.
conn.pending_request = Some(Request {
request_line: RequestLine::new(Method::Get, "http://foo/bar", Version::Http11),
headers: Headers::new(0, true, true),
body: None,
files: Vec::new(),
});
assert_eq!(
conn.parse_headers(&mut 0, BUFFER_SIZE).unwrap_err(),
ConnectionError::ParseError(RequestError::HeaderError(HttpHeaderError::InvalidFormat(
"\0".to_string()
)))
);
// OK case: incomplete header line.
let hdr = b"Custom-Header-Testing: 1";
conn.buffer[..hdr.len()].copy_from_slice(hdr);
assert_eq!(conn.parse_headers(&mut 0, hdr.len()), Ok(false));
// OK case: complete header line.
let hdr = b"Custom-Header-Testing: 1\r\n";
conn.buffer[..hdr.len()].copy_from_slice(hdr);
assert_eq!(conn.parse_headers(&mut 0, hdr.len()), Ok(true));
// OK case: complete header line, end of header.
let hdr = b"\r\n";
conn.buffer[..hdr.len()].copy_from_slice(hdr);
assert_eq!(conn.parse_headers(&mut 0, hdr.len()), Ok(true));
}