@@ -70,40 +70,46 @@ extension URLSession {
7070 assert ( parentProgress. cancellationHandler == nil , " The progress instance's cancellationHandler property must be nil " )
7171 }
7272
73- return await withCheckedContinuation { continuation in
74- let completion : @Sendable ( Data ? , URLResponse ? , Error ? ) -> Void = { data, response, error in
75- let result : WordPressAPIResult < HTTPAPIResponse < Data > , E > = Self . parseResponse (
76- data: data,
77- response: response,
78- error: error,
79- acceptableStatusCodes: acceptableStatusCodes
80- )
81-
82- continuation. resume ( returning: result)
83- }
73+ let taskHolder = TaskHolder ( )
74+ return await withTaskCancellationHandler {
75+ await withCheckedContinuation { continuation in
76+ let completion : @Sendable ( Data ? , URLResponse ? , Error ? ) -> Void = { data, response, error in
77+ let result : WordPressAPIResult < HTTPAPIResponse < Data > , E > = Self . parseResponse (
78+ data: data,
79+ response: response,
80+ error: error,
81+ acceptableStatusCodes: acceptableStatusCodes
82+ )
83+
84+ continuation. resume ( returning: result)
85+ }
8486
85- let task : URLSessionTask
87+ let task : URLSessionTask
8688
87- do {
88- task = try self . task ( for: builder, completion: completion)
89- } catch {
90- continuation. resume ( returning: . failure( . requestEncodingFailure( underlyingError: error) ) )
91- return
92- }
89+ do {
90+ task = try self . task ( for: builder, completion: completion)
91+ } catch {
92+ continuation. resume ( returning: . failure( . requestEncodingFailure( underlyingError: error) ) )
93+ return
94+ }
9395
94- task. resume ( )
95- taskCreated ? ( task. taskIdentifier)
96+ task. resume ( )
97+ taskCreated ? ( task. taskIdentifier)
98+ Task { await taskHolder. assign ( task) }
9699
97- if let parentProgress, parentProgress. totalUnitCount > parentProgress. completedUnitCount {
98- let pending = parentProgress. totalUnitCount - parentProgress. completedUnitCount
99- // The Jetpack/WordPress app requires task progress updates to be delievered on the main queue.
100- let progressUpdator = parentProgress. update ( totalUnit: pending, with: task. progress, queue: . main)
100+ if let parentProgress, parentProgress. totalUnitCount > parentProgress. completedUnitCount {
101+ let pending = parentProgress. totalUnitCount - parentProgress. completedUnitCount
102+ // The Jetpack/WordPress app requires task progress updates to be delievered on the main queue.
103+ let progressUpdator = parentProgress. update ( totalUnit: pending, with: task. progress, queue: . main)
101104
102- parentProgress. cancellationHandler = { [ weak task] in
103- task? . cancel ( )
104- progressUpdator. cancel ( )
105+ parentProgress. cancellationHandler = { [ weak task] in
106+ task? . cancel ( )
107+ progressUpdator. cancel ( )
108+ }
105109 }
106110 }
111+ } onCancel: {
112+ Task { await taskHolder. cancel ( ) }
107113 }
108114 }
109115
@@ -334,3 +340,15 @@ extension URLSession {
334340 self . taskData. count
335341 }
336342}
343+
344+ private actor TaskHolder {
345+ weak var task : URLSessionTask ?
346+
347+ func assign( _ task: URLSessionTask ) {
348+ self . task = task
349+ }
350+
351+ func cancel( ) {
352+ task? . cancel ( )
353+ }
354+ }
0 commit comments