@@ -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
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user