Skip to content

Commit

Permalink
KTOR-7194 Use system property for deferred sessions
Browse files Browse the repository at this point in the history
  • Loading branch information
bjhham committed Jan 17, 2025
1 parent 0f5ad71 commit ceab0f9
Show file tree
Hide file tree
Showing 8 changed files with 50 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import kotlinx.serialization.Serializable
import kotlin.test.Test
import kotlin.test.assertEquals

class SessionAuthTest {
open class SessionAuthTest {
@Test
fun testSessionOnly() = testApplication {
install(Sessions) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,34 +4,30 @@

package io.ktor.tests.auth

import io.ktor.client.request.HttpRequestBuilder
import io.ktor.client.request.get
import io.ktor.client.request.header
import io.ktor.client.request.post
import io.ktor.http.HttpStatusCode
import io.ktor.server.application.install
import io.ktor.server.auth.Authentication
import io.ktor.server.auth.authenticate
import io.ktor.server.auth.session
import io.ktor.server.response.respondText
import io.ktor.server.routing.get
import io.ktor.server.routing.post
import io.ktor.server.routing.routing
import io.ktor.server.sessions.SessionStorage
import io.ktor.server.sessions.Sessions
import io.ktor.server.sessions.cookie
import io.ktor.server.sessions.defaultSessionSerializer
import io.ktor.server.sessions.serialization.KotlinxSessionSerializer
import io.ktor.server.sessions.sessions
import io.ktor.server.sessions.set
import io.ktor.server.testing.testApplication
import io.ktor.client.request.*
import io.ktor.http.*
import io.ktor.server.application.*
import io.ktor.server.auth.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
import io.ktor.server.sessions.*
import io.ktor.server.sessions.serialization.*
import io.ktor.server.testing.*
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertFailsWith
import kotlin.test.*

class SessionAuthJvmTest {
class SessionAuthDeferredTest: SessionAuthTest() {

@BeforeTest
fun setProperty() {
System.setProperty("io.ktor.server.sessions.deferred", "true")
}

@AfterTest
fun clearProperty() {
System.clearProperty("io.ktor.server.sessions.deferred")
}

@Test
fun sessionIgnoredForNonPublicEndpoints() = testApplication {
Expand All @@ -45,7 +41,6 @@ class SessionAuthJvmTest {
cookie<MySession>("S", storage = brokenStorage) {
serializer = KotlinxSessionSerializer(Json.Default)
}
deferred = true
}
install(Authentication.Companion) {
session<MySession> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,12 @@ package io.ktor.server.sessions

import io.ktor.server.application.ApplicationCall

internal const val SESSIONS_DEFERRED_FLAG = "io.ktor.server.sessions.deferred"

internal expect fun isDeferredSessionsEnabled(): Boolean

/**
* Creates a lazy loading session from the given providers.
*/
internal expect fun createDeferredSession(call: ApplicationCall, providers: List<SessionProvider<*>>): StatefulSession

Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ internal val LOGGER = KtorSimpleLogger("io.ktor.server.sessions.Sessions")
public val Sessions: RouteScopedPlugin<SessionsConfig> = createRouteScopedPlugin("Sessions", ::SessionsConfig) {
val providers = pluginConfig.providers.toList()
val sessionSupplier: suspend (ApplicationCall, List<SessionProvider<*>>) -> StatefulSession =
if (pluginConfig.deferred) {
if (isDeferredSessionsEnabled()) {
::createDeferredSession
} else {
::createSession
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,6 @@ public class SessionsConfig {
*/
public val providers: List<SessionProvider<*>> get() = registered.toList()

/**
* When set to true, sessions will be lazily retrieved from storage.
*
* Note: this is only available for JVM in Ktor 3.0
*/
public var deferred: Boolean = false

/**
* Registers a session [provider].
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,7 @@ package io.ktor.server.sessions

import io.ktor.server.application.ApplicationCall

internal actual fun isDeferredSessionsEnabled(): Boolean = false

internal actual fun createDeferredSession(call: ApplicationCall, providers: List<SessionProvider<*>>): StatefulSession =
TODO("Deferred session retrieval is currently only available for JVM")
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* Copyright 2014-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
*/

package io.ktor.server.sessions

internal actual fun isDeferredSessionsEnabled(): Boolean =
System.getProperty(SESSIONS_DEFERRED_FLAG)?.toBoolean() == true
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/*
* Copyright 2014-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
*/

package io.ktor.server.sessions
import kotlinx.cinterop.ExperimentalForeignApi
import kotlinx.cinterop.toKString
import platform.posix.*

@OptIn(ExperimentalForeignApi::class)
internal actual fun isDeferredSessionsEnabled(): Boolean =
getenv(SESSIONS_DEFERRED_FLAG)?.toKString()?.toBoolean() == true

0 comments on commit ceab0f9

Please sign in to comment.