Crash fix: HTTP2 can handle requests are cancelled (#555)

Co-authored-by: George Barnett <gbarnett@apple.com>
This commit is contained in:
Fabian Fett
2022-02-10 10:42:27 +01:00
committed by GitHub
parent 5ead318ad2
commit 5844a6b4ee
4 changed files with 52 additions and 9 deletions
@@ -193,11 +193,15 @@ final class HTTP2ClientRequestHandler: ChannelDuplexHandler {
case .forwardResponseBodyParts(let parts):
self.request!.receiveResponseBodyParts(parts)
case .failRequest(let error, let finalAction):
case .failRequest(let error, _):
self.request!.fail(error)
self.request = nil
self.runTimeoutAction(.clearIdleReadTimeoutTimer, context: context)
self.runFinalAction(finalAction, context: context)
// No matter the error reason, we must always make sure the h2 stream is closed. Only
// once the h2 stream is closed, it is released from the h2 multiplexer. The
// HTTPRequestStateMachine may signal finalAction: .none in the error case (as this is
// the right result for HTTP/1). In the h2 case we MUST always close.
self.runFinalAction(.close, context: context)
case .succeedRequest(let finalAction, let finalParts):
self.request!.succeedRequest(finalParts)