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_CLIENT: StreamId = StreamId((u32::MAX >> 1) - 1);
|
||||
|
||||
/// Parse the stream ID
|
||||
#[inline]
|
||||
pub fn parse(buf: &[u8]) -> (StreamId, bool) {
|
||||
|
||||
@@ -383,14 +383,14 @@ where
|
||||
//
|
||||
// > A server that is attempting to gracefully shut down a connection
|
||||
// > 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
|
||||
// > requests is prohibited. After allowing time for any in-flight
|
||||
// > stream creation (at least one round-trip time), the server can
|
||||
// > send another GOAWAY frame with an updated last stream identifier.
|
||||
// > This ensures that a connection can be cleanly shut down without
|
||||
// > 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
|
||||
// for a pong before proceeding.
|
||||
|
||||
@@ -103,7 +103,7 @@ impl GoAway {
|
||||
pub fn should_close_on_idle(&self) -> bool {
|
||||
!self.close_now && self.going_away
|
||||
.as_ref()
|
||||
.map(|g| g.last_processed_id != StreamId::MAX_CLIENT)
|
||||
.map(|g| g.last_processed_id != StreamId::MAX)
|
||||
.unwrap_or(false)
|
||||
}
|
||||
|
||||
|
||||
@@ -245,7 +245,10 @@ fn graceful_shutdown() {
|
||||
.request("GET", "https://example.com/")
|
||||
.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::headers(1).response(200).eos())
|
||||
// Pretend this stream was sent while the GOAWAY was in flight
|
||||
|
||||
Reference in New Issue
Block a user