@@ -253,27 +253,31 @@ public final class DefaultHTTPClient: HTTPClient, Loggable {
253253
254254 func start(
255255 request: HTTPRequest ,
256- task: URLSessionDataTask ,
256+ task sessionTask : URLSessionDataTask ,
257257 receiveResponse: @escaping HTTPTask . ReceiveResponse ,
258258 receiveChallenge: @escaping HTTPTask . ReceiveChallenge ,
259259 consume: @escaping HTTPTask . Consume
260260 ) async -> HTTPResult < HTTPResponse > {
261261 let task = HTTPTask (
262262 request: request,
263- task: task ,
263+ task: sessionTask ,
264264 receiveResponse: receiveResponse,
265265 receiveChallenge: receiveChallenge,
266266 consume: consume
267267 )
268268 $tasks. write { $0. append ( task) }
269269
270- return await withTaskCancellationHandler {
270+ let result = await withTaskCancellationHandler {
271271 await withCheckedContinuation { continuation in
272272 task. start ( with: continuation)
273273 }
274274 } onCancel: {
275275 task. cancel ( )
276276 }
277+
278+ $tasks. write { $0. removeAll { $0. task == sessionTask } }
279+
280+ return result
277281 }
278282
279283 private func findTask( for urlTask: URLSessionTask ) -> HTTPTask ? {
@@ -373,6 +377,10 @@ public final class DefaultHTTPClient: HTTPClient, Loggable {
373377 self . consume = consume
374378 }
375379
380+ deinit {
381+ finish ( )
382+ }
383+
376384 func start( with continuation: Continuation ) {
377385 log ( . info, request)
378386 state = . start( continuation: continuation)
@@ -385,8 +393,8 @@ public final class DefaultHTTPClient: HTTPClient, Loggable {
385393
386394 private func finish( ) {
387395 switch state {
388- case . initializing , . start:
389- preconditionFailure ( " finish() called in `start` or `initializing` state " )
396+ case let . start( continuation ) :
397+ continuation . resume ( returning : . failure ( HTTPError ( kind : . cancelled ) ) )
390398
391399 case let . stream( continuation, response, _) :
392400 continuation. resume ( returning: . success( response) )
@@ -396,7 +404,7 @@ public final class DefaultHTTPClient: HTTPClient, Loggable {
396404 log ( . error, " \( request. method) \( request. url) failed with: \( error. localizedDescription) " )
397405 continuation. resume ( returning: . failure( error) )
398406
399- case . finished:
407+ case . initializing , . finished:
400408 break
401409 }
402410
0 commit comments