in ktor-server/ktor-server-core/jvm/src/io/ktor/features/CallId.kt [192:237]
override fun install(pipeline: ApplicationCallPipeline, configure: Configuration.() -> Unit): CallId {
val configuration = Configuration().apply(configure)
val instance = CallId(
providers = (configuration.retrievers + configuration.generators).toTypedArray(),
repliers = configuration.responseInterceptors.toTypedArray(),
verifier = configuration.verifier
)
pipeline.insertPhaseBefore(ApplicationCallPipeline.Setup, phase)
if (instance.providers.isEmpty()) {
logger.warn("CallId feature is not configured: neither retrievers nor generators were configured")
return instance // don't install interceptor
}
pipeline.intercept(phase) {
val call = call
val providers = instance.providers
try {
for (i in 0 until providers.size) {
val callId = providers[i](call) ?: continue
if (!instance.verifier(callId)) continue // could throw a RejectedCallIdException
call.attributes.put(callIdKey, callId)
val repliers = instance.repliers
for (j in 0 until repliers.size) {
repliers[j](call, callId)
}
break
}
} catch (rejection: RejectedCallIdException) {
logger.warn(
"Illegal call id retrieved or generated that is rejected by call id verifier:" +
" (url-encoded) " +
rejection.illegalCallId.encodeURLParameter()
)
call.respond(HttpStatusCode.BadRequest)
finish()
}
}
return instance
}