Skip to content

Commit a220837

Browse files
authored
Disable SETTINGS_ENABLE_PUSH HTTP/2 setting (#741)
1 parent fb308ee commit a220837

File tree

3 files changed

+28
-6
lines changed

3 files changed

+28
-6
lines changed

Sources/AsyncHTTPClient/ConnectionPool/HTTP2/HTTP2Connection.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ struct HTTP2PushNotSupportedError: Error {}
2929
struct HTTP2ReceivedGoAwayBeforeSettingsError: Error {}
3030

3131
final class HTTP2Connection {
32+
internal static let defaultSettings = nioDefaultSettings + [HTTP2Setting(parameter: .enablePush, value: 0)]
33+
3234
let channel: Channel
3335
let multiplexer: HTTP2StreamMultiplexer
3436
let logger: Logger
@@ -196,7 +198,7 @@ final class HTTP2Connection {
196198
// can be scheduled on this connection.
197199
let sync = self.channel.pipeline.syncOperations
198200

199-
let http2Handler = NIOHTTP2Handler(mode: .client, initialSettings: nioDefaultSettings)
201+
let http2Handler = NIOHTTP2Handler(mode: .client, initialSettings: Self.defaultSettings)
200202
let idleHandler = HTTP2IdleHandler(delegate: self, logger: self.logger, maximumConnectionUses: self.maximumConnectionUses)
201203

202204
try sync.addHandler(http2Handler, position: .last)

Tests/AsyncHTTPClientTests/HTTP2ConnectionTests.swift

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import NIOConcurrencyHelpers
1818
import NIOCore
1919
import NIOEmbedded
2020
import NIOHTTP1
21+
import NIOHTTP2
2122
import NIOPosix
2223
import NIOSSL
2324
import NIOTestUtils
@@ -338,6 +339,28 @@ class HTTP2ConnectionTests: XCTestCase {
338339
}
339340
XCTAssertLessThan(retryCount, maxRetries)
340341
}
342+
343+
func testServerPushIsDisabled() {
344+
let embedded = EmbeddedChannel()
345+
let logger = Logger(label: "test.http2.connection")
346+
let connection = HTTP2Connection(
347+
channel: embedded,
348+
connectionID: 0,
349+
decompression: .disabled,
350+
maximumConnectionUses: nil,
351+
delegate: TestHTTP2ConnectionDelegate(),
352+
logger: logger
353+
)
354+
_ = connection._start0()
355+
356+
let settingsFrame = HTTP2Frame(streamID: 0, payload: .settings(.settings([])))
357+
XCTAssertNoThrow(try connection.channel.writeAndFlush(settingsFrame).wait())
358+
359+
let pushPromiseFrame = HTTP2Frame(streamID: 0, payload: .pushPromise(.init(pushedStreamID: 1, headers: [:])))
360+
XCTAssertThrowsError(try connection.channel.writeAndFlush(pushPromiseFrame).wait()) { error in
361+
XCTAssertNotNil(error as? NIOHTTP2Errors.PushInViolationOfSetting)
362+
}
363+
}
341364
}
342365

343366
class TestConnectionCreator {

Tests/AsyncHTTPClientTests/HTTPClientTestUtils.swift

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15-
import AsyncHTTPClient
15+
@testable import AsyncHTTPClient
1616
import Atomics
1717
import Foundation
1818
import Logging
@@ -361,10 +361,7 @@ internal final class HTTPBin<RequestHandler: ChannelInboundHandler> where
361361
var httpSettings: HTTP2Settings {
362362
switch self {
363363
case .http1_1, .http2(_, _, nil), .refuse:
364-
return [
365-
HTTP2Setting(parameter: .maxConcurrentStreams, value: 10),
366-
HTTP2Setting(parameter: .maxHeaderListSize, value: HPACKDecoder.defaultMaxHeaderListSize),
367-
]
364+
return HTTP2Connection.defaultSettings
368365
case .http2(_, _, .some(let customSettings)):
369366
return customSettings
370367
}

0 commit comments

Comments
 (0)