Skip to content

Commit 058dd7c

Browse files
committed
Fix StreamChannelHandler
Signed-off-by: Ludovic Ollagnier <[email protected]>
1 parent f8be261 commit 058dd7c

File tree

1 file changed

+20
-0
lines changed

1 file changed

+20
-0
lines changed

Libraries/ConnectNIO/Internal/ConnectStreamChannelHandler.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)