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