Skip to content

Commit 78e1804

Browse files
ewilkeniabudiab
authored andcommitted
add support for proxy URLs
1 parent e326b5d commit 78e1804

File tree

3 files changed

+35
-4
lines changed

3 files changed

+35
-4
lines changed

Sources/SwiftkubeClient/Client/KubernetesClient.swift

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,12 +181,35 @@ public actor KubernetesClient {
181181
tlsConfiguration.privateKey = NIOSSLPrivateKeySource.privateKey(clientKey)
182182
}
183183

184+
let proxy: HTTPClient.Configuration.Proxy? = {
185+
guard let proxyURL = config.proxyURL else { return nil }
186+
187+
if proxyURL.scheme == "socks5", let host = proxyURL.host {
188+
return .socksServer(host: host, port: proxyURL.port ?? 1080)
189+
}
190+
191+
if proxyURL.scheme == "http", let host = proxyURL.host {
192+
if let username = proxyURL.user, let password = proxyURL.password {
193+
return .server(
194+
host: host,
195+
port: proxyURL.port ?? 80,
196+
authorization: HTTPClient.Authorization.basic(username: username, password: password)
197+
)
198+
}
199+
200+
return .server(host: host, port: proxyURL.port ?? 80)
201+
}
202+
203+
return nil
204+
}()
205+
184206
self.httpClient = HTTPClient(
185207
eventLoopGroupProvider: provider,
186208
configuration: HTTPClient.Configuration(
187209
tlsConfiguration: tlsConfiguration,
188210
redirectConfiguration: config.redirectConfiguration,
189211
timeout: config.timeout,
212+
proxy: proxy,
190213
decompression: config.gzip ? .enabled(limit: .none) : .disabled
191214
)
192215
)

Sources/SwiftkubeClient/Config/KubernetesClientConfig.swift

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ public struct KubernetesClientConfig: Sendable {
3939
public let timeout: HTTPClient.Configuration.Timeout
4040
/// The default redirect configuration for the underlying `HTTPCLient`.
4141
public let redirectConfiguration: HTTPClient.Configuration.RedirectConfiguration
42+
/// URL to the proxy to be used for all requests made by this client.
43+
public let proxyURL: URL?
4244
/// Whether to request and decode gzipped responses from the API server.
4345
public let gzip: Bool
4446

@@ -50,6 +52,7 @@ public struct KubernetesClientConfig: Sendable {
5052
insecureSkipTLSVerify: Bool,
5153
timeout: HTTPClient.Configuration.Timeout,
5254
redirectConfiguration: HTTPClient.Configuration.RedirectConfiguration,
55+
proxyURL: URL? = nil,
5356
gzip: Bool = false
5457
) {
5558
self.masterURL = masterURL
@@ -59,6 +62,7 @@ public struct KubernetesClientConfig: Sendable {
5962
self.insecureSkipTLSVerify = insecureSkipTLSVerify
6063
self.timeout = timeout
6164
self.redirectConfiguration = redirectConfiguration
65+
self.proxyURL = proxyURL
6266
self.gzip = gzip
6367
}
6468
}
@@ -209,7 +213,8 @@ internal struct StringConfigLoader: KubernetesClientConfigLoader {
209213
trustRoots: cluster.trustRoots(logger: logger),
210214
insecureSkipTLSVerify: cluster.insecureSkipTLSVerify ?? true,
211215
timeout: timeout,
212-
redirectConfiguration: redirectConfiguration
216+
redirectConfiguration: redirectConfiguration,
217+
proxyURL: cluster.proxyURL.flatMap { URL(string: $0) }
213218
)
214219
}
215220
}
@@ -266,7 +271,8 @@ internal struct URLConfigLoader: KubernetesClientConfigLoader {
266271
trustRoots: cluster.trustRoots(logger: logger),
267272
insecureSkipTLSVerify: cluster.insecureSkipTLSVerify ?? true,
268273
timeout: timeout,
269-
redirectConfiguration: redirectConfiguration
274+
redirectConfiguration: redirectConfiguration,
275+
proxyURL: cluster.proxyURL.flatMap { URL(string: $0) }
270276
)
271277
}
272278
}
@@ -336,7 +342,8 @@ internal struct ServiceAccountConfigLoader: KubernetesClientConfigLoader {
336342
trustRoots: trustRoots,
337343
insecureSkipTLSVerify: trustRoots == nil,
338344
timeout: timeout,
339-
redirectConfiguration: redirectConfiguration
345+
redirectConfiguration: redirectConfiguration,
346+
proxyURL: nil
340347
)
341348
}
342349

Tests/SwiftkubeClientTests/RequestBuilderTests.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ final class RequestBuilderTests: XCTestCase {
3434
trustRoots: nil,
3535
insecureSkipTLSVerify: false,
3636
timeout: .init(connect: .seconds(1), read: .seconds(5)),
37-
redirectConfiguration: .disallow
37+
redirectConfiguration: .disallow,
38+
proxyURL: nil
3839
)
3940

4041
gvr = GroupVersionResource(of: core.v1.Pod.self)!

0 commit comments

Comments
 (0)