in ktor-server/ktor-server-jetty/jvm/src/io/ktor/server/jetty/JettyKtorHandler.kt [67:116]
override fun handle(
target: String,
baseRequest: Request,
request: HttpServletRequest,
response: HttpServletResponse
) {
try {
val contentType = request.contentType
if (contentType != null && contentType.startsWith("multipart/")) {
baseRequest.setAttribute(Request.MULTIPART_CONFIG_ELEMENT, multipartConfig)
// TODO someone reported auto-cleanup issues so we have to check it
}
request.startAsync()?.apply {
timeout = 0 // Overwrite any default non-null timeout to prevent multiple dispatches
}
baseRequest.isHandled = true
launch(dispatcher + JettyCallHandlerCoroutineName) {
val call = JettyApplicationCall(
environment.application,
baseRequest,
request,
response,
engineContext = engineDispatcher,
userContext = dispatcher,
coroutineContext = coroutineContext
)
try {
pipeline().execute(call)
} catch (cancelled: CancellationException) {
response.sendErrorIfNotCommitted(HttpServletResponse.SC_GONE)
} catch (channelFailed: ChannelIOException) {
} catch (t: Throwable) {
if (!response.isCommitted) {
call.respond(HttpStatusCode.InternalServerError)
}
} finally {
try {
request.asyncContext?.complete()
} catch (expected: IllegalStateException) {
}
}
}
} catch (ex: Throwable) {
environment.log.error("Application ${environment.application::class.java} cannot fulfill the request", ex)
response.sendErrorIfNotCommitted(HttpServletResponse.SC_INTERNAL_SERVER_ERROR)
}
}