123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- import Foundation
- public protocol RedirectHandler {
-
-
-
-
-
-
-
-
-
-
-
-
-
- func task(_ task: URLSessionTask,
- willBeRedirectedTo request: URLRequest,
- for response: HTTPURLResponse,
- completion: @escaping (URLRequest?) -> Void)
- }
- public struct Redirector {
-
- public enum Behavior {
-
- case follow
-
- case doNotFollow
-
- case modify((URLSessionTask, URLRequest, HTTPURLResponse) -> URLRequest?)
- }
-
- public static let follow = Redirector(behavior: .follow)
-
- public static let doNotFollow = Redirector(behavior: .doNotFollow)
-
- public let behavior: Behavior
-
-
-
- public init(behavior: Behavior) {
- self.behavior = behavior
- }
- }
- extension Redirector: RedirectHandler {
- public func task(_ task: URLSessionTask,
- willBeRedirectedTo request: URLRequest,
- for response: HTTPURLResponse,
- completion: @escaping (URLRequest?) -> Void) {
- switch behavior {
- case .follow:
- completion(request)
- case .doNotFollow:
- completion(nil)
- case let .modify(closure):
- let request = closure(task, request, response)
- completion(request)
- }
- }
- }
- extension RedirectHandler where Self == Redirector {
-
- public static var follow: Redirector { .follow }
-
- public static var doNotFollow: Redirector { .doNotFollow }
-
-
-
-
- public static func modify(using closure: @escaping (URLSessionTask, URLRequest, HTTPURLResponse) -> URLRequest?) -> Redirector {
- Redirector(behavior: .modify(closure))
- }
- }
|