From 0dd335e5bac55cdbfa116a6eb7333cfa8dc1cc78 Mon Sep 17 00:00:00 2001 From: Artem Redkin Date: Mon, 8 Jul 2019 12:22:25 +0100 Subject: [PATCH 1/2] call didSendRequest after write future is fullfilled --- Sources/AsyncHTTPClient/HTTPHandler.swift | 38 ++++++++++++----------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/Sources/AsyncHTTPClient/HTTPHandler.swift b/Sources/AsyncHTTPClient/HTTPHandler.swift index 862c7a371..fdfa62b8e 100644 --- a/Sources/AsyncHTTPClient/HTTPHandler.swift +++ b/Sources/AsyncHTTPClient/HTTPHandler.swift @@ -345,26 +345,28 @@ internal class TaskHandler: ChannelInboundHandler self.delegate.didSendRequestHead(task: self.task, head) } - self.writeBody(request: request, context: context).whenComplete { result in - switch result { - case .success: - context.write(self.wrapOutboundOut(.end(nil)), promise: promise) - context.flush() - - self.state = .sent - self.delegate.didSendRequest(task: self.task) - - let channel = context.channel - self.task.futureResult.whenComplete { _ in - channel.close(promise: nil) + self.writeBody(request: request, context: context) + .flatMap { + context.writeAndFlush(self.wrapOutboundOut(.end(nil))) + } + .whenComplete { result in + switch result { + case .success: + self.state = .sent + self.delegate.didSendRequest(task: self.task) + promise?.succeed(()) + + let channel = context.channel + self.task.futureResult.whenComplete { _ in + channel.close(promise: nil) + } + case .failure(let error): + self.state = .end + self.delegate.didReceiveError(task: self.task, error) + self.task.fail(error) + context.close(promise: nil) } - case .failure(let error): - self.state = .end - self.delegate.didReceiveError(task: self.task, error) - self.task.fail(error) - context.close(promise: nil) } - } } private func writeBody(request: HTTPClient.Request, context: ChannelHandlerContext) -> EventLoopFuture { From 9899eb9252b447a0b4a2129e8d648934729144aa Mon Sep 17 00:00:00 2001 From: Artem Redkin Date: Mon, 8 Jul 2019 13:19:04 +0100 Subject: [PATCH 2/2] review fix: fail promise on error --- Sources/AsyncHTTPClient/HTTPHandler.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Sources/AsyncHTTPClient/HTTPHandler.swift b/Sources/AsyncHTTPClient/HTTPHandler.swift index fdfa62b8e..bf5038bf9 100644 --- a/Sources/AsyncHTTPClient/HTTPHandler.swift +++ b/Sources/AsyncHTTPClient/HTTPHandler.swift @@ -363,6 +363,8 @@ internal class TaskHandler: ChannelInboundHandler case .failure(let error): self.state = .end self.delegate.didReceiveError(task: self.task, error) + promise?.fail(error) + self.task.fail(error) context.close(promise: nil) }