From a22083713ee90808d527d0baa290c2fb13ca3096 Mon Sep 17 00:00:00 2001 From: Gustavo Cairo Date: Wed, 1 May 2024 12:49:09 +0100 Subject: [PATCH] Disable SETTINGS_ENABLE_PUSH HTTP/2 setting (#741) --- .../HTTP2/HTTP2Connection.swift | 4 +++- .../HTTP2ConnectionTests.swift | 23 +++++++++++++++++++ .../HTTPClientTestUtils.swift | 7 ++---- 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/Sources/AsyncHTTPClient/ConnectionPool/HTTP2/HTTP2Connection.swift b/Sources/AsyncHTTPClient/ConnectionPool/HTTP2/HTTP2Connection.swift index 2c3c3cc0a..ab43558c0 100644 --- a/Sources/AsyncHTTPClient/ConnectionPool/HTTP2/HTTP2Connection.swift +++ b/Sources/AsyncHTTPClient/ConnectionPool/HTTP2/HTTP2Connection.swift @@ -29,6 +29,8 @@ struct HTTP2PushNotSupportedError: Error {} struct HTTP2ReceivedGoAwayBeforeSettingsError: Error {} final class HTTP2Connection { + internal static let defaultSettings = nioDefaultSettings + [HTTP2Setting(parameter: .enablePush, value: 0)] + let channel: Channel let multiplexer: HTTP2StreamMultiplexer let logger: Logger @@ -196,7 +198,7 @@ final class HTTP2Connection { // can be scheduled on this connection. let sync = self.channel.pipeline.syncOperations - let http2Handler = NIOHTTP2Handler(mode: .client, initialSettings: nioDefaultSettings) + let http2Handler = NIOHTTP2Handler(mode: .client, initialSettings: Self.defaultSettings) let idleHandler = HTTP2IdleHandler(delegate: self, logger: self.logger, maximumConnectionUses: self.maximumConnectionUses) try sync.addHandler(http2Handler, position: .last) diff --git a/Tests/AsyncHTTPClientTests/HTTP2ConnectionTests.swift b/Tests/AsyncHTTPClientTests/HTTP2ConnectionTests.swift index 15e5cdff2..2e82fafba 100644 --- a/Tests/AsyncHTTPClientTests/HTTP2ConnectionTests.swift +++ b/Tests/AsyncHTTPClientTests/HTTP2ConnectionTests.swift @@ -18,6 +18,7 @@ import NIOConcurrencyHelpers import NIOCore import NIOEmbedded import NIOHTTP1 +import NIOHTTP2 import NIOPosix import NIOSSL import NIOTestUtils @@ -338,6 +339,28 @@ class HTTP2ConnectionTests: XCTestCase { } XCTAssertLessThan(retryCount, maxRetries) } + + func testServerPushIsDisabled() { + let embedded = EmbeddedChannel() + let logger = Logger(label: "test.http2.connection") + let connection = HTTP2Connection( + channel: embedded, + connectionID: 0, + decompression: .disabled, + maximumConnectionUses: nil, + delegate: TestHTTP2ConnectionDelegate(), + logger: logger + ) + _ = connection._start0() + + let settingsFrame = HTTP2Frame(streamID: 0, payload: .settings(.settings([]))) + XCTAssertNoThrow(try connection.channel.writeAndFlush(settingsFrame).wait()) + + let pushPromiseFrame = HTTP2Frame(streamID: 0, payload: .pushPromise(.init(pushedStreamID: 1, headers: [:]))) + XCTAssertThrowsError(try connection.channel.writeAndFlush(pushPromiseFrame).wait()) { error in + XCTAssertNotNil(error as? NIOHTTP2Errors.PushInViolationOfSetting) + } + } } class TestConnectionCreator { diff --git a/Tests/AsyncHTTPClientTests/HTTPClientTestUtils.swift b/Tests/AsyncHTTPClientTests/HTTPClientTestUtils.swift index 2d37b1387..7f28040c2 100644 --- a/Tests/AsyncHTTPClientTests/HTTPClientTestUtils.swift +++ b/Tests/AsyncHTTPClientTests/HTTPClientTestUtils.swift @@ -12,7 +12,7 @@ // //===----------------------------------------------------------------------===// -import AsyncHTTPClient +@testable import AsyncHTTPClient import Atomics import Foundation import Logging @@ -361,10 +361,7 @@ internal final class HTTPBin where var httpSettings: HTTP2Settings { switch self { case .http1_1, .http2(_, _, nil), .refuse: - return [ - HTTP2Setting(parameter: .maxConcurrentStreams, value: 10), - HTTP2Setting(parameter: .maxHeaderListSize, value: HPACKDecoder.defaultMaxHeaderListSize), - ] + return HTTP2Connection.defaultSettings case .http2(_, _, .some(let customSettings)): return customSettings }