Published 29 October 2026
Improvements
- KTOR-10005 Native accepted TCP sockets do not enable TCP_NODELAY, unlike JVM
- KTOR-9966 Netty poor performance on delay calls
- KTOR-4206 The "com.typesafe.config.ConfigException$Missing" exception leaks from the typesafe config library when configuration is merged
Bugfixes
- KTOR-10037 CIO: keep-alive connection hangs when a response fails before writing any bytes
- KTOR-9969 Kotlin/Native CIO server occasionally closes an accepted connection with zero response bytes under CPU load
- KTOR-9974 CIO: close_notify is written concurrently with the last record, corrupting the TLS output and the kotlinx-io segment pool
- KTOR-9925 Resources: Constant sibling route loses to parameterized one when routes are split across separate authenticate blocks
- KTOR-9938 Apache5: streaming response hangs when the block returns before the body arrives
- KTOR-10023 Ktor 3.6.0 no longer throws BadRequestException for malformed paths
- KTOR-9986 HttpRedirect: a relative Location with dot segments is not normalized, so most engines send
..in the request path - KTOR-10085 ETags: Ignore If-Modified-Since when If-None-Match is present
- KTOR-9430 DI: resources are not cleaned up during testing with testApplication
- KTOR-7175 Ktor-client, connections leak
- KTOR-9848 Android: The Android engine crashes with Unbalanced enter/exit on response read cancellation
- KTOR-9994 Android engine closes RawSourceChannel on the main thread and crashes with NetworkOnMainThreadException
- KTOR-9959 Sockets: CIO writer busy-loops when a nonblocking write returns zero
- KTOR-9970 Java: Cancelling a request before response headers does not abort the HTTP exchange
- KTOR-10006 OpenAPI: Compiler crash on local variable using object expression
- KTOR-9972 Android: DiskReadViolation when KtorSimpleLogger is initialized during plugin execution
- KTOR-9985 OpenAPI compiler plugin duplicates unrelated schemas (FooDTO -> FooDTO2) after adding new routes
- KTOR-2348 DoubleReceive: recursive receive pipeline re-entry when receiving content in a receivePipeline interceptor
- KTOR-9968 Test engine streaming responses hang when over 1MB
- KTOR-9894 Netty + Compression: response leaked when the client disconnects before the body is written
- KTOR-9987 WebSockets: Netty sometimes closes socket before sending close frame
- KTOR-9943 HttpStatement.execute can hang when its block abandons a response body
- KTOR-9980 CallLogging: MDC entries leak stale thread-local values when provider returns null
- KTOR-9790 testApplication:
sseSession()never returns when the SSE route installs aheartbeat - KTOR-9884 Directories are returned as empty binaries when using nested jars
- KTOR-4245 Code snippet in Kdoc for DefaultRequest doesn't compile
- KTOR-10035 WebSocket drops the queued Close frame when the server session fails
- KTOR-10036 testApplication: WebSocket client stops reading before the servers Close reply arrives