From cdeb5c190be329140af9f1e311391891a81c923f Mon Sep 17 00:00:00 2001 From: Christian Noon Date: Mon, 21 Sep 2015 21:28:52 -0700 Subject: [PATCH] Added test to identify behavior between original and redirect URL requests. --- Tests/ResponseTests.swift | 67 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/Tests/ResponseTests.swift b/Tests/ResponseTests.swift index a499d9e..14d51a8 100644 --- a/Tests/ResponseTests.swift +++ b/Tests/ResponseTests.swift @@ -269,6 +269,16 @@ class ResponseJSONTestCase: BaseTestCase { // MARK: - class RedirectResponseTestCase: BaseTestCase { + + // MARK: Setup and Teardown + + override func tearDown() { + super.tearDown() + Alamofire.Manager.sharedInstance.delegate.taskWillPerformHTTPRedirection = nil + } + + // MARK: Tests + func testThatRequestWillPerformHTTPRedirectionByDefault() { // Given let redirectURLString = "https://www.apple.com" @@ -461,4 +471,61 @@ class RedirectResponseTestCase: BaseTestCase { XCTAssertEqual(response?.statusCode ?? -1, 200, "response should have a 200 status code") XCTAssertEqual(totalRedirectCount, 5, "total redirect count should be 5") } + + func testThatRedirectedRequestContainsAllHeadersFromOriginalRequest() { + // Given + let redirectURLString = "https://httpbin.org/get" + let URLString = "https://httpbin.org/redirect-to?url=\(redirectURLString)" + let headers = [ + "Authorization": "1234", + "Custom-Header": "foobar", + ] + + // NOTE: It appears that most headers are maintained during a redirect with the exception of the `Authorization` + // header. It appears that Apple's strips the `Authorization` header from the redirected URL request. If you + // need to maintain the `Authorization` header, you need to manually append it to the redirected request. + + Alamofire.Manager.sharedInstance.delegate.taskWillPerformHTTPRedirection = { session, task, response, request in + var redirectedRequest = request + + if let + originalRequest = task.originalRequest, + headers = originalRequest.allHTTPHeaderFields, + authorizationHeaderValue = headers["Authorization"] + { + let mutableRequest = request.mutableCopy() as! NSMutableURLRequest + mutableRequest.setValue(authorizationHeaderValue, forHTTPHeaderField: "Authorization") + redirectedRequest = mutableRequest + } + + return redirectedRequest + } + + let expectation = expectationWithDescription("Request should redirect to \(redirectURLString)") + + var response: Response? + + // When + Alamofire.request(.GET, URLString, headers: headers) + .responseJSON { closureResponse in + response = closureResponse + expectation.fulfill() + } + + waitForExpectationsWithTimeout(defaultTimeout, handler: nil) + + // Then + XCTAssertNotNil(response?.request, "request should not be nil") + XCTAssertNotNil(response?.response, "response should not be nil") + XCTAssertNotNil(response?.data, "data should not be nil") + XCTAssertTrue(response?.result.isSuccess ?? false, "response result should be a success") + + if let + JSON = response?.result.value as? [String: AnyObject], + headers = JSON["headers"] as? [String: String] + { + XCTAssertEqual(headers["Custom-Header"], "foobar", "Custom-Header should be equal to foobar") + XCTAssertEqual(headers["Authorization"], "1234", "Authorization header should be equal to 1234") + } + } } -- GitLab