rinold/proxyresolver
ProxyResolver allows simply resolve the actual proxy information from users
Features
Supported system configurations
- [x] Auto Proxy Discovery*
- [x] Automatic Proxy Configuration URL*
- [x] Web Proxy (HTTP)
- [x] Secure Web Proxy (HTTPS)
- [x] SOCKS Proxy
- [ ] ~~FTP Proxy~~
- [ ] ~~Streaming Proxy (RTSP)~~
- [ ] ~~Gopher Proxy~~
\ due to ATS protection auto-configuration url should be HTTPS or have \.local or unresolvable globally domain, otherwise you will need to set the NSAllowsLocalNetworking key in plist. More info could be found in NSAppTransportSecurity reference.
Other features
- [x] Proxy with required password support
Proxy.credentials will automatically access Proxy keychain to retrieve configured for proxy account and password. As it would require permission from user the credentials are retrieved lazily only when you try to get them.
- [x] Configurable
You can use custom proxy configuration provider instead of system one, or provide your own fetcher for downloading auto-configuration scripts instead of default one based on NSURLSession.
- [x] Aligned with Apple recommendations
"In general, you should try to download a URL using the first proxy in the array, try the second proxy if the first one fails, and so on." - as described in documentation for used CFNetworkCopyProxiesForURL method.
Using the ProxyResolverDelegate you can try connection to resolved proxy and in case of any issue or if your just want to retrieve all - continue resolution if any proxy configuration are still available.
class CustomDelegate: ProxyResolverDelegate {
func proxyResolver(_ proxyResolver: ProxyResolver, didResolve result: ProxyResolutionResult, for url: URL, resolveNext: ResolveNextRoutine?) {
switch result {
case .direct:
// no proxy required - try to connect to your 'url' directly
break
case .proxy(let proxy):
// try connect to your 'url' using resolved 'proxy'
yourConnectMethod(to: url, using: proxy) { (response, error) in
if let error = error {
// If connection failed we will try to resolve next proxy if
// available and retry connection
resolveNext?()
}
}
case .error(let error):
// handle error
break
}
}- [ ] Documentation
TBD
Requirements
- Swift: 4+
- macOS: 10.10+
Installation
CocoaPods
To install it add the following line to Podfile:
pod 'ProxyResolver'For example:
use_frameworks!
target 'TestPackagesForProxyResolver' do
platform :osx, '10.12'
pod 'ProxyResolver'
endCarthage
To install it add following line to Cartfile:
GitHub "rinold/ProxyResolver"Swift Package Manager
To install it add following package to needed Packages.swift dependencies:
.package(url: "https://github.com/rinold/ProxyResolver.git", from: "0.3.0")For example:
// swift-tools-version:4.0
import PackageDescription
let package = Package(
name: "TestPackagesForProxyResolver",
products: [
.executable(name: "TestPackagesForProxyResolver", targets: ["TestPackagesForProxyResolver"]),
],
dependencies: [
.package(url: "https://github.com/rinold/ProxyResolver.git", from: "0.3.0"),
],
targets: [
.target(
name: "TestPackagesForProxyResolver",
dependencies: ["ProxyResolver.git"]),
]
)Versioning
We use SemVer for versioning. For the versions available, see the tags on this repository.
License
ProxyResolver is available under the MIT license. See the LICENSE file for more info.
Package Metadata
Repository: rinold/proxyresolver
Default branch: master
README: README.md