Skip to content

Commit

Permalink
KTOR-7449 Fix for uninitialized request
Browse files Browse the repository at this point in the history
  • Loading branch information
bjhham committed Sep 16, 2024
1 parent 31664ff commit 67d865e
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ public open class RoutingNode(
for (index in 0..handlers.lastIndex) {
pipeline.intercept(Call) {
val call = call as RoutingPipelineCall
val routingCall = call.routingCall()
val routingCall = RoutingCall(call)
val routingContext = RoutingContext(routingCall)
if (call.isHandled) return@intercept
handlers[index].invoke(routingContext)
Expand Down Expand Up @@ -201,10 +201,19 @@ public class RoutingCall internal constructor(
override val coroutineContext: CoroutineContext
get() = pipelineCall.coroutineContext

public override lateinit var request: RoutingRequest
internal set
public override lateinit var response: RoutingResponse
internal set
public override val request: RoutingRequest by lazy {
RoutingRequest(
pathVariables = pipelineCall.pathParameters,
request = pipelineCall.request,
call = this
)
}
public override val response: RoutingResponse by lazy {
RoutingResponse(
applicationResponse = pipelineCall.response,
call = this
)
}

public override val attributes: Attributes = pipelineCall.attributes
public override val application: Application = pipelineCall.application
Expand Down Expand Up @@ -285,22 +294,6 @@ public interface Routing : Route {
public fun trace(block: (RoutingResolveTrace) -> Unit)
}

private fun RoutingPipelineCall.routingCall(): RoutingCall {
val call = RoutingCall(
pipelineCall = this
)
call.request = RoutingRequest(
pathVariables = call.pathParameters,
request = request,
call = call
)
call.response = RoutingResponse(
applicationResponse = response,
call = call
)
return call
}

/**
* Return list of endpoints with handlers under this route.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,16 @@

package io.ktor.tests.routing

import io.ktor.client.plugins.api.*
import io.ktor.client.request.*
import io.ktor.http.*
import io.ktor.server.application.*
import io.ktor.server.request.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
import io.ktor.server.routing.RoutingRoot.Plugin.RoutingCallStarted
import io.ktor.server.testing.*
import io.ktor.util.pipeline.*
import kotlin.test.*

class RouteTest {
Expand Down Expand Up @@ -122,4 +128,19 @@ class RouteTest {
assertEquals(expected, endpoints.map { it.toString() }.toSet())
}
}

// KTOR-7449 Ensure request is properly initialized in the routing call
@Test
fun routingInitialization() = testApplication {
application {
monitor.subscribe(RoutingCallStarted) { call ->
println(call.request.httpMethod)
}
routing {
get { call.respond(HttpStatusCode.OK) }
}
}

assertEquals(HttpStatusCode.OK, client.get("/").status)
}
}

0 comments on commit 67d865e

Please sign in to comment.