Răsfoiți Sursa

Moved the ParameterEncoding and Method logic into a separate Swift file.

Christian Noon 10 ani în urmă
părinte
comite
1f66a59266
3 a modificat fișierele cu 161 adăugiri și 132 ștergeri
  1. 6 0
      Alamofire.xcodeproj/project.pbxproj
  2. 0 132
      Source/Alamofire.swift
  3. 155 0
      Source/ParameterEncoding.swift

+ 6 - 0
Alamofire.xcodeproj/project.pbxproj

@@ -7,6 +7,8 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
+		4CE2724F1AF88FB500F1D59A /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE2724E1AF88FB500F1D59A /* ParameterEncoding.swift */; };
+		4CE272501AF88FB500F1D59A /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE2724E1AF88FB500F1D59A /* ParameterEncoding.swift */; };
 		4DD67C241A5C58FB00ED2280 /* Alamofire.h in Headers */ = {isa = PBXBuildFile; fileRef = F8111E3819A95C8B0040E7D1 /* Alamofire.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		4DD67C251A5C590000ED2280 /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = F897FF4019AA800700AB5182 /* Alamofire.swift */; };
 		F8111E3919A95C8B0040E7D1 /* Alamofire.h in Headers */ = {isa = PBXBuildFile; fileRef = F8111E3819A95C8B0040E7D1 /* Alamofire.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -50,6 +52,7 @@
 /* End PBXContainerItemProxy section */
 
 /* Begin PBXFileReference section */
+		4CE2724E1AF88FB500F1D59A /* ParameterEncoding.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParameterEncoding.swift; sourceTree = "<group>"; };
 		4DD67C0B1A5C55C900ED2280 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		F8111E3319A95C8B0040E7D1 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		F8111E3719A95C8B0040E7D1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@@ -126,6 +129,7 @@
 			isa = PBXGroup;
 			children = (
 				F897FF4019AA800700AB5182 /* Alamofire.swift */,
+				4CE2724E1AF88FB500F1D59A /* ParameterEncoding.swift */,
 				F8111E3619A95C8B0040E7D1 /* Supporting Files */,
 			);
 			path = Source;
