mirror of
https://github.com/swift-server/async-http-client.git
synced 2026-05-03 07:32:29 +00:00
8e4d51908d
- The connection creation logic has been refactored into a number of smaller methods that can be combined - Connection creation now has a logical home. It is moved from `Utils.swift` into a `ConnectionFactory` - There are explicit `ChannelHandlers` that are used for connection creation: - `TLSEventsHandler` got its own file and unit tests - `HTTP1ProxyConnectHandler` got its own file and unit tests - `SOCKSEventsHandler` got its own file and unit tests - Some small things are already part of this pr that will get their context later. For example: - `HTTPConnectionPool` is added as a namespace to not cause major renames in follow up PRs - `HTTPConnectionPool.Connection.ID` and its generator were added now. (This will be used later to identify a connection during its lifetime) - the file `HTTPConnectionPool+Manager` was added to give `HTTPConnectionPool.Connection.ID.Generator` already its final destination.
86 lines
3.0 KiB
Swift
86 lines
3.0 KiB
Swift
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This source file is part of the AsyncHTTPClient open source project
|
|
//
|
|
// Copyright (c) 2018-2019 Apple Inc. and the AsyncHTTPClient project authors
|
|
// Licensed under Apache License v2.0
|
|
//
|
|
// See LICENSE.txt for license information
|
|
// See CONTRIBUTORS.txt for the list of AsyncHTTPClient project authors
|
|
//
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
import NIO
|
|
import NIOHTTP1
|
|
|
|
extension HTTPClient.Configuration {
|
|
/// Proxy server configuration
|
|
/// Specifies the remote address of an HTTP proxy.
|
|
///
|
|
/// Adding an `Proxy` to your client's `HTTPClient.Configuration`
|
|
/// will cause requests to be passed through the specified proxy using the
|
|
/// HTTP `CONNECT` method.
|
|
///
|
|
/// If a `TLSConfiguration` is used in conjunction with `HTTPClient.Configuration.Proxy`,
|
|
/// TLS will be established _after_ successful proxy, between your client
|
|
/// and the destination server.
|
|
public struct Proxy {
|
|
enum ProxyType: Hashable {
|
|
case http(HTTPClient.Authorization?)
|
|
case socks
|
|
}
|
|
|
|
/// Specifies Proxy server host.
|
|
public var host: String
|
|
/// Specifies Proxy server port.
|
|
public var port: Int
|
|
/// Specifies Proxy server authorization.
|
|
public var authorization: HTTPClient.Authorization? {
|
|
set {
|
|
precondition(self.type == .http(self.authorization), "SOCKS authorization support is not yet implemented.")
|
|
self.type = .http(newValue)
|
|
}
|
|
|
|
get {
|
|
switch self.type {
|
|
case .http(let authorization):
|
|
return authorization
|
|
case .socks:
|
|
return nil
|
|
}
|
|
}
|
|
}
|
|
|
|
var type: ProxyType
|
|
|
|
/// Create a HTTP proxy.
|
|
///
|
|
/// - parameters:
|
|
/// - host: proxy server host.
|
|
/// - port: proxy server port.
|
|
public static func server(host: String, port: Int) -> Proxy {
|
|
return .init(host: host, port: port, type: .http(nil))
|
|
}
|
|
|
|
/// Create a HTTP proxy.
|
|
///
|
|
/// - parameters:
|
|
/// - host: proxy server host.
|
|
/// - port: proxy server port.
|
|
/// - authorization: proxy server authorization.
|
|
public static func server(host: String, port: Int, authorization: HTTPClient.Authorization? = nil) -> Proxy {
|
|
return .init(host: host, port: port, type: .http(authorization))
|
|
}
|
|
|
|
/// Create a SOCKSv5 proxy.
|
|
/// - parameter host: The SOCKSv5 proxy address.
|
|
/// - parameter port: The SOCKSv5 proxy port, defaults to 1080.
|
|
/// - returns: A new instance of `Proxy` configured to connect to a `SOCKSv5` server.
|
|
public static func socksServer(host: String, port: Int = 1080) -> Proxy {
|
|
return .init(host: host, port: port, type: .socks)
|
|
}
|
|
}
|
|
}
|