Client::poll_ready() returns an Error if next stream ID would overflow (#103)
Closes #102
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user