Browse Source

Add URLSession intializer and default configuration.

Jon Shier 7 years ago
parent
commit
4c2062a8d6

+ 10 - 0
Alamofire.xcodeproj/project.pbxproj

@@ -114,6 +114,10 @@
 		31ED52E81D73891B00199085 /* AFError+AlamofireTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31ED52E61D73889D00199085 /* AFError+AlamofireTests.swift */; };
 		31ED52E91D73891C00199085 /* AFError+AlamofireTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31ED52E61D73889D00199085 /* AFError+AlamofireTests.swift */; };
 		31ED52EA1D73891C00199085 /* AFError+AlamofireTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31ED52E61D73889D00199085 /* AFError+AlamofireTests.swift */; };
+		31F5085D20B50DC400FE2A0C /* URLSessionConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31F5085C20B50DC400FE2A0C /* URLSessionConfiguration.swift */; };
+		31F5085E20B50DC400FE2A0C /* URLSessionConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31F5085C20B50DC400FE2A0C /* URLSessionConfiguration.swift */; };
+		31F5085F20B50DC400FE2A0C /* URLSessionConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31F5085C20B50DC400FE2A0C /* URLSessionConfiguration.swift */; };
+		31F5086020B50DC400FE2A0C /* URLSessionConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31F5085C20B50DC400FE2A0C /* URLSessionConfiguration.swift */; };
 		4C0E5BF81B673D3400816CCC /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0E5BF71B673D3400816CCC /* Result.swift */; };
 		4C0E5BF91B673D3400816CCC /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0E5BF71B673D3400816CCC /* Result.swift */; };
 		4C1DC8541B68908E00476DE3 /* AFError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1DC8531B68908E00476DE3 /* AFError.swift */; };
@@ -327,6 +331,7 @@
 		319917B3209CE36E00103A19 /* RequestRetrier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestRetrier.swift; sourceTree = "<group>"; };
 		319917B8209CE53A00103A19 /* OperationQueue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OperationQueue.swift; sourceTree = "<group>"; };
 		31ED52E61D73889D00199085 /* AFError+AlamofireTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "AFError+AlamofireTests.swift"; sourceTree = "<group>"; };
+		31F5085C20B50DC400FE2A0C /* URLSessionConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLSessionConfiguration.swift; sourceTree = "<group>"; };
 		4C0B58381B747A4400C0B99C /* ResponseSerializationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ResponseSerializationTests.swift; sourceTree = "<group>"; };
 		4C0E02681BF99A18004E7F18 /* Info-tvOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-tvOS.plist"; path = "Source/Info-tvOS.plist"; sourceTree = SOURCE_ROOT; };
 		4C0E5BF71B673D3400816CCC /* Result.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = "<group>"; };
@@ -587,6 +592,7 @@
 			children = (
 				4C43669A1D7BB93D00C38AAD /* DispatchQueue+Alamofire.swift */,
 				319917B8209CE53A00103A19 /* OperationQueue.swift */,
+				31F5085C20B50DC400FE2A0C /* URLSessionConfiguration.swift */,
 			);
 			name = Extensions;
 			sourceTree = "<group>";
@@ -1232,6 +1238,7 @@
 				3199179A209CDA7F00103A19 /* Response.swift in Sources */,
 				319917A7209CDAC400103A19 /* RequestTaskMap.swift in Sources */,
 				4CF627131BA7CBF60011A099 /* Validation.swift in Sources */,
+				31F5085F20B50DC400FE2A0C /* URLSessionConfiguration.swift in Sources */,
 				319917BB209CE53A00103A19 /* OperationQueue.swift in Sources */,
 				319917AC209CDCB000103A19 /* HTTPHeaders.swift in Sources */,
 				4CF6270E1BA7CBF60011A099 /* MultipartFormData.swift in Sources */,
@@ -1289,6 +1296,7 @@
 				31991799209CDA7F00103A19 /* Response.swift in Sources */,
 				319917A6209CDAC400103A19 /* RequestTaskMap.swift in Sources */,
 				4C1DC8551B68908E00476DE3 /* AFError.swift in Sources */,
+				31F5085E20B50DC400FE2A0C /* URLSessionConfiguration.swift in Sources */,
 				319917BA209CE53A00103A19 /* OperationQueue.swift in Sources */,
 				319917AB209CDCB000103A19 /* HTTPHeaders.swift in Sources */,
 				4CB9282A1C66BFBC00CE5F08 /* Notifications.swift in Sources */,
