Skip to content

Commit 370af15

Browse files
committed
NSMutableURLRequest HTTPHeaderFields are now stored case sensitive but evaluated insensitively
1 parent 45e1bd8 commit 370af15

File tree

2 files changed

+25
-8
lines changed

2 files changed

+25
-8
lines changed

Foundation/NSURLRequest.swift

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,13 @@ public class NSMutableURLRequest : NSURLRequest {
389389
if _httpHeaderFields == nil {
390390
_httpHeaderFields = [:]
391391
}
392-
_httpHeaderFields?[field.lowercaseString] = value
392+
if let existingHeader = _httpHeaderFields?.filter({ (existingField, _) -> Bool in
393+
return existingField.lowercaseString == field.lowercaseString
394+
}).first {
395+
let (existingField, _) = existingHeader
396+
_httpHeaderFields?.removeValueForKey(existingField)
397+
}
398+
_httpHeaderFields?[field] = value
393399
}
394400

395401
/*!
@@ -410,10 +416,13 @@ public class NSMutableURLRequest : NSURLRequest {
410416
if _httpHeaderFields == nil {
411417
_httpHeaderFields = [:]
412418
}
413-
if let oldValue = _httpHeaderFields?[field.lowercaseString] {
414-
_httpHeaderFields?[field.lowercaseString] = "\(oldValue),\(value)"
419+
if let existingHeader = _httpHeaderFields?.filter({ (existingField, _) -> Bool in
420+
return existingField.lowercaseString == field.lowercaseString
421+
}).first {
422+
let (existingField, existingValue) = existingHeader
423+
_httpHeaderFields?[existingField] = "\(existingValue),\(value)"
415424
} else {
416-
_httpHeaderFields?[field.lowercaseString] = value
425+
_httpHeaderFields?[field] = value
417426
}
418427
}
419428
}

TestFoundation/TestNSURLRequest.swift

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class TestNSURLRequest : XCTestCase {
4141
func test_mutableConstruction() {
4242
let URL = NSURL(string: "http://swift.org")!
4343
let request = NSMutableURLRequest(URL: URL)
44+
4445
//Confirm initial state matches NSURLRequest responses
4546
XCTAssertNotNil(request)
4647
XCTAssertEqual(request.URL, URL)
@@ -61,11 +62,18 @@ class TestNSURLRequest : XCTestCase {
6162

6263
func test_headerFields() {
6364
let request = NSMutableURLRequest(URL: URL)
64-
request.setValue("application/json", forHTTPHeaderField: "accept")
65+
66+
request.setValue("application/json", forHTTPHeaderField: "Accept")
6567
XCTAssertNotNil(request.allHTTPHeaderFields)
66-
XCTAssertEqual(request.allHTTPHeaderFields?["accept"], "application/json")
67-
//HTTP Header fields should be case insensitive
68+
XCTAssertEqual(request.allHTTPHeaderFields?["Accept"], "application/json")
69+
70+
// Setting "accept" should remove "Accept"
71+
request.setValue("application/xml", forHTTPHeaderField: "accept")
72+
XCTAssertNil(request.allHTTPHeaderFields?["Accept"])
73+
XCTAssertEqual(request.allHTTPHeaderFields?["accept"], "application/xml")
74+
75+
// Adding to "Accept" should add to "accept"
6876
request.addValue("text/html", forHTTPHeaderField: "Accept")
69-
XCTAssertEqual(request.allHTTPHeaderFields?["accept"], "application/json,text/html")
77+
XCTAssertEqual(request.allHTTPHeaderFields?["accept"], "application/xml,text/html")
7078
}
7179
}

0 commit comments

Comments
 (0)