Skip to content

Commit 92bb298

Browse files
committed
Finish multiplexer's inbound streams in more cases
1 parent 91136a6 commit 92bb298

4 files changed

+56
-0
lines changed

Sources/NIOHTTP2/HTTP2ChannelHandler+InboundStreamMultiplexer.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,24 @@ extension NIOHTTP2Handler.InboundStreamMultiplexer {
146146
}
147147
}
148148

149+
func errorCaughtReceived(_ error: any Error) {
150+
switch self {
151+
case .inline(let inlineStreamMultiplexer):
152+
inlineStreamMultiplexer.propagateErrorCaught(error)
153+
case .legacy:
154+
break // do nothing
155+
}
156+
}
157+
158+
func handlerRemovedReceived() {
159+
switch self {
160+
case .inline(let inlineStreamMultiplexer):
161+
inlineStreamMultiplexer.propagateHandlerRemoved()
162+
case .legacy:
163+
break // do nothing
164+
}
165+
}
166+
149167
func processedFrame(_ frame: HTTP2Frame) {
150168
switch self {
151169
case .inline(let inlineStreamMultiplexer):

Sources/NIOHTTP2/HTTP2ChannelHandler+InlineStreamMultiplexer.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,14 @@ extension InlineStreamMultiplexer {
150150
}
151151
}
152152

153+
internal func propagateErrorCaught(_ error: any Error) {
154+
self._commonStreamMultiplexer.propagateErrorCaught(error)
155+
}
156+
157+
internal func propagateHandlerRemoved() {
158+
self._commonStreamMultiplexer.propagateHandlerRemoved()
159+
}
160+
153161
internal func processedFrame(frame: HTTP2Frame) {
154162
self._commonStreamMultiplexer.processedFrame(streamID: frame.streamID, size: frame.payload.flowControlledSize)
155163
}

Sources/NIOHTTP2/HTTP2ChannelHandler.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,7 @@ public final class NIOHTTP2Handler: ChannelDuplexHandler {
414414
public func handlerRemoved(context: ChannelHandlerContext) {
415415
// Any frames we're buffering need to be dropped.
416416
self.outboundBuffer.invalidateBuffer()
417+
self.inboundStreamMultiplexer?.handlerRemovedReceived()
417418
self.inboundStreamMultiplexerState = .deinitialized
418419
}
419420

@@ -550,6 +551,11 @@ public final class NIOHTTP2Handler: ChannelDuplexHandler {
550551
self.inboundStreamMultiplexer?.channelWritabilityChangedReceived()
551552
context.fireChannelWritabilityChanged()
552553
}
554+
555+
public func errorCaught(context: ChannelHandlerContext, error: any Error) {
556+
self.inboundStreamMultiplexer?.errorCaughtReceived(error)
557+
context.fireErrorCaught(error)
558+
}
553559
}
554560

555561
/// Inbound frame handling.

Sources/NIOHTTP2/HTTP2CommonInboundStreamMultiplexer.swift

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,30 @@ extension HTTP2CommonInboundStreamMultiplexer {
213213
self.streamChannelContinuation?.finish()
214214
}
215215

216+
internal func propagateErrorCaught(_ error: any Error) {
217+
for channel in self.streams.values {
218+
channel.receiveStreamClosed(nil)
219+
}
220+
221+
for channel in self._pendingStreams.values {
222+
channel.receiveStreamClosed(nil)
223+
}
224+
225+
self.streamChannelContinuation?.finish(throwing: error)
226+
}
227+
228+
internal func propagateHandlerRemoved() {
229+
for channel in self.streams.values {
230+
channel.receiveStreamClosed(nil)
231+
}
232+
233+
for channel in self._pendingStreams.values {
234+
channel.receiveStreamClosed(nil)
235+
}
236+
237+
self.streamChannelContinuation?.finish()
238+
}
239+
216240
internal func selectivelyPropagateUserInboundEvent(context: ChannelHandlerContext, event: Any) {
217241
func propagateEvent(_ event: Any) {
218242
for channel in self.streams.values {

0 commit comments

Comments
 (0)