Browse Source

Fixed Request cURLRepresentation method to coalesce duplicate headers.

Chris Richards 9 years ago
parent
commit
d2b85f4381
2 changed files with 47 additions and 16 deletions
  1. 12 16
      Source/Request.swift
  2. 35 0
      Tests/RequestTests.swift

+ 12 - 16
Source/Request.swift

@@ -510,28 +510,24 @@ extension Request: CustomDebugStringConvertible {
             }
         }
 
-        if let headerFields = request.allHTTPHeaderFields {
-            for (field, value) in headerFields {
-                switch field {
-                case "Cookie":
-                    continue
-                default:
-                    components.append("-H \"\(field): \(value)\"")
-                }
+        var headers: [NSObject: AnyObject] = [:]
+
+        if let additionalHeaders = session.configuration.HTTPAdditionalHeaders {
+            for (field, value) in additionalHeaders where field != "Cookie" {
+                headers[field] = value
             }
         }
 
-        if let additionalHeaders = session.configuration.HTTPAdditionalHeaders {
-            for (field, value) in additionalHeaders {
-                switch field {
-                case "Cookie":
-                    continue
-                default:
-                    components.append("-H \"\(field): \(value)\"")
-                }
+        if let headerFields = request.allHTTPHeaderFields {
+            for (field, value) in headerFields where field != "Cookie" {
+                headers[field] = value
             }
         }
 
+        for (field, value) in headers {
+            components.append("-H \"\(field): \(value)\"")
+        }
+
         if let
             HTTPBodyData = request.HTTPBody,
             HTTPBody = String(data: HTTPBodyData, encoding: NSUTF8StringEncoding)

+ 35 - 0
Tests/RequestTests.swift

@@ -485,6 +485,18 @@ class RequestDebugDescriptionTestCase: BaseTestCase {
         return manager
     }()
 
+    let managerWithAcceptLanguageHeader: Manager = {
+        var headers = Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders ?? [:]
+        headers["Accept-Language"] = "en-US"
+        
+        let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
+        configuration.HTTPAdditionalHeaders = headers
+        
+        let manager = Manager(configuration: configuration)
+        manager.startRequestsImmediately = false
+        return manager
+    }()
+    
     let managerDisallowingCookies: Manager = {
         let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
         configuration.HTTPShouldSetCookies = false
@@ -511,6 +523,29 @@ class RequestDebugDescriptionTestCase: BaseTestCase {
         XCTAssertEqual(components.last ?? "", "\"\(URLString)\"", "URL component should be equal")
     }
 
+    func testGETRequestWithDuplicateHeadersDebugDescription() {
+        // Given
+        let URLString = "https://httpbin.org/get"
+
+        // When
+        let headers = [ "Accept-Language": "en-GB" ]
+        let request = managerWithAcceptLanguageHeader.request(.GET, URLString, headers: headers)
+        let components = cURLCommandComponents(request)
+
+        // Then
+        XCTAssertEqual(components[0..<3], ["$", "curl", "-i"], "components should be equal")
+        XCTAssertFalse(components.contains("-X"), "command should not contain explicit -X flag")
+        XCTAssertEqual(components.last ?? "", "\"\(URLString)\"", "URL component should be equal")
+
+        let tokens = request.debugDescription.componentsSeparatedByString("Accept-Language:")
+        XCTAssertTrue(tokens.count == 2, "command should contain a single Accept-Language header")
+
+        XCTAssertTrue(
+            request.debugDescription.rangeOfString("-H \"Accept-Language: en-GB\"") != nil,
+            "command should Accept-Language set to 'en-GB'"
+        )
+    }
+
     func testPOSTRequestDebugDescription() {
         // Given
         let URLString = "https://httpbin.org/post"