Skip to content

Commit 79b6fdb

Browse files
authored
Merge pull request #2842 from glessard/sr-13017-5.2
[5.2] improve URLError returned upon task cancellation
2 parents 143dcd7 + 0ae6f68 commit 79b6fdb

File tree

2 files changed

+15
-3
lines changed

2 files changed

+15
-3
lines changed

Foundation/URLSession/URLSessionTask.swift

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -363,11 +363,20 @@ open class URLSessionTask : NSObject, NSCopying {
363363
*/
364364
open func cancel() {
365365
workQueue.sync {
366-
guard self.state == .running || self.state == .suspended else { return }
367-
self.state = .canceling
366+
let canceled = self.syncQ.sync { () -> Bool in
367+
guard self._state == .running || self._state == .suspended else { return true }
368+
self._state = .canceling
369+
return false
370+
}
371+
guard !canceled else { return }
368372
self._getProtocol { (urlProtocol) in
369373
self.workQueue.async {
370-
let urlError = URLError(_nsError: NSError(domain: NSURLErrorDomain, code: NSURLErrorCancelled, userInfo: nil))
374+
var info = [NSLocalizedDescriptionKey: "\(URLError.Code.cancelled)" as Any]
375+
if let url = self.originalRequest?.url {
376+
info[NSURLErrorFailingURLErrorKey] = url
377+
info[NSURLErrorFailingURLStringErrorKey] = url.absoluteString
378+
}
379+
let urlError = URLError(_nsError: NSError(domain: NSURLErrorDomain, code: NSURLErrorCancelled, userInfo: info))
371380
self.error = urlError
372381
if let urlProtocol = urlProtocol {
373382
urlProtocol.stopLoading()

TestFoundation/TestURLSession.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -846,6 +846,9 @@ class TestURLSession : LoopbackServerTest {
846846
XCTAssertNotNil(error as? URLError)
847847
if let urlError = error as? URLError {
848848
XCTAssertEqual(urlError._nsError.code, NSURLErrorCancelled)
849+
XCTAssertEqual(urlError.userInfo[NSURLErrorFailingURLErrorKey] as? URL, URL(string: urlString))
850+
XCTAssertEqual(urlError.userInfo[NSURLErrorFailingURLStringErrorKey] as? String, urlString)
851+
XCTAssertEqual(urlError.localizedDescription, "cancelled")
849852
}
850853

851854
expect.fulfill()

0 commit comments

Comments
 (0)