'Is there any way to drop request inside plugin

Now I'm developing server application with ktor 2(2.0.0-eap-256). What I want to do is, according to header or other information, Reject or set adequate http status to response and do not let request go into service logic.

Below is What I tried.

val testPlugin = createApplication("testPlugin") {
    onCall {
        if (call.request.headers["auth"] == null) {
            call.respond(HttpStatusCode.BadRequest)
            return@onCall
        }
    }
}

fun Application.testRouting() {
    routing {
        get("/") { call.respond("hello") }
    }
}

fun Application.applyPlugin() {
    install(testPlugin)
}

But request goes into service logic defined by routing(with response which has HttpStatusCode.BadRequest). Is there any idea?

And also, I want to ask my understand about onCall/onCallReceive/onCallRespond is right

  1. onCall is invoked first, when request come.
  2. then, onCallReceive is invoked to handle request data such as file, body, etc
  3. after all service logic, onCallRespond is invoked.

Edit

About the last question, it is solved. onCallReceive is called when I invoke call.receive() to get request content

Edit

Add routing code

Edit

So, I edit plugin like this.

val testPlugin = createApplication(
        name = "testPlugin",
        createConfiguration = { TestPluginConfig() }
) {
    pluginConfig.apply {
      pipeline!!.intercept(ApplicationCallPipeline.Plugins){
          if (call.request.headers["auth"] == null) {
              call.respond(HttpStatusCode.BadRequest)
              finish()
          }
      }
   }
}

data class TestPluginConfig(
    var pipeline: Application? = null // io.ktor.sever.Application
)

fun Application.testRouting() {
    routing {
        get("/") { call.respond("hello") }
    }
}

fun Application.applyPlugin() {
    val pipeline = this // io.ktor.sever.Application
    install(testPlugin) { pipeline = pipeline }
}

It works just as I wanted

very thanks to Aleksei Tirman



Solution 1:[1]

According to Rustam Siniukov on the kotlin slack here it's enough to use call.respond in the plugin. My tests confirmed this.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Julius