Skip to content

HTTP2 go away at the protocol level lets the request hang #660

Open
@dnadoba

Description

@dnadoba

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")
        let bin = HTTPBin(.http2())
        defer { XCTAssertNoThrow(try bin.shutdown()) }
        
        let loggerFactor = StreamLogHandler.standardOutput(label:)
        var bgLogger = Logger(label: "BG", factory: loggerFactor)
        bgLogger.logLevel = .trace
        
        let client = HTTPClient(
            eventLoopGroupProvider: .createNew,
            configuration: .init(certificateVerification: .none),
            backgroundActivityLogger: bgLogger
        )
        
        defer { XCTAssertNoThrow(try client.syncShutdown()) }
        
        var request = try HTTPClient.Request(url: bin.baseURL, method: .POST)
        // add ~64 KB header
        let headerValue = 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]))

        var rqLogger = Logger(label: "RQ", factory: loggerFactor)
        rqLogger.logLevel = .trace
        
        XCTAssertThrows(try client.execute(request: request, deadline: .distantFuture, logger: rqLogger).wait())
    }

Metadata

Metadata

Assignees

No one assigned

    Labels

    kind/bugFeature doesn't work as expected.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions