in ktor-server/ktor-server-core/jvm/src/io/ktor/features/CORS.kt [81:118]
public suspend fun intercept(context: PipelineContext<Unit, ApplicationCall>) {
val call = context.call
if (!allowsAnyHost || allowCredentials) {
call.corsVary()
}
val origin = call.request.headers.getAll(HttpHeaders.Origin)?.singleOrNull()
?.takeIf(this::isValidOrigin)
?: return
if (allowSameOrigin && call.isSameOrigin(origin)) return
if (!corsCheckOrigins(origin)) {
context.respondCorsFailed()
return
}
if (call.request.httpMethod == HttpMethod.Options) {
call.respondPreflight(origin)
// TODO: it shouldn't be here, because something else can respond to OPTIONS
// But if noone else responds, we should respond with OK
context.finish()
return
}
if (!call.corsCheckCurrentMethod()) {
context.respondCorsFailed()
return
}
call.accessControlAllowOrigin(origin)
call.accessControlAllowCredentials()
if (exposedHeaders != null) {
call.response.header(HttpHeaders.AccessControlExposeHeaders, exposedHeaders)
}
}