From 58eb4a3831c1517b6eb3b947fed4afbc75025641 Mon Sep 17 00:00:00 2001 From: David Yaffe Date: Tue, 26 Sep 2023 17:36:33 -0400 Subject: [PATCH] feat: make connectTimeoutMs configurable (#592) --- .../Config/DefaultSDKRuntimeConfiguration.swift | 7 +++++++ .../Networking/Http/CRT/CRTClientEngine.swift | 14 ++++++++++++-- .../Http/CRT/CRTClientEngineConfig.swift | 7 ++++++- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/Sources/ClientRuntime/Config/DefaultSDKRuntimeConfiguration.swift b/Sources/ClientRuntime/Config/DefaultSDKRuntimeConfiguration.swift index 72e6fe433..249bac816 100644 --- a/Sources/ClientRuntime/Config/DefaultSDKRuntimeConfiguration.swift +++ b/Sources/ClientRuntime/Config/DefaultSDKRuntimeConfiguration.swift @@ -90,6 +90,13 @@ public extension DefaultSDKRuntimeConfiguration { /// Is the CRT HTTP client. static var defaultHttpClientEngine: HttpClientEngine { CRTClientEngine() } + /// The default HTTP client with a specified timeout + /// + /// Is the CRT HTTP client. + static func httpClientEngineWithTimeout(timeoutMs: UInt32) -> HttpClientEngine { + return CRTClientEngine(config: CRTClientEngineConfig(connectTimeoutMs: timeoutMs)) + } + /// The HTTP client configuration to use when none is provided. /// /// Is the CRT HTTP client's configuration. diff --git a/Sources/ClientRuntime/Networking/Http/CRT/CRTClientEngine.swift b/Sources/ClientRuntime/Networking/Http/CRT/CRTClientEngine.swift index 86517aef0..836d35d40 100644 --- a/Sources/ClientRuntime/Networking/Http/CRT/CRTClientEngine.swift +++ b/Sources/ClientRuntime/Networking/Http/CRT/CRTClientEngine.swift @@ -19,11 +19,13 @@ public class CRTClientEngine: HttpClientEngine { private var connectionPools: [Endpoint: HTTPClientConnectionManager] = [:] private var http2ConnectionPools: [Endpoint: HTTP2StreamManager] = [:] private let sharedDefaultIO = SDKDefaultIO.shared + private let connectTimeoutMs: UInt32? init(config: CRTClientEngineConfig) { self.windowSize = config.windowSize self.maxConnectionsPerEndpoint = config.maxConnectionsPerEndpoint self.logger = SwiftLogger(label: "SerialExecutor") + self.connectTimeoutMs = config.connectTimeoutMs } func getOrCreateConnectionPool(endpoint: Endpoint) throws -> HTTPClientConnectionManager { @@ -54,7 +56,11 @@ public class CRTClientEngine: HttpClientEngine { var socketOptions = SocketOptions(socketType: .stream) #if os(iOS) || os(watchOS) - socketOptions.connectTimeoutMs = 30_000 + socketOptions.connectTimeoutMs = self.connectTimeoutMs ?? 30_000 +#else + if let timeout = self.connectTimeoutMs { + socketOptions.connectTimeoutMs = timeout + } #endif let options = HTTPClientConnectionOptions( clientBootstrap: sharedDefaultIO.clientBootstrap, @@ -78,7 +84,11 @@ public class CRTClientEngine: HttpClientEngine { private func createHTTP2ConnectionPool(endpoint: Endpoint) throws -> HTTP2StreamManager { var socketOptions = SocketOptions(socketType: .stream) #if os(iOS) || os(watchOS) - socketOptions.connectTimeoutMs = 30_000 + socketOptions.connectTimeoutMs = self.connectTimeoutMs ?? 30_000 +#else + if let timeout = self.connectTimeoutMs { + socketOptions.connectTimeoutMs = timeout + } #endif let tlsConnectionOptions = TLSConnectionOptions( context: sharedDefaultIO.tlsContext, diff --git a/Sources/ClientRuntime/Networking/Http/CRT/CRTClientEngineConfig.swift b/Sources/ClientRuntime/Networking/Http/CRT/CRTClientEngineConfig.swift index f77eacffa..f0fc84116 100644 --- a/Sources/ClientRuntime/Networking/Http/CRT/CRTClientEngineConfig.swift +++ b/Sources/ClientRuntime/Networking/Http/CRT/CRTClientEngineConfig.swift @@ -17,13 +17,18 @@ struct CRTClientEngineConfig { /// If you set this in server mode, it enforces client authentication. let verifyPeer: Bool + /// Timeout in MS for connections + let connectTimeoutMs: UInt32? + public init( maxConnectionsPerEndpoint: Int = 50, windowSize: Int = 16 * 1024 * 1024, - verifyPeer: Bool = true + verifyPeer: Bool = true, + connectTimeoutMs: UInt32? = nil ) { self.maxConnectionsPerEndpoint = maxConnectionsPerEndpoint self.windowSize = windowSize self.verifyPeer = verifyPeer + self.connectTimeoutMs = connectTimeoutMs } }