提交 19e5012a 编写于 作者: A Aron Cedercrantz 提交者: Christian Noon

[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.
上级 c2134d76
......@@ -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 }
......
......@@ -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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册