@@ -1320,6 +1328,7 @@
 				3199179B209CDA7F00103A19 /* Response.swift in Sources */,
 				319917A8209CDAC400103A19 /* RequestTaskMap.swift in Sources */,
 				4CEC605A1B745C9100E684F4 /* AFError.swift in Sources */,
+				31F5086020B50DC400FE2A0C /* URLSessionConfiguration.swift in Sources */,
 				319917BC209CE53A00103A19 /* OperationQueue.swift in Sources */,
 				319917AD209CDCB000103A19 /* HTTPHeaders.swift in Sources */,
 				E4202FD21B667AA100C997FB /* ResponseSerialization.swift in Sources */,
@@ -1351,6 +1360,7 @@
 				31991798209CDA7F00103A19 /* Response.swift in Sources */,
 				319917A5209CDAC400103A19 /* RequestTaskMap.swift in Sources */,
 				4C1DC8541B68908E00476DE3 /* AFError.swift in Sources */,
+				31F5085D20B50DC400FE2A0C /* URLSessionConfiguration.swift in Sources */,
 				319917B9209CE53A00103A19 /* OperationQueue.swift in Sources */,
 				319917AA209CDCB000103A19 /* HTTPHeaders.swift in Sources */,
 				F897FF4119AA800700AB5182 /* Alamofire.swift in Sources */,

+ 1 - 3
Source/HTTPHeaders.swift

@@ -33,11 +33,9 @@ extension Dictionary where Key == String, Value == String {
 
         return ["Authorization": "Basic \(credential)"]
     }
-}
 
