in ktor-server/ktor-server-netty/jvm/src/io/ktor/server/netty/http1/NettyHttp1ApplicationResponse.kt [70:106]
override suspend fun respondUpgrade(upgrade: OutgoingContent.ProtocolUpgrade) {
val nettyContext = context
val nettyChannel = nettyContext.channel()
val userAppContext = userContext + NettyDispatcher.CurrentContext(nettyContext)
val bodyHandler = nettyContext.pipeline().get(RequestBodyHandler::class.java)
val upgradedReadChannel = bodyHandler.upgrade()
val upgradedWriteChannel = ByteChannel()
sendResponse(chunked = false, content = upgradedWriteChannel)
with(nettyChannel.pipeline()) {
if (get(NettyHttp1Handler::class.java) != null) {
remove(NettyHttp1Handler::class.java)
addFirst(NettyDirectDecoder())
} else {
cancel()
val cause = CancellationException("HTTP upgrade has been cancelled")
upgradedWriteChannel.cancel(cause)
bodyHandler.close()
throw cause
}
}
val job = upgrade.upgrade(upgradedReadChannel, upgradedWriteChannel, engineContext, userAppContext)
job.invokeOnCompletion {
upgradedWriteChannel.close()
bodyHandler.close()
upgradedReadChannel.cancel()
}
(call as NettyApplicationCall).responseWriteJob.join()
job.join()
context.channel().close()
}