@@ -338,6 +342,7 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				4CE272501AF88FB500F1D59A /* ParameterEncoding.swift in Sources */,
 				4DD67C251A5C590000ED2280 /* Alamofire.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
@@ -346,6 +351,7 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				4CE2724F1AF88FB500F1D59A /* ParameterEncoding.swift in Sources */,
 				F897FF4119AA800700AB5182 /* Alamofire.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;

+ 0 - 132
Source/Alamofire.swift

@@ -25,138 +25,6 @@ import Foundation
 /// Alamofire errors
 public let AlamofireErrorDomain = "com.alamofire.error"
 
-/**
-    HTTP method definitions.
-
-    See http://tools.ietf.org/html/rfc7231#section-4.3
-*/
-public enum Method: String {
-    case OPTIONS = "OPTIONS"
-    case GET = "GET"
-    case HEAD = "HEAD"
-    case POST = "POST"
-    case PUT = "PUT"
-    case PATCH = "PATCH"
-    case DELETE = "DELETE"
-    case TRACE = "TRACE"
-    case CONNECT = "CONNECT"
-}
-
-/**
-    Used to specify the way in which a set of parameters are applied to a URL request.
-*/
-public enum ParameterEncoding {
-    /**
-        A query string to be set as or appended to any existing URL query for `GET`, `HEAD`, and `DELETE` requests, or set as the body for requests with any other HTTP method. The `Content-Type` HTTP header field of an encoded request with HTTP body is set to `application/x-www-form-urlencoded`. Since there is no published specification for how to encode collection types, the convention of appending `[]` to the key for array values (`foo[]=1&foo[]=2`), and appending the key surrounded by square brackets for nested dictionary values (`foo[bar]=baz`).
-    */
-    case URL
-
-    /**
-        Uses `NSJSONSerialization` to create a JSON representation of the parameters object, which is set as the body of the request. The `Content-Type` HTTP header field of an encoded request is set to `application/json`.
-    */
-    case JSON
-
-    /**
-        Uses `NSPropertyListSerialization` to create a plist representation of the parameters object, according to the associated format and write options values, which is set as the body of the request. The `Content-Type` HTTP header field of an encoded request is set to `application/x-plist`.
-    */
-    case PropertyList(NSPropertyListFormat, NSPropertyListWriteOptions)
-
-    /**
-        Uses the associated closure value to construct a new request given an existing request and parameters.
-    */
-    case Custom((URLRequestConvertible, [String: AnyObject]?) -> (NSURLRequest, NSError?))
-
-    /**
-        Creates a URL request by encoding parameters and applying them onto an existing request.
-
-        :param: URLRequest The request to have parameters applied
-        :param: parameters The parameters to apply
-
-        :returns: A tuple containing the constructed request and the error that occurred during parameter encoding, if any.
-    */
-    public func encode(URLRequest: URLRequestConvertible, parameters: [String: AnyObject]?) -> (NSURLRequest, NSError?) {
-        if parameters == nil {
-            return (URLRequest.URLRequest, nil)
-        }
-
-        var mutableURLRequest: NSMutableURLRequest! = URLRequest.URLRequest.mutableCopy() as! NSMutableURLRequest
-        var error: NSError? = nil
-
-        switch self {
-        case .URL:
-            func query(parameters: [String: AnyObject]) -> String {
-                var components: [(String, String)] = []
-                for key in sorted(Array(parameters.keys), <) {
-                    let value: AnyObject! = parameters[key]
-                    components += self.queryComponents(key, value)
-                }
-
-                return join("&", components.map{"\($0)=\($1)"} as [String])
-            }
-
-            func encodesParametersInURL(method: Method) -> Bool {
-                switch method {
-                case .GET, .HEAD, .DELETE:
-                    return true
-                default:
-                    return false
-                }
-            }
-
-            let method = Method(rawValue: mutableURLRequest.HTTPMethod)
-            if method != nil && encodesParametersInURL(method!) {
-                if let URLComponents = NSURLComponents(URL: mutableURLRequest.URL!, resolvingAgainstBaseURL: false) {
-                    URLComponents.percentEncodedQuery = (URLComponents.percentEncodedQuery != nil ? URLComponents.percentEncodedQuery! + "&" : "") + query(parameters!)
-                    mutableURLRequest.URL = URLComponents.URL
-                }
-            } else {
-                if mutableURLRequest.valueForHTTPHeaderField("Content-Type") == nil {
-                    mutableURLRequest.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
-                }
-
-                mutableURLRequest.HTTPBody = query(parameters!).dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
-            }
-        case .JSON:
-            let options = NSJSONWritingOptions.allZeros
-            if let data = NSJSONSerialization.dataWithJSONObject(parameters!, options: options, error: &error) {
-                mutableURLRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
-                mutableURLRequest.HTTPBody = data
-            }
-        case .PropertyList(let (format, options)):
-            if let data = NSPropertyListSerialization.dataWithPropertyList(parameters!, format: format, options: options, error: &error) {
-                mutableURLRequest.setValue("application/x-plist", forHTTPHeaderField: "Content-Type")
-                mutableURLRequest.HTTPBody = data
-            }
-        case .Custom(let closure):
-            return closure(mutableURLRequest, parameters)
-        }
-
-        return (mutableURLRequest, error)
-    }
-
-    func queryComponents(key: String, _ value: AnyObject) -> [(String, String)] {
-        var components: [(String, String)] = []
-        if let dictionary = value as? [String: AnyObject] {
-            for (nestedKey, value) in dictionary {
-                components += queryComponents("\(key)[\(nestedKey)]", value)
-            }
-        } else if let array = value as? [AnyObject] {
-            for value in array {
-                components += queryComponents("\(key)[]", value)
-            }
-        } else {
-            components.extend([(escape(key), escape("\(value)"))])
-        }
-
-        return components
-    }
-
-    func escape(string: String) -> String {
-        let legalURLCharactersToBeEscaped: CFStringRef = ":&=;+!@#$()',*"
-        return CFURLCreateStringByAddingPercentEscapes(nil, string, nil, legalURLCharactersToBeEscaped, CFStringBuiltInEncodings.UTF8.rawValue) as String
-    }
-}
-
 // MARK: - URLStringConvertible
 
 /**

+ 155 - 0
Source/ParameterEncoding.swift

@@ -0,0 +1,155 @@
+// Alamofire.swift
+//
+// Copyright (c) 2014–2015 Alamofire Software Foundation (http://alamofire.org/)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import Foundation
+
+/**
+    HTTP method definitions.
+
+    See http://tools.ietf.org/html/rfc7231#section-4.3
+*/
+public enum Method: String {
+    case OPTIONS = "OPTIONS"
+    case GET = "GET"
+    case HEAD = "HEAD"
+    case POST = "POST"
+    case PUT = "PUT"
+    case PATCH = "PATCH"
+    case DELETE = "DELETE"
+    case TRACE = "TRACE"
+    case CONNECT = "CONNECT"
+}
+
+/**
+    Used to specify the way in which a set of parameters are applied to a URL request.
+*/
+public enum ParameterEncoding {
+    /**
+        A query string to be set as or appended to any existing URL query for `GET`, `HEAD`, and `DELETE` requests, or set as the body for requests with any other HTTP method. The `Content-Type` HTTP header field of an encoded request with HTTP body is set to `application/x-www-form-urlencoded`. Since there is no published specification for how to encode collection types, the convention of appending `[]` to the key for array values (`foo[]=1&foo[]=2`), and appending the key surrounded by square brackets for nested dictionary values (`foo[bar]=baz`).
+    */
+    case URL
+    
+    /**
+        Uses `NSJSONSerialization` to create a JSON representation of the parameters object, which is set as the body of the request. The `Content-Type` HTTP header field of an encoded request is set to `application/json`.
+    */
+    case JSON
+    
+    /**
+        Uses `NSPropertyListSerialization` to create a plist representation of the parameters object, according to the associated format and write options values, which is set as the body of the request. The `Content-Type` HTTP header field of an encoded request is set to `application/x-plist`.
+    */
+    case PropertyList(NSPropertyListFormat, NSPropertyListWriteOptions)
+    
+    /**
+        Uses the associated closure value to construct a new request given an existing request and parameters.
+    */
+    case Custom((URLRequestConvertible, [String: AnyObject]?) -> (NSURLRequest, NSError?))
+    
+    /**
+        Creates a URL request by encoding parameters and applying them onto an existing request.
+    
+        :param: URLRequest The request to have parameters applied
+        :param: parameters The parameters to apply
+    
+        :returns: A tuple containing the constructed request and the error that occurred during parameter encoding, if any.
+    */
+    public func encode(URLRequest: URLRequestConvertible, parameters: [String: AnyObject]?) -> (NSURLRequest, NSError?) {
+        if parameters == nil {
+            return (URLRequest.URLRequest, nil)
+        }
+        
+        var mutableURLRequest: NSMutableURLRequest! = URLRequest.URLRequest.mutableCopy() as! NSMutableURLRequest
+        var error: NSError? = nil
+        
+        switch self {
+        case .URL:
+            func query(parameters: [String: AnyObject]) -> String {
+                var components: [(String, String)] = []
+                for key in sorted(Array(parameters.keys), <) {
+                    let value: AnyObject! = parameters[key]
+                    components += self.queryComponents(key, value)
+                }
+                
+                return join("&", components.map{"\($0)=\($1)"} as [String])
+            }
+            
+            func encodesParametersInURL(method: Method) -> Bool {
+                switch method {
+                case .GET, .HEAD, .DELETE:
+                    return true
+                default:
+                    return false
+                }
+            }
+            
+            let method = Method(rawValue: mutableURLRequest.HTTPMethod)
+            if method != nil && encodesParametersInURL(method!) {
+                if let URLComponents = NSURLComponents(URL: mutableURLRequest.URL!, resolvingAgainstBaseURL: false) {
+                    URLComponents.percentEncodedQuery = (URLComponents.percentEncodedQuery != nil ? URLComponents.percentEncodedQuery! + "&" : "") + query(parameters!)
+                    mutableURLRequest.URL = URLComponents.URL
+                }
+            } else {
+                if mutableURLRequest.valueForHTTPHeaderField("Content-Type") == nil {
+                    mutableURLRequest.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
+                }
+                
+                mutableURLRequest.HTTPBody = query(parameters!).dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
+            }
+        case .JSON:
+            let options = NSJSONWritingOptions.allZeros
+            if let data = NSJSONSerialization.dataWithJSONObject(parameters!, options: options, error: &error) {
+                mutableURLRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
+                mutableURLRequest.HTTPBody = data
+            }
+        case .PropertyList(let (format, options)):
+            if let data = NSPropertyListSerialization.dataWithPropertyList(parameters!, format: format, options: options, error: &error) {
+                mutableURLRequest.setValue("application/x-plist", forHTTPHeaderField: "Content-Type")
+                mutableURLRequest.HTTPBody = data
+            }
+        case .Custom(let closure):
+            return closure(mutableURLRequest, parameters)
+        }
+        
+        return (mutableURLRequest, error)
+    }
+    
+    func queryComponents(key: String, _ value: AnyObject) -> [(String, String)] {
+        var components: [(String, String)] = []
+        if let dictionary = value as? [String: AnyObject] {
+            for (nestedKey, value) in dictionary {
+                components += queryComponents("\(key)[\(nestedKey)]", value)
+            }
+        } else if let array = value as? [AnyObject] {
+            for value in array {
+                components += queryComponents("\(key)[]", value)
+            }
+        } else {
+            components.extend([(escape(key), escape("\(value)"))])
+        }
+        
+        return components
+    }
+    
+    func escape(string: String) -> String {
+        let legalURLCharactersToBeEscaped: CFStringRef = ":&=;+!@#$()',*"
+        return CFURLCreateStringByAddingPercentEscapes(nil, string, nil, legalURLCharactersToBeEscaped, CFStringBuiltInEncodings.UTF8.rawValue) as String
+    }
+}