Skip to content

Commit 2e6a64a

Browse files
authoredJul 17, 2020
add a separate configuration struct for pool (#284)
* add a separate configuration struct for pool * review fixes * review fix
1 parent 96a803e commit 2e6a64a

File tree

4 files changed

+24
-14
lines changed

4 files changed

+24
-14
lines changed
 

‎Package.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ let package = Package(
2121
.library(name: "AsyncHTTPClient", targets: ["AsyncHTTPClient"]),
2222
],
2323
dependencies: [
24-
.package(url: "https://github.com/apple/swift-nio.git", from: "2.18.0"),
24+
.package(url: "https://github.com/apple/swift-nio.git", from: "2.19.0"),
2525
.package(url: "https://github.com/apple/swift-nio-ssl.git", from: "2.8.0"),
2626
.package(url: "https://github.com/apple/swift-nio-extras.git", from: "1.3.0"),
2727
.package(url: "https://github.com/apple/swift-nio-transport-services.git", from: "1.5.1"),

‎Sources/AsyncHTTPClient/ConnectionPool.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ class HTTP1ConnectionProvider {
353353
case .park(let connection):
354354
logger.trace("parking connection",
355355
metadata: ["ahc-connection": "\(connection)"])
356-
connection.setIdleTimeout(timeout: self.configuration.maximumAllowedIdleTimeInConnectionPool,
356+
connection.setIdleTimeout(timeout: self.configuration.poolConfiguration.idleTimeout,
357357
logger: self.backgroundActivityLogger)
358358
case .closeProvider:
359359
logger.debug("closing provider",
@@ -365,7 +365,7 @@ class HTTP1ConnectionProvider {
365365
logger.trace("parking connection & doing further action",
366366
metadata: ["ahc-connection": "\(connection)",
367367
"ahc-action": "\(action)"])
368-
connection.setIdleTimeout(timeout: self.configuration.maximumAllowedIdleTimeInConnectionPool,
368+
connection.setIdleTimeout(timeout: self.configuration.poolConfiguration.idleTimeout,
369369
logger: self.backgroundActivityLogger)
370370
self.execute(action, logger: logger)
371371
case .closeAnd(let connection, let action):

‎Sources/AsyncHTTPClient/HTTPClient.swift

+19-9
Original file line numberDiff line numberDiff line change
@@ -641,8 +641,8 @@ public class HTTPClient {
641641
public var redirectConfiguration: RedirectConfiguration
642642
/// Default client timeout, defaults to no timeouts.
643643
public var timeout: Timeout
644-
/// Timeout of pooled connections
645-
public var maximumAllowedIdleTimeInConnectionPool: Optional<TimeAmount>
644+
/// Connection pool configuration.
645+
public var poolConfiguration: PoolConfiguration
646646
/// Upstream proxy, defaults to no proxy.
647647
public var proxy: Proxy?
648648
/// Enables automatic body decompression. Supported algorithms are gzip and deflate.
@@ -653,14 +653,14 @@ public class HTTPClient {
653653
public init(tlsConfiguration: TLSConfiguration? = nil,
654654
redirectConfiguration: RedirectConfiguration? = nil,
655655
timeout: Timeout = Timeout(),
656-
maximumAllowedIdleTimeInConnectionPool: TimeAmount,
656+
poolConfiguration: PoolConfiguration = PoolConfiguration(),
657657
proxy: Proxy? = nil,
658658
ignoreUncleanSSLShutdown: Bool = false,
659659
decompression: Decompression = .disabled) {
660660
self.tlsConfiguration = tlsConfiguration
661661
self.redirectConfiguration = redirectConfiguration ?? RedirectConfiguration()
662662
self.timeout = timeout
663-
self.maximumAllowedIdleTimeInConnectionPool = maximumAllowedIdleTimeInConnectionPool
663+
self.poolConfiguration = poolConfiguration
664664
self.proxy = proxy
665665
self.ignoreUncleanSSLShutdown = ignoreUncleanSSLShutdown
666666
self.decompression = decompression
@@ -676,7 +676,7 @@ public class HTTPClient {
676676
tlsConfiguration: tlsConfiguration,
677677
redirectConfiguration: redirectConfiguration,
678678
timeout: timeout,
679-
maximumAllowedIdleTimeInConnectionPool: .seconds(60),
679+
poolConfiguration: PoolConfiguration(),
680680
proxy: proxy,
681681
ignoreUncleanSSLShutdown: ignoreUncleanSSLShutdown,
682682
decompression: decompression
@@ -693,7 +693,7 @@ public class HTTPClient {
693693
self.init(tlsConfiguration: TLSConfiguration.forClient(certificateVerification: certificateVerification),
694694
redirectConfiguration: redirectConfiguration,
695695
timeout: timeout,
696-
maximumAllowedIdleTimeInConnectionPool: maximumAllowedIdleTimeInConnectionPool,
696+
poolConfiguration: PoolConfiguration(),
697697
proxy: proxy,
698698
ignoreUncleanSSLShutdown: ignoreUncleanSSLShutdown,
699699
decompression: decompression)
@@ -702,15 +702,15 @@ public class HTTPClient {
702702
public init(certificateVerification: CertificateVerification,
703703
redirectConfiguration: RedirectConfiguration? = nil,
704704
timeout: Timeout = Timeout(),
705-
maximumAllowedIdleTimeInConnectionPool: TimeAmount = .seconds(60),
705+
poolConfiguration: TimeAmount = .seconds(60),
706706
proxy: Proxy? = nil,
707707
ignoreUncleanSSLShutdown: Bool = false,
708708
decompression: Decompression = .disabled,
709709
backgroundActivityLogger: Logger?) {
710710
self.init(tlsConfiguration: TLSConfiguration.forClient(certificateVerification: certificateVerification),
711711
redirectConfiguration: redirectConfiguration,
712712
timeout: timeout,
713-
maximumAllowedIdleTimeInConnectionPool: maximumAllowedIdleTimeInConnectionPool,
713+
poolConfiguration: PoolConfiguration(),
714714
proxy: proxy,
715715
ignoreUncleanSSLShutdown: ignoreUncleanSSLShutdown,
716716
decompression: decompression)
@@ -811,7 +811,7 @@ public class HTTPClient {
811811
}
812812

813813
extension HTTPClient.Configuration {
814-
/// Timeout configuration
814+
/// Timeout configuration.
815815
public struct Timeout {
816816
/// Specifies connect timeout.
817817
public var connect: TimeAmount?
@@ -860,6 +860,16 @@ extension HTTPClient.Configuration {
860860
/// - warning: Cycle detection will keep all visited URLs in memory which means a malicious server could use this as a denial-of-service vector.
861861
public static func follow(max: Int, allowCycles: Bool) -> RedirectConfiguration { return .init(configuration: .follow(max: max, allowCycles: allowCycles)) }
862862
}
863+
864+
/// Connection pool configuration.
865+
public struct PoolConfiguration: Hashable {
866+
// Specifies amount of time connections are kept idle in the pool.
867+
public var idleTimeout: TimeAmount
868+
869+
public init(idleTimeout: TimeAmount = .seconds(60)) {
870+
self.idleTimeout = idleTimeout
871+
}
872+
}
863873
}
864874

865875
extension ChannelPipeline {

‎Tests/AsyncHTTPClientTests/HTTPClientTests.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -1742,7 +1742,7 @@ class HTTPClientTests: XCTestCase {
17421742

17431743
func testPoolClosesIdleConnections() {
17441744
let localClient = HTTPClient(eventLoopGroupProvider: .shared(self.clientGroup),
1745-
configuration: .init(maximumAllowedIdleTimeInConnectionPool: .milliseconds(100)))
1745+
configuration: .init(poolConfiguration: .init(idleTimeout: .milliseconds(100))))
17461746
defer {
17471747
XCTAssertNoThrow(try localClient.syncShutdown())
17481748
}
@@ -1753,7 +1753,7 @@ class HTTPClientTests: XCTestCase {
17531753

17541754
func testRacePoolIdleConnectionsAndGet() {
17551755
let localClient = HTTPClient(eventLoopGroupProvider: .shared(self.clientGroup),
1756-
configuration: .init(maximumAllowedIdleTimeInConnectionPool: .milliseconds(10)))
1756+
configuration: .init(poolConfiguration: .init(idleTimeout: .milliseconds(10))))
17571757
defer {
17581758
XCTAssertNoThrow(try localClient.syncShutdown())
17591759
}

0 commit comments

Comments
 (0)
Please sign in to comment.