Browse Source

[PR 1792] Added request property overrides to fallback on original task.

Fixes issue where request property would always return `nil` if the url request was not used to create a URLSessionTask. This can commonly happen when an Error is thrown in an adapter.
Aron Cedercrantz 9 years ago
parent
commit
19e5012aaa
2 changed files with 129 additions and 0 deletions
  1. 31 0
      Source/Request.swift
  2. 98 0
      Tests/RequestTests.swift

+ 31 - 0
Source/Request.swift

@@ -365,6 +365,14 @@ open class DataRequest: Request {
 
     // MARK: Properties
 
+    /// The request sent or to be sent to the server.
+    open override var request: URLRequest? {
+        if let request = super.request { return request }
+        if let requestable = originalTask as? Requestable { return requestable.urlRequest }
+
+        return nil
+    }
+
     /// The progress of fetching the response data from the server for the request.
     open var progress: Progress { return dataDelegate.progress }
 
@@ -465,6 +473,17 @@ open class DownloadRequest: Request {
 
     // MARK: Properties
 
+    /// The request sent or to be sent to the server.
+    open override var request: URLRequest? {
+        if let request = super.request { return request }
+
+        if let downloadable = originalTask as? Downloadable, case let .request(urlRequest) = downloadable {
+            return urlRequest
+        }
+
+        return nil
+    }
+
     /// The resume data of the underlying download task if available after a failure.
     open var resumeData: Data? { return downloadDelegate.resumeData }
 
@@ -563,6 +582,18 @@ open class UploadRequest: DataRequest {
 
     // MARK: Properties
 
+    /// The request sent or to be sent to the server.
+    open override var request: URLRequest? {
+        if let request = super.request { return request }
+
+        guard let uploadable = originalTask as? Uploadable else { return nil }
+
+        switch uploadable {
+        case .data(_, let urlRequest), .file(_, let urlRequest), .stream(_, let urlRequest):
+            return urlRequest
+        }
+    }
+
     /// The progress of uploading the payload to the server for the upload request.
     open var uploadProgress: Progress { return uploadDelegate.uploadProgress }
 

+ 98 - 0
Tests/RequestTests.swift

@@ -76,6 +76,104 @@ class RequestInitializationTestCase: BaseTestCase {
 
 // MARK: -
 
+class RequestSubclassRequestPropertyTestCase: BaseTestCase {
+    private enum AuthenticationError: Error {
+        case expiredAccessToken
+    }
+
+    private class AuthenticationAdapter: RequestAdapter {
+        func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
+            throw AuthenticationError.expiredAccessToken
+        }
+    }
+
+    private var sessionManager: SessionManager!
+
+    override func setUp() {
+        super.setUp()
+
+        sessionManager = SessionManager()
+        sessionManager.startRequestsImmediately = false
+
+        sessionManager.adapter = AuthenticationAdapter()
+    }
+
+    func testDataRequestHasURLRequest() {
+        // Given
+        let urlString = "https://httpbin.org/"
+
+        // When
+        let request = sessionManager.request(urlString)
+
+        // Then
+        XCTAssertNotNil(request.request)
+        XCTAssertEqual(request.request?.httpMethod, "GET")
+        XCTAssertEqual(request.request?.url?.absoluteString, urlString)
+        XCTAssertNil(request.response)
+    }
+
+    func testDownloadRequestHasURLRequest() {
+        // Given
+        let urlString = "https://httpbin.org/"
+
+        // When
+        let request = sessionManager.download(urlString)
+
+        // Then
+        XCTAssertNotNil(request.request)
+        XCTAssertEqual(request.request?.httpMethod, "GET")
+        XCTAssertEqual(request.request?.url?.absoluteString, urlString)
+        XCTAssertNil(request.response)
+    }
+
+    func testUploadDataRequestHasURLRequest() {
+        // Given
+        let urlString = "https://httpbin.org/"
+
+        // When
+        let request = sessionManager.upload(Data(), to: urlString)
+
+        // Then
+        XCTAssertNotNil(request.request)
+        XCTAssertEqual(request.request?.httpMethod, "POST")
+        XCTAssertEqual(request.request?.url?.absoluteString, urlString)
+        XCTAssertNil(request.response)
+    }
+
+    func testUploadFileRequestHasURLRequest() {
+        // Given
+        let urlString = "https://httpbin.org/"
+        let imageURL = url(forResource: "rainbow", withExtension: "jpg")
+
+        // When
+        let request = sessionManager.upload(imageURL, to: urlString)
+
+        // Then
+        XCTAssertNotNil(request.request)
+        XCTAssertEqual(request.request?.httpMethod, "POST")
+        XCTAssertEqual(request.request?.url?.absoluteString, urlString)
+        XCTAssertNil(request.response)
+    }
+
+    func testUploadStreamRequestHasURLRequest() {
+        // Given
+        let urlString = "https://httpbin.org/"
+        let imageURL = url(forResource: "rainbow", withExtension: "jpg")
+        let imageStream = InputStream(url: imageURL)!
+
+        // When
+        let request = sessionManager.upload(imageStream, to: urlString)
+
+        // Then
+        XCTAssertNotNil(request.request)
+        XCTAssertEqual(request.request?.httpMethod, "POST")
+        XCTAssertEqual(request.request?.url?.absoluteString, urlString)
+        XCTAssertNil(request.response)
+    }
+}
+
+// MARK: -
+
 class RequestResponseTestCase: BaseTestCase {
     func testRequestResponse() {
         // Given