@@ -26,6 +26,7 @@ final class ConnectStreamChannelHandler: NIOCore.ChannelInboundHandler, @uncheck
2626
2727 private var context : NIOCore . ChannelHandlerContext ?
2828 private var isClosed = false
29+ private var hasResponded = false
2930 private var pendingClose : NIOHTTP1 . HTTPClientRequestPart ?
3031 private var pendingData = Foundation . Data ( )
3132 private var receivedStatus : NIOHTTP1 . HTTPResponseStatus ?
@@ -81,6 +82,7 @@ final class ConnectStreamChannelHandler: NIOCore.ChannelInboundHandler, @uncheck
8182 }
8283
8384 self . closeConnection ( )
85+ self . hasResponded = true
8486 self . responseCallbacks. receiveClose ( . canceled, [ : ] , ConnectError . canceled ( ) )
8587 }
8688 }
@@ -149,6 +151,7 @@ final class ConnectStreamChannelHandler: NIOCore.ChannelInboundHandler, @uncheck
149151 self . responseCallbacks. receiveResponseData ( Data ( buffer: byteBuffer) )
150152 context. fireChannelRead ( data)
151153 case . end( let trailers) :
154+ self . hasResponded = true
152155 self . responseCallbacks. receiveClose (
153156 self . receivedStatus. map { . fromNIOStatus( $0) } ?? . ok,
154157 trailers. map { . fromNIOHeaders( $0) } ?? [ : ] ,
@@ -167,7 +170,22 @@ final class ConnectStreamChannelHandler: NIOCore.ChannelInboundHandler, @uncheck
167170 }
168171
169172 func channelInactive( context: ChannelHandlerContext ) {
173+ let shouldNotify = !self . hasResponded
170174 self . closeConnection ( )
175+ if shouldNotify {
176+ self . hasResponded = true
177+ self . responseCallbacks. receiveClose (
178+ . unavailable,
179+ [ : ] ,
180+ ConnectError (
181+ code: . unavailable,
182+ message: " Channel became inactive " ,
183+ exception: nil ,
184+ details: [ ] ,
185+ metadata: [ : ]
186+ )
187+ )
188+ }
171189 context. fireChannelInactive ( )
172190 }
173191
@@ -176,6 +194,7 @@ final class ConnectStreamChannelHandler: NIOCore.ChannelInboundHandler, @uncheck
176194 return
177195 }
178196
197+ self . hasResponded = true
179198 self . responseCallbacks. receiveClose (
180199 . fromHTTPStatus( ( error as NSError ) . code) ,
181200 [ : ] ,
@@ -190,6 +209,7 @@ final class ConnectStreamChannelHandler: NIOCore.ChannelInboundHandler, @uncheck
190209 }
191210
192211 self . closeConnection ( )
212+ self . hasResponded = true
193213 self . responseCallbacks. receiveClose ( . deadlineExceeded, [ : ] , ConnectError . deadlineExceeded ( ) )
194214 }
195215}
0 commit comments