refactor(http): delete some indirection around Http1Transaction::parse

This commit is contained in:
Yazad Daruvala
2017-05-10 23:52:45 -07:00
parent 09fe9e6a80
commit 2f0470bcf3
3 changed files with 17 additions and 24 deletions

View File

@@ -1,8 +1,6 @@
pub use self::decode::Decoder; pub use self::decode::Decoder;
pub use self::encode::Encoder; pub use self::encode::Encoder;
pub use self::parse::parse;
mod decode; mod decode;
mod encode; mod encode;
pub mod parse; pub mod parse;

View File

@@ -15,19 +15,15 @@ use version::HttpVersion::{Http10, Http11};
const MAX_HEADERS: usize = 100; const MAX_HEADERS: usize = 100;
const AVERAGE_HEADER_SIZE: usize = 30; // totally scientific const AVERAGE_HEADER_SIZE: usize = 30; // totally scientific
pub fn parse<T: Http1Transaction<Incoming=I>, I>(buf: &mut BytesMut) -> ParseResult<I> {
if buf.len() == 0 {
return Ok(None);
}
trace!("parse({:?})", buf);
<T as Http1Transaction>::parse(buf)
}
impl Http1Transaction for ServerTransaction { impl Http1Transaction for ServerTransaction {
type Incoming = RequestLine; type Incoming = RequestLine;
type Outgoing = StatusCode; type Outgoing = StatusCode;
fn parse(buf: &mut BytesMut) -> ParseResult<RequestLine> { fn parse(buf: &mut BytesMut) -> ParseResult<RequestLine> {
if buf.len() == 0 {
return Ok(None);
}
trace!("parse({:?})", buf);
let mut headers_indices = [HeaderIndices { let mut headers_indices = [HeaderIndices {
name: (0, 0), name: (0, 0),
value: (0, 0) value: (0, 0)
@@ -145,6 +141,10 @@ impl Http1Transaction for ClientTransaction {
type Outgoing = RequestLine; type Outgoing = RequestLine;
fn parse(buf: &mut BytesMut) -> ParseResult<RawStatus> { fn parse(buf: &mut BytesMut) -> ParseResult<RawStatus> {
if buf.len() == 0 {
return Ok(None);
}
trace!("parse({:?})", buf);
let mut headers_indices = [HeaderIndices { let mut headers_indices = [HeaderIndices {
name: (0, 0), name: (0, 0),
value: (0, 0) value: (0, 0)
@@ -332,9 +332,8 @@ fn extend(dst: &mut Vec<u8>, data: &[u8]) {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use http; use http::{ServerTransaction, ClientTransaction, Http1Transaction};
use bytes::BytesMut; use bytes::BytesMut;
use super::{parse};
#[test] #[test]
fn test_parse_request() { fn test_parse_request() {
@@ -342,7 +341,7 @@ mod tests {
let _ = pretty_env_logger::init(); let _ = pretty_env_logger::init();
let mut raw = BytesMut::from(b"GET /echo HTTP/1.1\r\nHost: hyper.rs\r\n\r\n".to_vec()); let mut raw = BytesMut::from(b"GET /echo HTTP/1.1\r\nHost: hyper.rs\r\n\r\n".to_vec());
let expected_len = raw.len(); let expected_len = raw.len();
let (req, len) = parse::<http::ServerTransaction, _>(&mut raw).unwrap().unwrap(); let (req, len) = ServerTransaction::parse(&mut raw).unwrap().unwrap();
assert_eq!(len, expected_len); assert_eq!(len, expected_len);
assert_eq!(req.subject.0, ::Method::Get); assert_eq!(req.subject.0, ::Method::Get);
assert_eq!(req.subject.1, "/echo"); assert_eq!(req.subject.1, "/echo");
@@ -358,7 +357,7 @@ mod tests {
let _ = pretty_env_logger::init(); let _ = pretty_env_logger::init();
let mut raw = BytesMut::from(b"HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n".to_vec()); let mut raw = BytesMut::from(b"HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n".to_vec());
let expected_len = raw.len(); let expected_len = raw.len();
let (req, len) = parse::<http::ClientTransaction, _>(&mut raw).unwrap().unwrap(); let (req, len) = ClientTransaction::parse(&mut raw).unwrap().unwrap();
assert_eq!(len, expected_len); assert_eq!(len, expected_len);
assert_eq!(req.subject.0, 200); assert_eq!(req.subject.0, 200);
assert_eq!(req.subject.1, "OK"); assert_eq!(req.subject.1, "OK");
@@ -370,16 +369,16 @@ mod tests {
#[test] #[test]
fn test_parse_request_errors() { fn test_parse_request_errors() {
let mut raw = BytesMut::from(b"GET htt:p// HTTP/1.1\r\nHost: hyper.rs\r\n\r\n".to_vec()); let mut raw = BytesMut::from(b"GET htt:p// HTTP/1.1\r\nHost: hyper.rs\r\n\r\n".to_vec());
parse::<http::ServerTransaction, _>(&mut raw).unwrap_err(); ServerTransaction::parse(&mut raw).unwrap_err();
} }
#[test] #[test]
fn test_parse_raw_status() { fn test_parse_raw_status() {
let mut raw = BytesMut::from(b"HTTP/1.1 200 OK\r\n\r\n".to_vec()); let mut raw = BytesMut::from(b"HTTP/1.1 200 OK\r\n\r\n".to_vec());
let (res, _) = parse::<http::ClientTransaction, _>(&mut raw).unwrap().unwrap(); let (res, _) = ClientTransaction::parse(&mut raw).unwrap().unwrap();
assert_eq!(res.subject.1, "OK"); assert_eq!(res.subject.1, "OK");
let mut raw = BytesMut::from(b"HTTP/1.1 200 Howdy\r\n\r\n".to_vec()); let mut raw = BytesMut::from(b"HTTP/1.1 200 Howdy\r\n\r\n".to_vec());
let (res, _) = parse::<http::ClientTransaction, _>(&mut raw).unwrap().unwrap(); let (res, _) = ClientTransaction::parse(&mut raw).unwrap().unwrap();
assert_eq!(res.subject.1, "Howdy"); assert_eq!(res.subject.1, "Howdy");
} }
@@ -412,7 +411,7 @@ mod tests {
b.bytes = len as u64; b.bytes = len as u64;
b.iter(|| { b.iter(|| {
parse::<http::ServerTransaction, _>(&mut raw).unwrap(); ServerTransaction::parse(&mut raw).unwrap();
restart(&mut raw, len); restart(&mut raw, len);
}); });

View File

@@ -5,7 +5,7 @@ use std::ptr;
use tokio_io::{AsyncRead, AsyncWrite}; use tokio_io::{AsyncRead, AsyncWrite};
use http::{Http1Transaction, h1, MessageHead, ParseResult, DebugTruncate}; use http::{Http1Transaction, MessageHead, DebugTruncate};
use bytes::{BytesMut, Bytes}; use bytes::{BytesMut, Bytes};
const INIT_BUFFER_SIZE: usize = 8192; const INIT_BUFFER_SIZE: usize = 8192;
@@ -56,7 +56,7 @@ impl<T: AsyncRead + AsyncWrite> Buffered<T> {
pub fn parse<S: Http1Transaction>(&mut self) -> ::Result<Option<MessageHead<S::Incoming>>> { pub fn parse<S: Http1Transaction>(&mut self) -> ::Result<Option<MessageHead<S::Incoming>>> {
loop { loop {
match try!(parse::<S, _>(&mut self.read_buf)) { match try!(S::parse(&mut self.read_buf)) {
Some(head) => { Some(head) => {
//trace!("parsed {} bytes out of {}", len, self.read_buf.len()); //trace!("parsed {} bytes out of {}", len, self.read_buf.len());
return Ok(Some(head.0)) return Ok(Some(head.0))
@@ -151,10 +151,6 @@ impl<T: Write> Write for Buffered<T> {
} }
} }
fn parse<T: Http1Transaction<Incoming=I>, I>(rdr: &mut BytesMut) -> ParseResult<I> {
h1::parse::<T, I>(rdr)
}
pub trait MemRead { pub trait MemRead {
fn read_mem(&mut self, len: usize) -> io::Result<Bytes>; fn read_mem(&mut self, len: usize) -> io::Result<Bytes>;
} }