fix(http): log errors passed to tokio at debug level

Closes #1278
This commit is contained in:
Sean McArthur
2017-09-16 18:23:30 -07:00
parent 41c47241cd
commit 971864c424

View File

@@ -47,6 +47,35 @@ where I: AsyncRead + AsyncWrite,
} }
} }
fn poll2(&mut self) -> Poll<Option<Frame<http::MessageHead<T::Incoming>, http::Chunk, ::Error>>, io::Error> {
trace!("Conn::poll()");
loop {
if self.is_read_closed() {
trace!("Conn::poll when closed");
return Ok(Async::Ready(None));
} else if self.can_read_head() {
return self.read_head();
} else if self.can_write_continue() {
try_nb!(self.flush());
} else if self.can_read_body() {
return self.read_body()
.map(|async| async.map(|chunk| Some(Frame::Body {
chunk: chunk
})))
.or_else(|err| {
self.state.close_read();
Ok(Async::Ready(Some(Frame::Error { error: err.into() })))
});
} else {
trace!("poll when on keep-alive");
self.maybe_park_read();
return Ok(Async::NotReady);
}
}
}
fn is_read_closed(&self) -> bool { fn is_read_closed(&self) -> bool {
self.state.is_read_closed() self.state.is_read_closed()
} }
@@ -89,12 +118,9 @@ where I: AsyncRead + AsyncWrite,
self.state.close_read(); self.state.close_read();
self.io.consume_leading_lines(); self.io.consume_leading_lines();
let was_mid_parse = !self.io.read_buf().is_empty(); let was_mid_parse = !self.io.read_buf().is_empty();
return if was_mid_parse { return if was_mid_parse || must_respond_with_error {
debug!("parse error ({}) with {} bytes", e, self.io.read_buf().len()); debug!("parse error ({}) with {} bytes", e, self.io.read_buf().len());
Ok(Async::Ready(Some(Frame::Error { error: e }))) Ok(Async::Ready(Some(Frame::Error { error: e })))
} else if must_respond_with_error {
trace!("parse error with 0 input, err = {:?}", e);
Ok(Async::Ready(Some(Frame::Error { error: e })))
} else { } else {
debug!("read eof"); debug!("read eof");
Ok(Async::Ready(None)) Ok(Async::Ready(None))
@@ -379,32 +405,12 @@ where I: AsyncRead + AsyncWrite,
type Item = Frame<http::MessageHead<T::Incoming>, http::Chunk, ::Error>; type Item = Frame<http::MessageHead<T::Incoming>, http::Chunk, ::Error>;
type Error = io::Error; type Error = io::Error;
#[inline]
fn poll(&mut self) -> Poll<Option<Self::Item>, Self::Error> { fn poll(&mut self) -> Poll<Option<Self::Item>, Self::Error> {
trace!("Conn::poll()"); self.poll2().map_err(|err| {
debug!("poll error: {}", err);
loop { err
if self.is_read_closed() { })
trace!("Conn::poll when closed");
return Ok(Async::Ready(None));
} else if self.can_read_head() {
return self.read_head();
} else if self.can_write_continue() {
try_nb!(self.flush());
} else if self.can_read_body() {
return self.read_body()
.map(|async| async.map(|chunk| Some(Frame::Body {
chunk: chunk
})))
.or_else(|err| {
self.state.close_read();
Ok(Async::Ready(Some(Frame::Error { error: err.into() })))
});
} else {
trace!("poll when on keep-alive");
self.maybe_park_read();
return Ok(Async::NotReady);
}
}
} }
} }
@@ -460,16 +466,22 @@ where I: AsyncRead + AsyncWrite,
} }
#[inline]
fn poll_complete(&mut self) -> Poll<(), Self::SinkError> { fn poll_complete(&mut self) -> Poll<(), Self::SinkError> {
trace!("Conn::poll_complete()"); trace!("Conn::poll_complete()");
let ret = self.flush(); self.flush().map_err(|err| {
trace!("Conn::flush = {:?}", ret); debug!("error writing: {}", err);
ret err
})
} }
#[inline]
fn close(&mut self) -> Poll<(), Self::SinkError> { fn close(&mut self) -> Poll<(), Self::SinkError> {
try_ready!(self.poll_complete()); try_ready!(self.poll_complete());
self.io.io_mut().shutdown() self.io.io_mut().shutdown().map_err(|err| {
debug!("error closing: {}", err);
err
})
} }
} }