diff --git a/Sources/NIOCore/AsyncChannel/AsyncChannelOutboundWriterHandler.swift b/Sources/NIOCore/AsyncChannel/AsyncChannelOutboundWriterHandler.swift index 2a9de1328c..bae110c61c 100644 --- a/Sources/NIOCore/AsyncChannel/AsyncChannelOutboundWriterHandler.swift +++ b/Sources/NIOCore/AsyncChannel/AsyncChannelOutboundWriterHandler.swift @@ -133,7 +133,7 @@ internal final class NIOAsyncChannelOutboundWriterHandler @inlinable func handlerRemoved(context: ChannelHandlerContext) { self.context = nil - self.sink = nil + self.sink?.finish() } @inlinable diff --git a/Tests/NIOCoreTests/AsyncChannel/AsyncChannelTests.swift b/Tests/NIOCoreTests/AsyncChannel/AsyncChannelTests.swift index c5feb91e81..1047e54437 100644 --- a/Tests/NIOCoreTests/AsyncChannel/AsyncChannelTests.swift +++ b/Tests/NIOCoreTests/AsyncChannel/AsyncChannelTests.swift @@ -18,6 +18,25 @@ import NIOEmbedded import XCTest final class AsyncChannelTests: XCTestCase { + func testAsyncChannelCloseOnWrite() async throws { + guard #available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *) else { return } + final class CloseOnWriteHandler: ChannelOutboundHandler { + typealias OutboundIn = String + + func write(context: ChannelHandlerContext, data: NIOAny, promise: EventLoopPromise?) { + context.close(promise: promise) + } + } + let channel = NIOAsyncTestingChannel() + let wrapped = try await channel.testingEventLoop.executeInContext { + try channel.pipeline.syncOperations.addHandler(CloseOnWriteHandler()) + return try NIOAsyncChannel(synchronouslyWrapping: channel) + } + + try await wrapped.outbound.write("Test") + try await channel.closeFuture.get() + } + func testAsyncChannelBasicFunctionality() async throws { guard #available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *) else { return } let channel = NIOAsyncTestingChannel()