Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ let package = Package(
.library(name: "AsyncHTTPClient", targets: ["AsyncHTTPClient"]),
],
dependencies: [
.package(url: "https://github.com/apple/swift-nio.git", from: "2.18.0"),
.package(url: "https://github.com/apple/swift-nio.git", from: "2.19.0"),
.package(url: "https://github.com/apple/swift-nio-ssl.git", from: "2.8.0"),
.package(url: "https://github.com/apple/swift-nio-extras.git", from: "1.3.0"),
.package(url: "https://github.com/apple/swift-nio-transport-services.git", from: "1.5.1"),
Expand Down
4 changes: 2 additions & 2 deletions Sources/AsyncHTTPClient/ConnectionPool.swift
Original file line number Diff line number Diff line change
Expand Up @@ -353,7 +353,7 @@ class HTTP1ConnectionProvider {
case .park(let connection):
logger.trace("parking connection",
metadata: ["ahc-connection": "\(connection)"])
connection.setIdleTimeout(timeout: self.configuration.maximumAllowedIdleTimeInConnectionPool,
connection.setIdleTimeout(timeout: self.configuration.poolConfiguration.idleTimeout,
logger: self.backgroundActivityLogger)
case .closeProvider:
logger.debug("closing provider",
Expand All @@ -365,7 +365,7 @@ class HTTP1ConnectionProvider {
logger.trace("parking connection & doing further action",
metadata: ["ahc-connection": "\(connection)",
"ahc-action": "\(action)"])
connection.setIdleTimeout(timeout: self.configuration.maximumAllowedIdleTimeInConnectionPool,
connection.setIdleTimeout(timeout: self.configuration.poolConfiguration.idleTimeout,
logger: self.backgroundActivityLogger)
self.execute(action, logger: logger)
case .closeAnd(let connection, let action):
Expand Down
28 changes: 19 additions & 9 deletions Sources/AsyncHTTPClient/HTTPClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -641,8 +641,8 @@ public class HTTPClient {
public var redirectConfiguration: RedirectConfiguration
/// Default client timeout, defaults to no timeouts.
public var timeout: Timeout
/// Timeout of pooled connections
public var maximumAllowedIdleTimeInConnectionPool: Optional<TimeAmount>
/// Connection pool configuration.
public var poolConfiguration: PoolConfiguration
/// Upstream proxy, defaults to no proxy.
public var proxy: Proxy?
/// Enables automatic body decompression. Supported algorithms are gzip and deflate.
Expand All @@ -653,14 +653,14 @@ public class HTTPClient {
public init(tlsConfiguration: TLSConfiguration? = nil,
redirectConfiguration: RedirectConfiguration? = nil,
timeout: Timeout = Timeout(),
maximumAllowedIdleTimeInConnectionPool: TimeAmount,
poolConfiguration: PoolConfiguration = PoolConfiguration(),
proxy: Proxy? = nil,
ignoreUncleanSSLShutdown: Bool = false,
decompression: Decompression = .disabled) {
self.tlsConfiguration = tlsConfiguration
self.redirectConfiguration = redirectConfiguration ?? RedirectConfiguration()
self.timeout = timeout
self.maximumAllowedIdleTimeInConnectionPool = maximumAllowedIdleTimeInConnectionPool
self.poolConfiguration = poolConfiguration
self.proxy = proxy
self.ignoreUncleanSSLShutdown = ignoreUncleanSSLShutdown
self.decompression = decompression
Expand All @@ -676,7 +676,7 @@ public class HTTPClient {
tlsConfiguration: tlsConfiguration,
redirectConfiguration: redirectConfiguration,
timeout: timeout,
maximumAllowedIdleTimeInConnectionPool: .seconds(60),
poolConfiguration: PoolConfiguration(),
proxy: proxy,
ignoreUncleanSSLShutdown: ignoreUncleanSSLShutdown,
decompression: decompression
Expand All @@ -693,7 +693,7 @@ public class HTTPClient {
self.init(tlsConfiguration: TLSConfiguration.forClient(certificateVerification: certificateVerification),
redirectConfiguration: redirectConfiguration,
timeout: timeout,
maximumAllowedIdleTimeInConnectionPool: maximumAllowedIdleTimeInConnectionPool,
poolConfiguration: PoolConfiguration(),
proxy: proxy,
ignoreUncleanSSLShutdown: ignoreUncleanSSLShutdown,
decompression: decompression)
Expand All @@ -702,15 +702,15 @@ public class HTTPClient {
public init(certificateVerification: CertificateVerification,
redirectConfiguration: RedirectConfiguration? = nil,
timeout: Timeout = Timeout(),
maximumAllowedIdleTimeInConnectionPool: TimeAmount = .seconds(60),
poolConfiguration: TimeAmount = .seconds(60),
proxy: Proxy? = nil,
ignoreUncleanSSLShutdown: Bool = false,
decompression: Decompression = .disabled,
backgroundActivityLogger: Logger?) {
self.init(tlsConfiguration: TLSConfiguration.forClient(certificateVerification: certificateVerification),
redirectConfiguration: redirectConfiguration,
timeout: timeout,
maximumAllowedIdleTimeInConnectionPool: maximumAllowedIdleTimeInConnectionPool,
poolConfiguration: PoolConfiguration(),
proxy: proxy,
ignoreUncleanSSLShutdown: ignoreUncleanSSLShutdown,
decompression: decompression)
Expand Down Expand Up @@ -811,7 +811,7 @@ public class HTTPClient {
}

extension HTTPClient.Configuration {
/// Timeout configuration
/// Timeout configuration.
public struct Timeout {
/// Specifies connect timeout.
public var connect: TimeAmount?
Expand Down Expand Up @@ -860,6 +860,16 @@ extension HTTPClient.Configuration {
/// - warning: Cycle detection will keep all visited URLs in memory which means a malicious server could use this as a denial-of-service vector.
public static func follow(max: Int, allowCycles: Bool) -> RedirectConfiguration { return .init(configuration: .follow(max: max, allowCycles: allowCycles)) }
}

/// Connection pool configuration.
public struct PoolConfiguration: Hashable {
// Specifies amount of time connections are kept idle in the pool.
var idleTimeout: TimeAmount
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Whoops, nearly missed this.

Suggested change
var idleTimeout: TimeAmount
public var idleTimeout: TimeAmount

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🙏

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed!


public init(idleTimeout: TimeAmount = .seconds(60)) {
self.idleTimeout = idleTimeout
}
}
}

extension ChannelPipeline {
Expand Down
4 changes: 2 additions & 2 deletions Tests/AsyncHTTPClientTests/HTTPClientTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1742,7 +1742,7 @@ class HTTPClientTests: XCTestCase {

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

func testRacePoolIdleConnectionsAndGet() {
let localClient = HTTPClient(eventLoopGroupProvider: .shared(self.clientGroup),
configuration: .init(maximumAllowedIdleTimeInConnectionPool: .milliseconds(10)))
configuration: .init(poolConfiguration: .init(idleTimeout: .milliseconds(10))))
defer {
XCTAssertNoThrow(try localClient.syncShutdown())
}
Expand Down