Skip to content

http2: fix client GOAWAY to send valid Last-Stream-ID - #256

Open
waterWang wants to merge 1 commit into
golang:masterfrom
waterWang:fix/goaway-last-stream-id
Open

http2: fix client GOAWAY to send valid Last-Stream-ID#256
waterWang wants to merge 1 commit into
golang:masterfrom
waterWang:fix/goaway-last-stream-id

Conversation

@waterWang

Copy link
Copy Markdown

Fixes golang/go#80759

Problem

Client-initiated GOAWAY uses cc.nextStreamID (odd) as Last-Stream-ID.
RFC 9113 §6.8 requires Last-Stream-ID to be in the receiver's stream-id
space — for a client's GOAWAY, that's server-initiated (even) or 0.
Strict servers (nghttp2, Envoy with nghttp2 codec) reject the frame
as PROTOCOL_ERROR.

Fix

Changed maxStreamID := cc.nextStreamID to maxStreamID := uint32(0) in
sendGoAway(). The client has no server-initiated streams (push is off),
so 0 is correct and accepted by all servers.

Testing

  • No behavioral change for non-nghttp2 servers (they accept the previous
    odd value too, but 0 is also valid per spec)
  • Fixes the PROTOCOL_ERROR on nghttp2 servers
  • Existing tests cover the GOAWAY path

Client-initiated GOAWAY must have Last-Stream-ID in the server's
stream-id space (even) or 0. The odd nextStreamID is invalid there,
so strict HTTP/2 servers (nghttp2) reject the frame as PROTOCOL_ERROR.
Since the client has no server-initiated streams (push is off), 0 is
correct and accepted by all servers.

Fixes golang/go#80759
@google-cla

google-cla Bot commented Aug 6, 2026

Copy link
Copy Markdown

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

x/net/http2: client GOAWAY uses an odd (client) Last-Stream-ID, rejected as PROTOCOL_ERROR by nghttp2 servers

2 participants