send proper max stream ID in graceful goaway (#254)
This commit is contained in:
@@ -14,8 +14,6 @@ impl StreamId {
|
|||||||
|
|
||||||
pub const MAX: StreamId = StreamId(u32::MAX >> 1);
|
pub const MAX: StreamId = StreamId(u32::MAX >> 1);
|
||||||
|
|
||||||
pub const MAX_CLIENT: StreamId = StreamId((u32::MAX >> 1) - 1);
|
|
||||||
|
|
||||||
/// Parse the stream ID
|
/// Parse the stream ID
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn parse(buf: &[u8]) -> (StreamId, bool) {
|
pub fn parse(buf: &[u8]) -> (StreamId, bool) {
|
||||||
|
|||||||
@@ -383,14 +383,14 @@ where
|
|||||||
//
|
//
|
||||||
// > A server that is attempting to gracefully shut down a connection
|
// > A server that is attempting to gracefully shut down a connection
|
||||||
// > SHOULD send an initial GOAWAY frame with the last stream
|
// > SHOULD send an initial GOAWAY frame with the last stream
|
||||||
// > identifier set to 231-1 and a NO_ERROR code. This signals to the
|
// > identifier set to 2^31-1 and a NO_ERROR code. This signals to the
|
||||||
// > client that a shutdown is imminent and that initiating further
|
// > client that a shutdown is imminent and that initiating further
|
||||||
// > requests is prohibited. After allowing time for any in-flight
|
// > requests is prohibited. After allowing time for any in-flight
|
||||||
// > stream creation (at least one round-trip time), the server can
|
// > stream creation (at least one round-trip time), the server can
|
||||||
// > send another GOAWAY frame with an updated last stream identifier.
|
// > send another GOAWAY frame with an updated last stream identifier.
|
||||||
// > This ensures that a connection can be cleanly shut down without
|
// > This ensures that a connection can be cleanly shut down without
|
||||||
// > losing requests.
|
// > losing requests.
|
||||||
self.go_away(StreamId::MAX_CLIENT, Reason::NO_ERROR);
|
self.go_away(StreamId::MAX, Reason::NO_ERROR);
|
||||||
|
|
||||||
// We take the advice of waiting 1 RTT literally, and wait
|
// We take the advice of waiting 1 RTT literally, and wait
|
||||||
// for a pong before proceeding.
|
// for a pong before proceeding.
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ impl GoAway {
|
|||||||
pub fn should_close_on_idle(&self) -> bool {
|
pub fn should_close_on_idle(&self) -> bool {
|
||||||
!self.close_now && self.going_away
|
!self.close_now && self.going_away
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|g| g.last_processed_id != StreamId::MAX_CLIENT)
|
.map(|g| g.last_processed_id != StreamId::MAX)
|
||||||
.unwrap_or(false)
|
.unwrap_or(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -245,7 +245,10 @@ fn graceful_shutdown() {
|
|||||||
.request("GET", "https://example.com/")
|
.request("GET", "https://example.com/")
|
||||||
.eos(),
|
.eos(),
|
||||||
)
|
)
|
||||||
.recv_frame(frames::go_away(StreamId::MAX_CLIENT))
|
// 2^31 - 1 = 2147483647
|
||||||
|
// Note: not using a constant in the library because library devs
|
||||||
|
// can be unsmart.
|
||||||
|
.recv_frame(frames::go_away(2147483647))
|
||||||
.recv_frame(frames::ping(frame::Ping::SHUTDOWN))
|
.recv_frame(frames::ping(frame::Ping::SHUTDOWN))
|
||||||
.recv_frame(frames::headers(1).response(200).eos())
|
.recv_frame(frames::headers(1).response(200).eos())
|
||||||
// Pretend this stream was sent while the GOAWAY was in flight
|
// Pretend this stream was sent while the GOAWAY was in flight
|
||||||
|
|||||||
Reference in New Issue
Block a user