Skip to content

Commit 8651258

Browse files
committed
Treat cancellation more like pause, similar to cancelling all.
1 parent 0998791 commit 8651258

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

Sources/TUSKit/TUSClient.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -733,6 +733,23 @@ extension TUSClient: SchedulerDelegate {
733733
return nil
734734
}
735735
}
736+
737+
func isCancellation(_ error: Error) -> Bool {
738+
if let tusError = error as? TUSClientError, case .taskCancelled = tusError {
739+
return true
740+
}
741+
742+
if let apiError = error as? TUSAPIError, case let .underlyingError(underlying) = apiError {
743+
return isCancellation(underlying)
744+
}
745+
746+
if let urlError = error as? URLError, urlError.code == .cancelled {
747+
return true
748+
}
749+
750+
let nsError = error as NSError
751+
return nsError.domain == NSURLErrorDomain && nsError.code == NSURLErrorCancelled
752+
}
736753

737754
var shouldReturnEarly = false
738755
queue.sync {
@@ -747,6 +764,10 @@ extension TUSClient: SchedulerDelegate {
747764
return
748765
}
749766

767+
if isCancellation(error) {
768+
return
769+
}
770+
750771
metaData.errorCount += 1
751772
do {
752773
try files.encodeAndStore(metaData: metaData)

Tests/TUSKitTests/TUSClient/TUSClientInternalTests.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,4 +123,21 @@ final class TUSClientInternalTests: XCTestCase {
123123
XCTFail("Expected a couldNotStoreFileMetadata error")
124124
}
125125
}
126+
127+
func testCancellationDoesNotIncrementErrorCountOrRetry() throws {
128+
let metaData = try storeFiles()
129+
let creationTask = try CreationTask(metaData: metaData,
130+
api: TUSAPI(session: URLSession(configuration: .ephemeral)),
131+
files: files)
132+
let scheduler = Scheduler()
133+
134+
XCTAssertEqual(metaData.errorCount, 0)
135+
136+
client.onError(error: TUSClientError.taskCancelled, task: creationTask, scheduler: scheduler)
137+
138+
scheduler.queue.sync { }
139+
140+
XCTAssertEqual(metaData.errorCount, 0)
141+
XCTAssertTrue(scheduler.allTasks.isEmpty)
142+
}
126143
}

0 commit comments

Comments
 (0)