Skip to content
Prev Previous commit
Next Next commit
Implement feedback
  • Loading branch information
clintonpi committed Jan 21, 2025
commit f51ae1c9343dd5e005b9f65df29218f29dc82a75
35 changes: 15 additions & 20 deletions Sources/AsyncHTTPClient/ConnectionPool/HTTP2/HTTP2Connection.swift
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ final class HTTP2Connection {
let multiplexer: HTTP2StreamMultiplexer
let logger: Logger

/// A method with access to the stream channel that is called when creating the stream.
let streamChannelDebugInitializer: (@Sendable (Channel) -> EventLoopFuture<Void>)?

/// the connection pool that created the connection
let delegate: HTTP2ConnectionDelegate

Expand Down Expand Up @@ -95,7 +98,8 @@ final class HTTP2Connection {
decompression: HTTPClient.Decompression,
maximumConnectionUses: Int?,
delegate: HTTP2ConnectionDelegate,
logger: Logger
logger: Logger,
streamChannelDebugInitializer: (@Sendable (Channel) -> EventLoopFuture<Void>)? = nil
) {
self.channel = channel
self.id = connectionID
Expand All @@ -114,6 +118,7 @@ final class HTTP2Connection {
)
self.delegate = delegate
self.state = .initialized
self.streamChannelDebugInitializer = streamChannelDebugInitializer
}

deinit {
Expand All @@ -128,34 +133,27 @@ final class HTTP2Connection {
delegate: HTTP2ConnectionDelegate,
decompression: HTTPClient.Decompression,
maximumConnectionUses: Int?,
logger: Logger
logger: Logger,
streamChannelDebugInitializer: (@Sendable (Channel) -> EventLoopFuture<Void>)? = nil
) -> EventLoopFuture<(HTTP2Connection, Int)> {
let connection = HTTP2Connection(
channel: channel,
connectionID: connectionID,
decompression: decompression,
maximumConnectionUses: maximumConnectionUses,
delegate: delegate,
logger: logger
logger: logger,
streamChannelDebugInitializer: streamChannelDebugInitializer
)
return connection._start0().map { maxStreams in (connection, maxStreams) }
}

func executeRequest(
_ request: HTTPExecutableRequest,
streamChannelDebugInitializer: (@Sendable (Channel) -> EventLoopFuture<Void>)? = nil
) {
func executeRequest(_ request: HTTPExecutableRequest) {
if self.channel.eventLoop.inEventLoop {
self.executeRequest0(
request,
streamChannelDebugInitializer: streamChannelDebugInitializer
)
self.executeRequest0(request)
} else {
self.channel.eventLoop.execute {
self.executeRequest0(
request,
streamChannelDebugInitializer: streamChannelDebugInitializer
)
self.executeRequest0(request)
}
}
}
Expand Down Expand Up @@ -227,10 +225,7 @@ final class HTTP2Connection {
return readyToAcceptConnectionsPromise.futureResult
}

private func executeRequest0(
_ request: HTTPExecutableRequest,
streamChannelDebugInitializer: (@Sendable (Channel) -> EventLoopFuture<Void>)?
) {
private func executeRequest0(_ request: HTTPExecutableRequest) {
self.channel.eventLoop.assertInEventLoop()

switch self.state {
Expand Down Expand Up @@ -271,7 +266,7 @@ final class HTTP2Connection {
self.openStreams.remove(box)
}

if let streamChannelDebugInitializer {
if let streamChannelDebugInitializer = self.streamChannelDebugInitializer {
return streamChannelDebugInitializer(channel).map { _ in
channel.write(request, promise: nil)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,10 +85,10 @@ extension HTTPConnectionPool.ConnectionFactory {
logger: logger
)

if let debugInitializer
if let connectionDebugInitializer
= self.clientConfiguration.http1_1ConnectionDebugInitializer
{
debugInitializer(channel).whenComplete { debugInitializerResult in
connectionDebugInitializer(channel).whenComplete { debugInitializerResult in
switch debugInitializerResult {
case .success:
requester.http1ConnectionCreated(connection)
Expand All @@ -109,14 +109,17 @@ extension HTTPConnectionPool.ConnectionFactory {
delegate: http2ConnectionDelegate,
decompression: self.clientConfiguration.decompression,
maximumConnectionUses: self.clientConfiguration.maximumUsesPerConnection,
logger: logger
logger: logger,
streamChannelDebugInitializer:
self.clientConfiguration.http2StreamChannelDebugInitializer
).whenComplete { result in
switch result {
case .success((let connection, let maximumStreams)):
if let debugInitializer
if let connectionDebugInitializer
= self.clientConfiguration.http2ConnectionDebugInitializer
{
debugInitializer(channel).whenComplete { debugInitializerResult in
connectionDebugInitializer(channel).whenComplete {
debugInitializerResult in
switch debugInitializerResult {
case .success:
requester.http2ConnectionCreated(
Expand Down
22 changes: 4 additions & 18 deletions Sources/AsyncHTTPClient/ConnectionPool/HTTPConnectionPool.swift
Original file line number Diff line number Diff line change
Expand Up @@ -321,19 +321,11 @@ final class HTTPConnectionPool:
private func runUnlockedRequestAction(_ action: Actions.RequestAction.Unlocked) {
switch action {
case .executeRequest(let request, let connection):
connection.executeRequest(
request.req,
http2StreamChannelDebugInitializer:
self.clientConfiguration.http2StreamChannelDebugInitializer
)
connection.executeRequest(request.req)

case .executeRequests(let requests, let connection):
for request in requests {
connection.executeRequest(
request.req,
http2StreamChannelDebugInitializer:
self.clientConfiguration.http2StreamChannelDebugInitializer
)
connection.executeRequest(request.req)
}

case .failRequest(let request, let error):
Expand Down Expand Up @@ -661,18 +653,12 @@ extension HTTPConnectionPool {
}
}

fileprivate func executeRequest(
_ request: HTTPExecutableRequest,
http2StreamChannelDebugInitializer: (@Sendable (Channel) -> EventLoopFuture<Void>)?
) {
fileprivate func executeRequest(_ request: HTTPExecutableRequest) {
switch self._ref {
case .http1_1(let connection):
return connection.executeRequest(request)
case .http2(let connection):
return connection.executeRequest(
request,
streamChannelDebugInitializer: http2StreamChannelDebugInitializer
)
return connection.executeRequest(request)
case .__testOnly_connection:
break
}
Expand Down
82 changes: 33 additions & 49 deletions Sources/AsyncHTTPClient/HTTPClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -866,13 +866,7 @@ public class HTTPClient {
connectionPool: ConnectionPool = ConnectionPool(),
proxy: Proxy? = nil,
ignoreUncleanSSLShutdown: Bool = false,
decompression: Decompression = .disabled,
http1_1ConnectionDebugInitializer:
(@Sendable (Channel) -> EventLoopFuture<Void>)? = nil,
http2ConnectionDebugInitializer:
(@Sendable (Channel) -> EventLoopFuture<Void>)? = nil,
http2StreamChannelDebugInitializer:
(@Sendable (Channel) -> EventLoopFuture<Void>)? = nil
decompression: Decompression = .disabled
) {
self.tlsConfiguration = tlsConfiguration
self.redirectConfiguration = redirectConfiguration ?? RedirectConfiguration()
Expand All @@ -883,9 +877,6 @@ public class HTTPClient {
self.httpVersion = .automatic
self.networkFrameworkWaitForConnectivity = true
self.enableMultipath = false
self.http1_1ConnectionDebugInitializer = http1_1ConnectionDebugInitializer
self.http2ConnectionDebugInitializer = http2ConnectionDebugInitializer
self.http2StreamChannelDebugInitializer = http2StreamChannelDebugInitializer
}

public init(
Expand All @@ -894,13 +885,7 @@ public class HTTPClient {
timeout: Timeout = Timeout(),
proxy: Proxy? = nil,
ignoreUncleanSSLShutdown: Bool = false,
decompression: Decompression = .disabled,
http1_1ConnectionDebugInitializer:
(@Sendable (Channel) -> EventLoopFuture<Void>)? = nil,
http2ConnectionDebugInitializer:
(@Sendable (Channel) -> EventLoopFuture<Void>)? = nil,
http2StreamChannelDebugInitializer:
(@Sendable (Channel) -> EventLoopFuture<Void>)? = nil
decompression: Decompression = .disabled
) {
self.init(
tlsConfiguration: tlsConfiguration,
Expand All @@ -909,10 +894,7 @@ public class HTTPClient {
connectionPool: ConnectionPool(),
proxy: proxy,
ignoreUncleanSSLShutdown: ignoreUncleanSSLShutdown,
decompression: decompression,
http1_1ConnectionDebugInitializer: http1_1ConnectionDebugInitializer,
http2ConnectionDebugInitializer: http2ConnectionDebugInitializer,
http2StreamChannelDebugInitializer: http2StreamChannelDebugInitializer
decompression: decompression
)
}

Expand All @@ -923,13 +905,7 @@ public class HTTPClient {
maximumAllowedIdleTimeInConnectionPool: TimeAmount = .seconds(60),
proxy: Proxy? = nil,
ignoreUncleanSSLShutdown: Bool = false,
decompression: Decompression = .disabled,
http1_1ConnectionDebugInitializer:
(@Sendable (Channel) -> EventLoopFuture<Void>)? = nil,
http2ConnectionDebugInitializer:
(@Sendable (Channel) -> EventLoopFuture<Void>)? = nil,
http2StreamChannelDebugInitializer:
(@Sendable (Channel) -> EventLoopFuture<Void>)? = nil
decompression: Decompression = .disabled
) {
var tlsConfig = TLSConfiguration.makeClientConfiguration()
tlsConfig.certificateVerification = certificateVerification
Expand All @@ -940,10 +916,7 @@ public class HTTPClient {
connectionPool: ConnectionPool(idleTimeout: maximumAllowedIdleTimeInConnectionPool),
proxy: proxy,
ignoreUncleanSSLShutdown: ignoreUncleanSSLShutdown,
decompression: decompression,
http1_1ConnectionDebugInitializer: http1_1ConnectionDebugInitializer,
http2ConnectionDebugInitializer: http2ConnectionDebugInitializer,
http2StreamChannelDebugInitializer: http2StreamChannelDebugInitializer
decompression: decompression
)
}

Expand All @@ -955,13 +928,7 @@ public class HTTPClient {
proxy: Proxy? = nil,
ignoreUncleanSSLShutdown: Bool = false,
decompression: Decompression = .disabled,
backgroundActivityLogger: Logger?,
http1_1ConnectionDebugInitializer:
(@Sendable (Channel) -> EventLoopFuture<Void>)? = nil,
http2ConnectionDebugInitializer:
(@Sendable (Channel) -> EventLoopFuture<Void>)? = nil,
http2StreamChannelDebugInitializer:
(@Sendable (Channel) -> EventLoopFuture<Void>)? = nil
backgroundActivityLogger: Logger?
) {
var tlsConfig = TLSConfiguration.makeClientConfiguration()
tlsConfig.certificateVerification = certificateVerification
Expand All @@ -972,10 +939,7 @@ public class HTTPClient {
connectionPool: ConnectionPool(idleTimeout: connectionPool),
proxy: proxy,
ignoreUncleanSSLShutdown: ignoreUncleanSSLShutdown,
decompression: decompression,
http1_1ConnectionDebugInitializer: http1_1ConnectionDebugInitializer,
http2ConnectionDebugInitializer: http2ConnectionDebugInitializer,
http2StreamChannelDebugInitializer: http2StreamChannelDebugInitializer
decompression: decompression
)
}

Expand All @@ -985,6 +949,26 @@ public class HTTPClient {
timeout: Timeout = Timeout(),
proxy: Proxy? = nil,
ignoreUncleanSSLShutdown: Bool = false,
decompression: Decompression = .disabled
) {
self.init(
certificateVerification: certificateVerification,
redirectConfiguration: redirectConfiguration,
timeout: timeout,
maximumAllowedIdleTimeInConnectionPool: .seconds(60),
proxy: proxy,
ignoreUncleanSSLShutdown: ignoreUncleanSSLShutdown,
decompression: decompression
)
}

public init(
tlsConfiguration: TLSConfiguration? = nil,
redirectConfiguration: RedirectConfiguration? = nil,
timeout: Timeout = Timeout(),
connectionPool: ConnectionPool = ConnectionPool(),
proxy: Proxy? = nil,
ignoreUncleanSSLShutdown: Bool = false,
decompression: Decompression = .disabled,
http1_1ConnectionDebugInitializer:
(@Sendable (Channel) -> EventLoopFuture<Void>)? = nil,
Expand All @@ -994,17 +978,17 @@ public class HTTPClient {
(@Sendable (Channel) -> EventLoopFuture<Void>)? = nil
) {
self.init(
certificateVerification: certificateVerification,
tlsConfiguration: tlsConfiguration,
redirectConfiguration: redirectConfiguration,
timeout: timeout,
maximumAllowedIdleTimeInConnectionPool: .seconds(60),
connectionPool: connectionPool,
proxy: proxy,
ignoreUncleanSSLShutdown: ignoreUncleanSSLShutdown,
decompression: decompression,
http1_1ConnectionDebugInitializer: http1_1ConnectionDebugInitializer,
http2ConnectionDebugInitializer: http2ConnectionDebugInitializer,
http2StreamChannelDebugInitializer: http2StreamChannelDebugInitializer
decompression: decompression
)
self.http1_1ConnectionDebugInitializer = http1_1ConnectionDebugInitializer
self.http2ConnectionDebugInitializer = http2ConnectionDebugInitializer
self.http2StreamChannelDebugInitializer = http2StreamChannelDebugInitializer
}
}

Expand Down
Loading