-extension SessionManager {
     /// Creates default values for the "Accept-Encoding", "Accept-Language" and "User-Agent" headers.
-    open static let defaultHTTPHeaders: HTTPHeaders = {
+    public static let defaultHTTPHeaders: HTTPHeaders = {
         // Accept-Encoding HTTP Header; see https://tools.ietf.org/html/rfc7230#section-4.2.3
         let acceptEncoding: String = {
             let encodings: [String]

+ 35 - 12
Source/SessionManager.swift

@@ -27,7 +27,6 @@ import Foundation
 open class SessionManager {
     open static let `default` = SessionManager()
 
-    let configuration: URLSessionConfiguration
     let delegate: SessionDelegate
     let rootQueue: DispatchQueue
     let requestQueue: DispatchQueue
@@ -39,26 +38,50 @@ open class SessionManager {
     let eventMonitor: CompositeEventMonitor
     let defaultEventMonitors: [EventMonitor] = [] // TODO: Create notification event monitor, make default
 
-    public init(configuration: URLSessionConfiguration = .default,
-                delegate: SessionDelegate = SessionDelegate(),
-                rootQueue: DispatchQueue = DispatchQueue(label: "org.alamofire.sessionManager.rootQueue"),
-                adapter: RequestAdapter? = nil,
-                serverTrustManager: ServerTrustManager? = nil,
-                retrier: RequestRetrier? = nil,
-                eventMonitors: [EventMonitor] = []) {
-        self.configuration = configuration
+    init(session: URLSession,
+         delegate: SessionDelegate,
+         rootQueue: DispatchQueue,
+         requestQueue: DispatchQueue? = nil,
+         adapter: RequestAdapter? = nil,
+         serverTrustManager: ServerTrustManager? = nil,
+         retrier: RequestRetrier? = nil,
+         eventMonitors: [EventMonitor] = []) {
+        precondition(session.delegate === delegate,
+                     "URLSession SessionManager initializer must pass the SessionDelegate that has been assigned to the URLSession as its delegate.")
+        precondition(session.delegateQueue.underlyingQueue === rootQueue,
+                     "URLSession SessionManager intializer must pass the DispatchQueue used as the delegateQueue's underlyingQueue as the rootQueue.")
+
+        self.session = session
         self.delegate = delegate
         self.rootQueue = rootQueue
+        self.requestQueue = requestQueue ?? DispatchQueue(label: "\(rootQueue.label).requestQueue", target: rootQueue)
         self.adapter = adapter
         self.retrier = retrier
         self.serverTrustManager = serverTrustManager
-        requestQueue = DispatchQueue(label: "\(rootQueue.label).requestQueue", target: rootQueue)
-        let delegateQueue = OperationQueue(maxConcurrentOperationCount: 1, underlyingQueue: rootQueue, name: "org.alamofire.sessionManager.sessionDelegateQueue")
-        session = URLSession(configuration: configuration, delegate: delegate, delegateQueue: delegateQueue)
         eventMonitor = CompositeEventMonitor(monitors: defaultEventMonitors + eventMonitors)
         delegate.didCreateSessionManager(self, withEventMonitor: eventMonitor)
     }
 
+    public convenience init(configuration: URLSessionConfiguration = .default,
+                            delegate: SessionDelegate = SessionDelegate(),
+                            rootQueue: DispatchQueue = DispatchQueue(label: "org.alamofire.sessionManager.rootQueue"),
+                            requestQueue: DispatchQueue? = nil,
+                            adapter: RequestAdapter? = nil,
+                            serverTrustManager: ServerTrustManager? = nil,
+                            retrier: RequestRetrier? = nil,
+                            eventMonitors: [EventMonitor] = []) {
+        let delegateQueue = OperationQueue(maxConcurrentOperationCount: 1, underlyingQueue: rootQueue, name: "org.alamofire.sessionManager.sessionDelegateQueue")
+        let session = URLSession(configuration: configuration, delegate: delegate, delegateQueue: delegateQueue)
+        self.init(session: session,
+                  delegate: delegate,
+                  rootQueue: rootQueue,
+                  requestQueue: requestQueue,
+                  adapter: adapter,
+                  serverTrustManager: serverTrustManager,
+                  retrier: retrier,
+                  eventMonitors: eventMonitors)
+    }
+
     deinit {
         session.invalidateAndCancel()
     }

+ 18 - 0
Source/URLSessionConfiguration.swift

@@ -0,0 +1,18 @@
+//
+//  URLSessionConfiguration.swift
+//  Alamofire
+//
+//  Created by Jon Shier on 5/22/18.
+//  Copyright © 2018 Alamofire. All rights reserved.
+//
+
+import Foundation
+
+extension URLSessionConfiguration {
+    public static var alamofireDefault: URLSessionConfiguration {
+        let configuration = URLSessionConfiguration.default
+        configuration.httpAdditionalHeaders = HTTPHeaders.defaultHTTPHeaders
+
+        return configuration
+    }
+}

+ 2 - 2
Tests/CacheTests.swift

@@ -94,7 +94,7 @@ class CacheTestCase: BaseTestCase {
         manager = {
             let configuration: URLSessionConfiguration = {
                 let configuration = URLSessionConfiguration.default
-                configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders
+                configuration.httpAdditionalHeaders = HTTPHeaders.defaultHTTPHeaders
                 configuration.requestCachePolicy = .useProtocolCachePolicy
                 configuration.urlCache = urlCache
 
@@ -182,7 +182,7 @@ class CacheTestCase: BaseTestCase {
     func startRequest(
         cacheControl: String,
         cachePolicy: URLRequest.CachePolicy = .useProtocolCachePolicy,
-        queue: DispatchQueue = DispatchQueue.main,
+        queue: DispatchQueue = .main,
         completion: @escaping (URLRequest?, HTTPURLResponse?) -> Void)
         -> URLRequest
     {

+ 2 - 2
Tests/SessionManagerTests.swift

@@ -214,7 +214,7 @@ class SessionManagerTestCase: BaseTestCase {
 
     func testDefaultUserAgentHeader() {
         // Given, When
-        let userAgent = SessionManager.defaultHTTPHeaders["User-Agent"]
+        let userAgent = HTTPHeaders.defaultHTTPHeaders["User-Agent"]
 
         // Then
         let osNameVersion: String = {
@@ -953,7 +953,7 @@ class SessionManagerConfigurationHeadersTestCase: BaseTestCase {
                     configuration = .background(withIdentifier: identifier)
                 }
 
-                var headers = SessionManager.defaultHTTPHeaders
+                var headers = HTTPHeaders.defaultHTTPHeaders
                 headers["Authorization"] = "Bearer 123456"
                 configuration.httpAdditionalHeaders = headers
 

+ 1 - 1
Tests/URLProtocolTests.swift

@@ -37,7 +37,7 @@ class ProxyURLProtocol: URLProtocol {
     lazy var session: URLSession = {
         let configuration: URLSessionConfiguration = {
             let configuration = URLSessionConfiguration.ephemeral
-            configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders
+            configuration.httpAdditionalHeaders = HTTPHeaders.defaultHTTPHeaders
 
             return configuration
         }()