From c085a65bb6ffe82fa9fc9fa53a8515a52c308dcb Mon Sep 17 00:00:00 2001 From: Andreas Ley Date: Sun, 16 Jun 2024 15:16:34 +0200 Subject: [PATCH 1/8] Make ConnectionPool's `retryConnectionEstablishment` public --- Sources/AsyncHTTPClient/HTTPClient.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/AsyncHTTPClient/HTTPClient.swift b/Sources/AsyncHTTPClient/HTTPClient.swift index 6c5a9af20..d2f01e2c6 100644 --- a/Sources/AsyncHTTPClient/HTTPClient.swift +++ b/Sources/AsyncHTTPClient/HTTPClient.swift @@ -1025,7 +1025,7 @@ extension HTTPClient.Configuration { /// - warning: We highly recommend leaving this on. /// It is very common that connections establishment is flaky at scale. /// ``HTTPClient`` will automatically mitigate these kind of issues if this flag is turned on. - var retryConnectionEstablishment: Bool + public var retryConnectionEstablishment: Bool public init(idleTimeout: TimeAmount = .seconds(60)) { self.init(idleTimeout: idleTimeout, concurrentHTTP1ConnectionsPerHostSoftLimit: 8) From 1949fe66c511a78186ff0e968588118b068db2f2 Mon Sep 17 00:00:00 2001 From: Andreas Ley Date: Sun, 16 Jun 2024 15:36:26 +0200 Subject: [PATCH 2/8] Unified tests to consistently use `enableFastFailureModeForTesting()` --- .../HTTPClientNIOTSTests.swift | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/Tests/AsyncHTTPClientTests/HTTPClientNIOTSTests.swift b/Tests/AsyncHTTPClientTests/HTTPClientNIOTSTests.swift index be03f6a6a..3bbac632b 100644 --- a/Tests/AsyncHTTPClientTests/HTTPClientNIOTSTests.swift +++ b/Tests/AsyncHTTPClientTests/HTTPClientNIOTSTests.swift @@ -55,9 +55,8 @@ class HTTPClientNIOTSTests: XCTestCase { guard isTestingNIOTS() else { return } let httpBin = HTTPBin(.http1_1(ssl: true)) - var config = HTTPClient.Configuration() - config.networkFrameworkWaitForConnectivity = false - config.connectionPool.retryConnectionEstablishment = false + let config = HTTPClient.Configuration() + .enableFastFailureModeForTesting() let httpClient = HTTPClient(eventLoopGroupProvider: .shared(self.clientGroup), configuration: config) defer { @@ -84,9 +83,8 @@ class HTTPClientNIOTSTests: XCTestCase { guard isTestingNIOTS() else { return } #if canImport(Network) let httpBin = HTTPBin(.http1_1(ssl: false)) - var config = HTTPClient.Configuration() - config.networkFrameworkWaitForConnectivity = false - config.connectionPool.retryConnectionEstablishment = false + let config = HTTPClient.Configuration() + .enableFastFailureModeForTesting() let httpClient = HTTPClient(eventLoopGroupProvider: .shared(self.clientGroup), configuration: config) @@ -140,9 +138,8 @@ class HTTPClientNIOTSTests: XCTestCase { tlsConfig.minimumTLSVersion = .tlsv11 tlsConfig.maximumTLSVersion = .tlsv1 - var clientConfig = HTTPClient.Configuration(tlsConfiguration: tlsConfig) - clientConfig.networkFrameworkWaitForConnectivity = false - clientConfig.connectionPool.retryConnectionEstablishment = false + let clientConfig = HTTPClient.Configuration(tlsConfiguration: tlsConfig) + .enableFastFailureModeForTesting() let httpClient = HTTPClient( eventLoopGroupProvider: .shared(self.clientGroup), configuration: clientConfig From 8663dabfb2ba0f06c4f78e6f9e3917004a378179 Mon Sep 17 00:00:00 2001 From: Andreas Ley Date: Sun, 16 Jun 2024 15:45:11 +0200 Subject: [PATCH 3/8] Add `retryConnectionEstablishment` as optional parameter to the initializer of `HTTPClient.Configuration.ConnectionPool` --- Sources/AsyncHTTPClient/HTTPClient.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/AsyncHTTPClient/HTTPClient.swift b/Sources/AsyncHTTPClient/HTTPClient.swift index d2f01e2c6..5a159062b 100644 --- a/Sources/AsyncHTTPClient/HTTPClient.swift +++ b/Sources/AsyncHTTPClient/HTTPClient.swift @@ -1031,10 +1031,10 @@ extension HTTPClient.Configuration { self.init(idleTimeout: idleTimeout, concurrentHTTP1ConnectionsPerHostSoftLimit: 8) } - public init(idleTimeout: TimeAmount, concurrentHTTP1ConnectionsPerHostSoftLimit: Int) { + public init(idleTimeout: TimeAmount, concurrentHTTP1ConnectionsPerHostSoftLimit: Int, retryConnectionEstablishment: Bool = true) { self.idleTimeout = idleTimeout self.concurrentHTTP1ConnectionsPerHostSoftLimit = concurrentHTTP1ConnectionsPerHostSoftLimit - self.retryConnectionEstablishment = true + self.retryConnectionEstablishment = retryConnectionEstablishment } } From 1fe3f828fac8d1b34c21037247196d6c00731995 Mon Sep 17 00:00:00 2001 From: Andreas Ley Date: Mon, 17 Jun 2024 22:21:18 +0200 Subject: [PATCH 4/8] Reverted change to initializer to prevent API stability breakage --- Sources/AsyncHTTPClient/HTTPClient.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/AsyncHTTPClient/HTTPClient.swift b/Sources/AsyncHTTPClient/HTTPClient.swift index 5a159062b..d2f01e2c6 100644 --- a/Sources/AsyncHTTPClient/HTTPClient.swift +++ b/Sources/AsyncHTTPClient/HTTPClient.swift @@ -1031,10 +1031,10 @@ extension HTTPClient.Configuration { self.init(idleTimeout: idleTimeout, concurrentHTTP1ConnectionsPerHostSoftLimit: 8) } - public init(idleTimeout: TimeAmount, concurrentHTTP1ConnectionsPerHostSoftLimit: Int, retryConnectionEstablishment: Bool = true) { + public init(idleTimeout: TimeAmount, concurrentHTTP1ConnectionsPerHostSoftLimit: Int) { self.idleTimeout = idleTimeout self.concurrentHTTP1ConnectionsPerHostSoftLimit = concurrentHTTP1ConnectionsPerHostSoftLimit - self.retryConnectionEstablishment = retryConnectionEstablishment + self.retryConnectionEstablishment = true } } From 739a2f033e29a599c8de609e5c5dca86009b1e6e Mon Sep 17 00:00:00 2001 From: Andreas Ley Date: Mon, 17 Jun 2024 22:29:46 +0200 Subject: [PATCH 5/8] Add parameterless initializer for `HTTPClient.Configuration.ConnectionPool` --- Sources/AsyncHTTPClient/HTTPClient.swift | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Sources/AsyncHTTPClient/HTTPClient.swift b/Sources/AsyncHTTPClient/HTTPClient.swift index d2f01e2c6..e602c9409 100644 --- a/Sources/AsyncHTTPClient/HTTPClient.swift +++ b/Sources/AsyncHTTPClient/HTTPClient.swift @@ -1027,6 +1027,12 @@ extension HTTPClient.Configuration { /// ``HTTPClient`` will automatically mitigate these kind of issues if this flag is turned on. public var retryConnectionEstablishment: Bool + public init() { + self.idleTimeout = .seconds(60) + self.concurrentHTTP1ConnectionsPerHostSoftLimit = 8 + self.retryConnectionEstablishment = true + } + public init(idleTimeout: TimeAmount = .seconds(60)) { self.init(idleTimeout: idleTimeout, concurrentHTTP1ConnectionsPerHostSoftLimit: 8) } From e34a553f9bb04a7023a19e910b6b49e4fe4ceb37 Mon Sep 17 00:00:00 2001 From: Andreas Ley Date: Mon, 17 Jun 2024 22:35:11 +0200 Subject: [PATCH 6/8] Moved default values for `HTTPClient.Configuration.ConnectionPool` to the property declarations, so they only have to be specified at one point --- Sources/AsyncHTTPClient/HTTPClient.swift | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/Sources/AsyncHTTPClient/HTTPClient.swift b/Sources/AsyncHTTPClient/HTTPClient.swift index e602c9409..5e3f176f3 100644 --- a/Sources/AsyncHTTPClient/HTTPClient.swift +++ b/Sources/AsyncHTTPClient/HTTPClient.swift @@ -1012,11 +1012,11 @@ extension HTTPClient.Configuration { public struct ConnectionPool: Hashable, Sendable { /// Specifies amount of time connections are kept idle in the pool. After this time has passed without a new /// request the connections are closed. - public var idleTimeout: TimeAmount + public var idleTimeout: TimeAmount = .seconds(60) /// The maximum number of connections that are kept alive in the connection pool per host. If requests with /// an explicit eventLoopRequirement are sent, this number might be exceeded due to overflow connections. - public var concurrentHTTP1ConnectionsPerHostSoftLimit: Int + public var concurrentHTTP1ConnectionsPerHostSoftLimit: Int = 8 /// If true, ``HTTPClient`` will try to create new connections on connection failure with an exponential backoff. /// Requests will only fail after the ``HTTPClient/Configuration/Timeout-swift.struct/connect`` timeout exceeded. @@ -1025,22 +1025,17 @@ extension HTTPClient.Configuration { /// - warning: We highly recommend leaving this on. /// It is very common that connections establishment is flaky at scale. /// ``HTTPClient`` will automatically mitigate these kind of issues if this flag is turned on. - public var retryConnectionEstablishment: Bool + public var retryConnectionEstablishment: Bool = true - public init() { - self.idleTimeout = .seconds(60) - self.concurrentHTTP1ConnectionsPerHostSoftLimit = 8 - self.retryConnectionEstablishment = true - } - - public init(idleTimeout: TimeAmount = .seconds(60)) { - self.init(idleTimeout: idleTimeout, concurrentHTTP1ConnectionsPerHostSoftLimit: 8) + public init() {} + + public init(idleTimeout: TimeAmount) { + self.idleTimeout = idleTimeout } public init(idleTimeout: TimeAmount, concurrentHTTP1ConnectionsPerHostSoftLimit: Int) { self.idleTimeout = idleTimeout self.concurrentHTTP1ConnectionsPerHostSoftLimit = concurrentHTTP1ConnectionsPerHostSoftLimit - self.retryConnectionEstablishment = true } } From c6c65df6791c2c45725f8ac3f94c9ba14d39af30 Mon Sep 17 00:00:00 2001 From: Andreas Ley Date: Tue, 18 Jun 2024 12:30:19 +0200 Subject: [PATCH 7/8] Removed superfluous spaces Co-authored-by: Cory Benfield --- Sources/AsyncHTTPClient/HTTPClient.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Sources/AsyncHTTPClient/HTTPClient.swift b/Sources/AsyncHTTPClient/HTTPClient.swift index 5e3f176f3..127fba1cb 100644 --- a/Sources/AsyncHTTPClient/HTTPClient.swift +++ b/Sources/AsyncHTTPClient/HTTPClient.swift @@ -1028,7 +1028,6 @@ extension HTTPClient.Configuration { public var retryConnectionEstablishment: Bool = true public init() {} - public init(idleTimeout: TimeAmount) { self.idleTimeout = idleTimeout } From d3a2c35ae502a8f111672c5cf46c23f958101ef3 Mon Sep 17 00:00:00 2001 From: Andreas Ley Date: Tue, 18 Jun 2024 12:32:04 +0200 Subject: [PATCH 8/8] Re-added missing line break --- Sources/AsyncHTTPClient/HTTPClient.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Sources/AsyncHTTPClient/HTTPClient.swift b/Sources/AsyncHTTPClient/HTTPClient.swift index 127fba1cb..c52263318 100644 --- a/Sources/AsyncHTTPClient/HTTPClient.swift +++ b/Sources/AsyncHTTPClient/HTTPClient.swift @@ -1028,6 +1028,7 @@ extension HTTPClient.Configuration { public var retryConnectionEstablishment: Bool = true public init() {} + public init(idleTimeout: TimeAmount) { self.idleTimeout = idleTimeout }