From cc97653fd7a734fcb3461caafb6efe1505d04f62 Mon Sep 17 00:00:00 2001 From: Oliver Gould Date: Thu, 13 Jul 2017 03:47:31 +0000 Subject: [PATCH] hmmmmm two tests are failing... handshake and get_with_204_response --- src/proto/connection.rs | 19 +++++++++---------- src/proto/settings.rs | 23 ++++++++++------------- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/src/proto/connection.rs b/src/proto/connection.rs index da58ba4..6dbcb6f 100644 --- a/src/proto/connection.rs +++ b/src/proto/connection.rs @@ -206,7 +206,7 @@ impl Stream for Connection fn poll(&mut self) -> Poll, ConnectionError> { use frame::Frame::*; - trace!("Connection::poll"); + trace!("poll"); loop { let frame = match try!(self.inner.poll()) { @@ -215,7 +215,7 @@ impl Stream for Connection // Receiving new frames may depend on ensuring that the write buffer // is clear (e.g. if window updates need to be sent), so `poll_ready` // is called here. - try_ready!(self.poll_ready()); + try_ready!(self.inner.poll_complete()); // If the snder sink is ready, we attempt to poll the underlying // stream once more because it, may have been made ready by flushing @@ -224,7 +224,7 @@ impl Stream for Connection } }; - trace!("received; frame={:?}", frame); + trace!("poll; frame={:?}", frame); let frame = match frame { Some(Headers(v)) => { // TODO: Update stream state @@ -304,12 +304,11 @@ impl Sink for Connection -> StartSend { use frame::Frame::Headers; - trace!("Connection::start_send"); + trace!("start_send"); - // First ensure that the upstream can process a new item. This ensures, for - // instance, that any pending local window updates have been sent to the remote - // before sending any other (i.e. DATA) frames. - if try!(self.poll_ready()).is_not_ready() { + // Ensure that a pending window update is sent before doing anything further. + if self.poll_send_window_update()? == Async::NotReady + || self.inner.poll_ready()? == Async::NotReady { return Ok(AsyncSink::NotReady(item)); } assert!(self.pending_send_window_update.is_none()); @@ -394,7 +393,7 @@ impl Sink for Connection } fn poll_complete(&mut self) -> Poll<(), ConnectionError> { - trace!("Connection::poll_complete"); + trace!("poll_complete"); try_ready!(self.inner.poll_complete()); self.poll_send_window_update() } @@ -406,7 +405,7 @@ impl ReadySink for Connection B: IntoBuf, { fn poll_ready(&mut self) -> Poll<(), Self::SinkError> { - trace!("Connection::poll_ready"); + trace!("poll_ready"); try_ready!(self.inner.poll_ready()); self.poll_send_window_update() } diff --git a/src/proto/settings.rs b/src/proto/settings.rs index c0db686..e4f8fb2 100644 --- a/src/proto/settings.rs +++ b/src/proto/settings.rs @@ -66,6 +66,7 @@ impl Settings } fn try_send_pending(&mut self) -> Poll<(), ConnectionError> { + trace!("try_send_pending; dirty={} acks={}", self.is_dirty, self.remaining_acks); if self.is_dirty { let frame = frame::Settings::new(self.local.clone()); try_ready!(self.try_send(frame)); @@ -84,15 +85,13 @@ impl Settings } fn try_send(&mut self, item: frame::Settings) -> Poll<(), ConnectionError> { - if let AsyncSink::NotReady(_) = try!(self.inner.start_send(item.into())) { - // TODO: I don't think this is needed actually... It was originally - // done to "satisfy the start_send" contract... - try!(self.inner.poll_complete()); - - return Ok(Async::NotReady); + trace!("try_send"); + if self.inner.start_send(item.into())?.is_ready() { + Ok(Async::Ready(())) + } else { + Ok(Async::NotReady) } - Ok(Async::Ready(())) } } @@ -146,7 +145,7 @@ impl Sink for Settings } fn poll_complete(&mut self) -> Poll<(), ConnectionError> { - trace!("Settings::poll_complete"); + trace!("poll_complete"); try_ready!(self.try_send_pending()); self.inner.poll_complete() } @@ -162,11 +161,9 @@ impl ReadySink for Settings T: ReadySink, { fn poll_ready(&mut self) -> Poll<(), ConnectionError> { - if try!(self.try_send_pending()).is_ready() { - return self.inner.poll_ready(); - } - - Ok(Async::NotReady) + trace!("poll_ready"); + try_ready!(self.try_send_pending()); + self.inner.poll_ready() } }