Swiftpack.co - Package - rinold/ProxyResolver

ProxyResolver

CI Status Swift Version Carthage Carthage License Platform

ProxyResolver allows simply resolve the actual proxy information from users system configuration and could be used for setting up Stream-based connections, for example for Web Sockets.

Usage example:

import ProxyResolver

let proxy = ProxyResolver()
let url = URL(string: "https://github.com")!
proxy.resolve(for: url) { result in
  switch result {
    case .direct:
      // Direct connection allowed - no proxy required
      break
    case .proxy(let proxy):
      // here you can establish connection to proxy or whatever you want
      // proxy.type - one of ProxyType enum: .http, .https or .socks
      // proxy.host - host name of proxy to use
      // proxy.port - port number
      break
    case .error(let error):
      // Handle error
      break
  }
}

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'
end

Carthage

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.

Author

ProxyResolver was initially inspired by the web sockets Starscream proxy support PR.

Mikhail Churbanov, mihail.churbanov@gmail.com

License

ProxyResolver is available under the MIT license. See the LICENSE file for more info.

Github

link
Stars: 1
Help us keep the lights on

Dependencies

Used By

Total:

Releases

0.3.1 - Jul 24, 2018

  • Allow configuration after initialization
  • Fixed podspec for iOS support

0.3.0 - Jun 16, 2018

  • Added ProxyResolverDelegate
  • Added resolve(url: URL) without completion but allowing delegate to control resolution continuation
  • Minor re-factoring

0.2.0 - Jun 12, 2018

API improvements

  • Changed resolution returned result
  • Added ProxyResolverConfig with ability to provide custom configuration and proxy config source

0.1.0 - May 31, 2018