Client::poll_ready() returns an Error if next stream ID would overflow (#103)

Closes #102
This commit is contained in:
Sean McArthur
2017-09-19 14:16:32 -07:00
committed by GitHub
parent 0c8bd75224
commit db8c109817
5 changed files with 17 additions and 6 deletions

View File

@@ -91,7 +91,7 @@ where
/// Returns `Ready` when the connection can initialize a new HTTP 2.0 /// Returns `Ready` when the connection can initialize a new HTTP 2.0
/// stream. /// stream.
pub fn poll_ready(&mut self) -> Poll<(), ::Error> { pub fn poll_ready(&mut self) -> Poll<(), ::Error> {
Ok(self.connection.poll_send_request_ready()) self.connection.poll_send_request_ready()
} }
/// Send a request on a new HTTP 2.0 stream /// Send a request on a new HTTP 2.0 stream

View File

@@ -250,7 +250,7 @@ where
B: IntoBuf, B: IntoBuf,
{ {
/// Returns `Ready` when new the connection is able to support a new request stream. /// Returns `Ready` when new the connection is able to support a new request stream.
pub fn poll_send_request_ready(&mut self) -> Async<()> { pub fn poll_send_request_ready(&mut self) -> Poll<(), ::Error> {
self.streams.poll_send_request_ready() self.streams.poll_send_request_ready()
} }

View File

@@ -299,6 +299,10 @@ where
Ok(()) Ok(())
} }
pub fn ensure_next_stream_id(&self) -> Result<StreamId, UserError> {
self.next_stream_id.map_err(|_| OverflowedStreamId)
}
/// Returns a new StreamId if the local actor can initiate a new stream. /// Returns a new StreamId if the local actor can initiate a new stream.
fn try_open(&self) -> Result<StreamId, UserError> { fn try_open(&self) -> Result<StreamId, UserError> {
if P::is_server() { if P::is_server() {
@@ -306,6 +310,6 @@ where
return Err(UnexpectedFrameType); return Err(UnexpectedFrameType);
} }
self.next_stream_id.map_err(|_| OverflowedStreamId) self.ensure_next_stream_id()
} }
} }

View File

@@ -403,11 +403,13 @@ impl<B> Streams<B, client::Peer>
where where
B: Buf, B: Buf,
{ {
pub fn poll_send_request_ready(&mut self) -> Async<()> { pub fn poll_send_request_ready(&mut self) -> Poll<(), ::Error> {
let mut me = self.inner.lock().unwrap(); let mut me = self.inner.lock().unwrap();
let me = &mut *me; let me = &mut *me;
me.counts.poll_open_ready() me.actions.send.ensure_next_stream_id()?;
Ok(me.counts.poll_open_ready())
} }
} }

View File

@@ -85,7 +85,12 @@ fn request_stream_id_overflows() {
.body(()) .body(())
.unwrap(); .unwrap();
// second cant use the next stream id, it's over
// second cannot use the next stream id, it's over
let poll_err = h2.poll_ready().unwrap_err();
assert_eq!(poll_err.to_string(), "user error: stream ID overflowed");
let err = h2.send_request(request, true).unwrap_err(); let err = h2.send_request(request, true).unwrap_err();
assert_eq!(err.to_string(), "user error: stream ID overflowed"); assert_eq!(err.to_string(), "user error: stream ID overflowed");