Skip to content

Commit

Permalink
Added test to identify behavior between original and redirect URL req…
Browse files Browse the repository at this point in the history
…uests.
  • Loading branch information
cnoon committed Sep 22, 2015
1 parent e9088bb commit cdeb5c1
Showing 1 changed file with 67 additions and 0 deletions.
67 changes: 67 additions & 0 deletions Tests/ResponseTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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<AnyObject, NSError>?

// 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")
}
}
}

0 comments on commit cdeb5c1

Please sign in to comment.