aquatic_http: use flexible-sized buffer for request reading

This commit is contained in:
Joakim Frostegård 2020-07-03 11:13:55 +02:00
parent 3a8e5a3abf
commit 136a79ce8d
2 changed files with 18 additions and 6 deletions

View file

@ -29,7 +29,7 @@ pub enum RequestReadError {
pub struct EstablishedConnection {
stream: Stream,
pub peer_addr: SocketAddr,
buf: [u8; 1024],
buf: Vec<u8>,
bytes_read: usize,
}
@ -41,25 +41,33 @@ impl EstablishedConnection {
Self {
stream,
peer_addr,
buf: [0; 1024], // FIXME: fixed size is stupid
buf: Vec::new(),
bytes_read: 0,
}
}
pub fn read_request(&mut self) -> Result<Request, RequestReadError> {
if self.buf.len() - self.bytes_read < 512 {
self.buf.extend_from_slice(&[0; 1024]);
}
match self.stream.read(&mut self.buf[self.bytes_read..]){
Ok(0) => {
self.clear_buffer();
return Err(RequestReadError::StreamEnded);
}
Ok(bytes_read) => {
self.bytes_read += bytes_read;
info!("parse request read {} bytes", bytes_read);
info!("read_request read {} bytes", bytes_read);
},
Err(err) if err.kind() == ErrorKind::WouldBlock => {
return Err(RequestReadError::NeedMoreData);
},
Err(err) => {
self.clear_buffer();
return Err(RequestReadError::Io(err));
}
}
@ -73,7 +81,7 @@ impl EstablishedConnection {
Request::from_http_get_path
);
self.bytes_read = 0;
self.clear_buffer();
if let Some(request) = opt_request {
Ok(request)
@ -85,7 +93,7 @@ impl EstablishedConnection {
Err(RequestReadError::NeedMoreData)
},
Err(err) => {
self.bytes_read = 0;
self.clear_buffer();
Err(RequestReadError::Parse(err))
}
@ -106,6 +114,11 @@ impl EstablishedConnection {
Ok(())
}
pub fn clear_buffer(&mut self){
self.bytes_read = 0;
self.buf = Vec::new();
}
}