You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
We currently ignore the error code of the go away. I think if it is a protocol error we will never receive any further HTTP2Frame on the connection or any stream and need manually cancel all active streams. Maybe this is better handled at the nio http2 level but I'm not sure yet.
Reproducer:
func testGoAwayFromServerDoesntHangRequest()throws{//try XCTSkipIf(true, "this currently hangs")letbin=HTTPBin(.http2())defer{XCTAssertNoThrow(try bin.shutdown())}letloggerFactor=StreamLogHandler.standardOutput(label:)varbgLogger=Logger(label:"BG", factory: loggerFactor)
bgLogger.logLevel =.trace
letclient=HTTPClient(
eventLoopGroupProvider:.createNew,
configuration:.init(certificateVerification:.none),
backgroundActivityLogger: bgLogger
)defer{XCTAssertNoThrow(try client.syncShutdown())}varrequest=tryHTTPClient.Request(url: bin.baseURL, method:.POST)// add ~64 KB headerletheaderValue=String(repeating:"0", count:1024)
for headerID in 0..<64{
request.headers.replaceOrAdd(name:"larg-header-\(headerID)", value: headerValue)}// non empty body is important to trigger this bug as we otherwise finish the request in a single flush
request.body =.byteBuffer(ByteBuffer(bytes:[0]))varrqLogger=Logger(label:"RQ", factory: loggerFactor)
rqLogger.logLevel =.trace
XCTAssertThrows(try client.execute(request: request, deadline:.distantFuture, logger: rqLogger).wait())}
The text was updated successfully, but these errors were encountered:
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 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 MAY send another GOAWAY frame with an updated last stream identifier. This ensures that a connection can be cleanly shut down without losing requests.¶
However, the error code is protocol error and not no error.
Yeah, this isn't graceful shutdown, it's definitely an error. But PROTOCOL_ERROR doesn't necessarily imply that the connection is lost, merely that a protocol error was committed. If the server wants us to stop talking, it needs to be more emphatic than this.
We currently ignore the error code of the go away. I think if it is a protocol error we will never receive any further HTTP2Frame on the connection or any stream and need manually cancel all active streams. Maybe this is better handled at the nio http2 level but I'm not sure yet.
Reproducer:
The text was updated successfully, but these errors were encountered: