From b8721a1596ce0ff63a3a0f12d0f1130c52068700 Mon Sep 17 00:00:00 2001 From: Artem Redkin Date: Mon, 23 Sep 2019 15:52:30 +0100 Subject: [PATCH 1/3] cancel should be done with outbound user event --- Sources/AsyncHTTPClient/HTTPHandler.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/AsyncHTTPClient/HTTPHandler.swift b/Sources/AsyncHTTPClient/HTTPHandler.swift index d4abc8d84..416a30ecf 100644 --- a/Sources/AsyncHTTPClient/HTTPHandler.swift +++ b/Sources/AsyncHTTPClient/HTTPHandler.swift @@ -476,7 +476,7 @@ extension HTTPClient { self.lock.withLock { if !cancelled { cancelled = true - channel?.pipeline.fireUserInboundEventTriggered(TaskCancelEvent()) + channel?.triggerUserOutboundEvent(TaskCancelEvent(), promise: nil) } } } From dea199849db95c963b890a4f9a11bb8620ca3ed3 Mon Sep 17 00:00:00 2001 From: Artem Redkin Date: Mon, 23 Sep 2019 16:09:32 +0100 Subject: [PATCH 2/3] review fix: fire event out of the lock --- Sources/AsyncHTTPClient/HTTPHandler.swift | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Sources/AsyncHTTPClient/HTTPHandler.swift b/Sources/AsyncHTTPClient/HTTPHandler.swift index 416a30ecf..45548fa7d 100644 --- a/Sources/AsyncHTTPClient/HTTPHandler.swift +++ b/Sources/AsyncHTTPClient/HTTPHandler.swift @@ -473,12 +473,14 @@ extension HTTPClient { /// Cancels the request execution. public func cancel() { - self.lock.withLock { + let channel: Channel? = self.lock.withLock { if !cancelled { cancelled = true - channel?.triggerUserOutboundEvent(TaskCancelEvent(), promise: nil) + return self.channel } + return nil } + channel?.triggerUserOutboundEvent(TaskCancelEvent(), promise: nil) } @discardableResult From 77e1ea1a4da5f40c8030830bd629f4b2aaaf7096 Mon Sep 17 00:00:00 2001 From: Artem Redkin Date: Mon, 23 Sep 2019 16:26:21 +0100 Subject: [PATCH 3/3] test fix: handle outbound events --- Sources/AsyncHTTPClient/HTTPHandler.swift | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Sources/AsyncHTTPClient/HTTPHandler.swift b/Sources/AsyncHTTPClient/HTTPHandler.swift index 45548fa7d..3913389a1 100644 --- a/Sources/AsyncHTTPClient/HTTPHandler.swift +++ b/Sources/AsyncHTTPClient/HTTPHandler.swift @@ -734,12 +734,19 @@ extension TaskHandler: ChannelDuplexHandler { self.state = .end let error = HTTPClientError.readTimeout self.failTaskAndNotifyDelegate(error: error, self.delegate.didReceiveError) - } else if (event as? TaskCancelEvent) != nil { + } else { + context.fireUserInboundEventTriggered(event) + } + } + + func triggerUserOutboundEvent(context: ChannelHandlerContext, event: Any, promise: EventLoopPromise?) { + if (event as? TaskCancelEvent) != nil { self.state = .end let error = HTTPClientError.cancelled self.failTaskAndNotifyDelegate(error: error, self.delegate.didReceiveError) + promise?.succeed(()) } else { - context.fireUserInboundEventTriggered(event) + context.triggerUserOutboundEvent(event, promise: promise) } }