Framework for quickly creating connected applications in Kotlin with minimal effort

Overview

Ktor

Official JetBrains project Maven Central Kotlin Slack channel GitHub License

Ktor is an asynchronous framework for creating microservices, web applications and more. Written in Kotlin from the ground up.

import io.ktor.server.netty.*
import io.ktor.server.routing.*
import io.ktor.server.application.*
import io.ktor.http.*
import io.ktor.server.response.*
import io.ktor.server.engine.*

fun main(args: Array<String>) {
    embeddedServer(Netty, 8080) {
        routing {
            get("/") {
                call.respondText("Hello, world!", ContentType.Text.Html)
            }
        }
    }.start(wait = true)
}
  • Runs embedded web server on localhost:8080
  • Installs routing and responds with Hello, world! when receiving a GET http request for the root path

Principles

Unopinionated

Ktor Framework doesn't impose a lot of constraints on what technology a project is going to use – logging, templating, messaging, persistence, serialization, dependency injection, etc. Sometimes it may be required to implement a simple interface, but usually it is a matter of writing a transforming or intercepting function. Features are installed into the application using a unified interception mechanism which allows building arbitrary pipelines.

Ktor Applications can be hosted in any servlet container with Servlet 3.0+ API support such as Tomcat, or standalone using Netty or Jetty. Support for other hosts can be added through the unified hosting API.

Ktor APIs are mostly functions calls with lambdas. Thanks to Kotlin DSL capabilities, the code looks declarative. Application composition is entirely up to the developer's choice – with functions or classes, using dependency injection framework or doing it all manually in the main function.

Asynchronous

The Ktor pipeline machinery and API are utilising Kotlin coroutines to provide easy-to-use asynchronous programming model without making it too cumbersome. All host implementations are using asynchronous I/O facilities to avoid thread blocking.

Testable

Ktor applications can be hosted in a special test environment, which emulates a web server to some extent without actually doing any networking. It provides easy way to test an application without mocking too much stuff, and still achieve good performance while validating application calls. Running integration tests with a real embedded web server are of course possible, too.

JetBrains Product

Ktor is an official JetBrains product and is primarily developed by the team at JetBrains, with contributions from the community.

Documentation

Please visit ktor.io for Quick Start and detailed explanations of features, usage and machinery.

  • Getting started with Gradle
  • Getting started with Maven
  • Getting started with IDEA

Reporting Issues / Support

Please use our issue tracker for filing feature requests and bugs. If you'd like to ask a question, we recommend StackOverflow where members of the team monitor frequently.

There is also community support on the Kotlin Slack Ktor channel

Reporting Security Vulnerabilities

If you find a security vulnerability in Ktor, we kindly request that you reach out to the JetBrains security team via our responsible disclosure process.

Inspirations

Kotlin web frameworks such as Wasabi and Kara, which are currently deprecated.

Contributing

Please see the contribution guide and the Code of conduct before contributing.

Comments
  • ktor connection is closed for a long polling requests (ConnectionClosedException)

    ktor connection is closed for a long polling requests (ConnectionClosedException)

    Ktor Version

    1.1.3

    Ktor Engine Used(client or server and name)

    Apache Client

    JVM Version, Operating System and Relevant Context

    1.8

    Feedback

    I'm coming to this issue here after I initially thought that the problem is in underlying client (AsyncHttpClient): https://issues.apache.org/jira/browse/HTTPCLIENT-1980

    After many investigations it looks like the problem is not in AsyncHttpClient but in ktor. I've made a small reproducers that just perform constant GET requests to the same URL every 5 seconds. These reproducers were done using: HttpClient, AsyncHttpClient, Netty, vert.x Web Client and ktor. All clients except ktor are working fine for multiple days (~4 days). Whereas ktor is stopping after some hours with ConnectionClosedException:

    Exception in thread "main" org.apache.http.ConnectionClosedException: Connection closed
            at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.endOfInput(HttpAsyncRequestExecutor.java:345)
            at org.apache.http.impl.nio.DefaultNHttpClientConnection.consumeInput(DefaultNHttpClientConnection.java:261)
            at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:81)
            at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:39)
            at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:121)
            at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:162)
            at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:337)
            at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315)
            at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276)
            at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)
            at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:588)
            at java.lang.Thread.run(Thread.java:748)
    

    Do you need any logs to be done or how can I help you to find the cause?

    Thank you!

    bug 
    opened by dtolstyi 40
  • application/json default charset is not UTF-8 when parsing request

    application/json default charset is not UTF-8 when parsing request

    This is a follow up to #80. Apparently, responses were fixed, but there are still issues with the requests.

    Request with Content-Type: application/json is decoded not as UTF-8, while request with Content-Type: application/json; charset=utf-8 is decoded correctly. Both has to behave the same and be decoded as UTF-8.

    opened by MOZGIII 30
  • generic client KotlinxSerializer for ContentNegotiation feature

    generic client KotlinxSerializer for ContentNegotiation feature

    KTOR-3174 [Ktor Client] CborFeature Superset of #2610 Subsystem Client

    Motivation Add support for CBOR serialization format to unlock ktor client usage with CBOR servers. Also allow for easy registration of other serialization formats mapped to ContentType

    Solution Replicate the serialization() function behaviour we have for server-ContentNegotiation feature and use it to implement shortcuts for json and cbor.

    To free up the name ktor-client-serialization for new wrapper module to encapsulate such implementations, existing json modules were renamed to follow this schema: ktor-client-json-<<backingSerializer>>. e.g.: ktor-client-json-gson, ktor-client-json-serialization...

    Usage

    install(ContentNegotiation) {
      cbor(Cbor) {
         // Allows matching custom serializers in the pipeline. Already being used to inject JsonObject serializer for json implementation based on this
         match(MyCustomSerializer()) {value: Any ->
            value == someCondition
         }
      }
      // equvivalent to
      serialization(ContentType.Application.Cbor, Cbor) {
         match(MyCustomSerializer()) {value: Any ->
            value == someCondition
         }
      }
    }
    
    opened by mpetuska 29
  • Support serving pre-compressed static files

    Support serving pre-compressed static files

    This covers https://github.com/ktorio/ktor/issues/159#issuecomment-376326136

    Nowadays, it is quite common to pre-compress static files ( a.k.a assets ) to reduce response time (no need for on the fly compression).

    This pull request enables that, serving the pre-compressed version of the file, suppressing compression(if installed) and responding appropriate Content-Type and Content-Encoding. As brotli is not supported at the time of writing, it also covers serving brotli-compressed files.

    For example, if foo.js has been pre-compressed to foo.js.br, a request to foo.js (with appropriate Accept-Encoding headers) will result in foo.js.br being served, Content-Encoding set to br and Content-Type set to application/javascript.

    The same applies to gz files. If preCompressed is called, foo.js.gz will no longer be available @ foo.js.gz (with Content-Type: application/x-compressed). Instead it will become available @ foo.js with Content-Encoding set to gzip and Content-Type set to application/javascript. This also involves suppressing compression.

    Example usage:

    static {
        preCompressed()
        files("static")
    }
    

    Preferences and configuration of compression algorithms example: Gzip first:

    static {
        preCompressed(CompressedFileType.GZIP, CompressedFileType.BROTLI)
        files("static")
    }
    

    Brotli first:

    static {
        preCompressed(CompressedFileType.BROTLI, CompressedFileType.GZIP)
        files("static")
    }
    
    enhancement Server 
    opened by guicamest 27
  • Empty body in response using macosx64 target

    Empty body in response using macosx64 target

    Ktor Version and Engine Used (client or server and name) 1.3.0, client (macosx64) (using curl)

    Describe the bug When using macosx64 target in a Multiplatform project I'm getting empty BODY in response

    HttpClient: REQUEST: http://api.open-notify.org/astros.json
    HttpClient: METHOD: HttpMethod(value=GET)
    HttpClient: COMMON HEADERS
    HttpClient: -> Accept: application/json
    HttpClient: -> Accept-Charset: UTF-8
    HttpClient: CONTENT HEADERS
    HttpClient: BODY Content-Type: null
    HttpClient: BODY START
    HttpClient: BODY END
    

    The same code for iOS logs

    HttpClient: REQUEST: http://api.open-notify.org/astros.json
    HttpClient: METHOD: HttpMethod(value=GET)
    HttpClient: COMMON HEADERS
    HttpClient: -> Accept: application/json
    HttpClient: -> Accept-Charset: UTF-8
    HttpClient: CONTENT HEADERS
    HttpClient: BODY Content-Type: null
    HttpClient: BODY START
    HttpClient: BODY END
    HttpClient: BODY Content-Type: application/json
    HttpClient: BODY START
    HttpClient: {"people": [{"craft": "ISS", "name": "Andrew Morgan"}, {"craft": "ISS", "name": "Oleg Skripochka"}, {"craft": "ISS", "name": "Jessica Meir"}], "message": "success", "number": 3}
    HttpClient: BODY END
    

    The following is the common code that uses ktor

    class PeopleInSpaceApi {
        private val url = "http://api.open-notify.org/astros.json"
    
        private val client by lazy {
            HttpClient() {
                install(JsonFeature) {
                    serializer = KotlinxSerializer(Json(JsonConfiguration(strictMode = false)))
                }
                install(Logging) {
                    logger = Logger.DEFAULT
                    level = LogLevel.ALL
                }
            }
        }
    
        suspend fun fetchPeople(): AstroResult {
            return client.get(url) 
        }
    }
    

    I'm using following dependencies

            macOSMain.dependencies {
                // Coroutines
                implementation('org.jetbrains.kotlinx:kotlinx-coroutines-core-macosx64') {
                    version {
                        strictly '1.3.3-native-mt'
                    }
                }
    
                // Ktor
                implementation "io.ktor:ktor-client-curl:${Versions.ktor}"
                implementation "io.ktor:ktor-client-core-macosx64:${Versions.ktor}"
                implementation "io.ktor:ktor-client-json-macosx64:${Versions.ktor}"
                implementation "io.ktor:ktor-client-logging-macosx64:${Versions.ktor}"
                implementation "io.ktor:ktor-client-serialization-macosx64:${Versions.ktor}"
    
                // Serialize
                implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-macosx64:${Versions.kotlinxSerialization}"
    
            }
    

    (kotlinxSerialization = "0.14.0")

    bug 
    opened by joreilly 24
  • SSL pinning for iOS

    SSL pinning for iOS

    How to make SSL pinning for iOS. As I am getting response but for other thing its not working.

    Getting crash near this code
    val remoteCertificateData : NSData = SecCertificateCopyData(certificate) as NSData

    This is the error.

    Uncaught Kotlin exception: kotlin.TypeCastException

    Here is my code.

    override fun URLSession(
                    session: NSURLSession,
                    didReceiveChallenge: NSURLAuthenticationChallenge,
                    completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Unit
                ) {
                    val serverTrust = didReceiveChallenge.protectionSpace.serverTrust
                    val certificate = SecTrustGetCertificateAtIndex(serverTrust,0)
    
                    var result: SecTrustResultType = 0u
    
                    memScoped{
                        val nativeResult = alloc<SecTrustResultTypeVar>()
                        nativeResult.value = result
    
                        SecTrustEvaluate(serverTrust!!, nativeResult.ptr)
                    }
    
    
                    val remoteCertificateData : NSData = SecCertificateCopyData(certificate) as NSData
    
                    val bundle = NSBundle.bundleForClass(objc_getRequiredClass("IosClientEngine"))
                    Logger.debug("pathToCert","$bundle")
    
                    val pathToCert = bundle.pathForResource("MyCertificate","cer")
    
                    val localCertificate : NSData = NSData.dataWithContentsOfFile(pathToCert!!)!!
    
                    if (localCertificate == remoteCertificateData) {
                        completionHandler(NSURLSessionAuthChallengeUseCredential,NSURLCredential.create(serverTrust))
                
                    } else {
                        completionHandler(NSURLSessionAuthChallengeUseCredential, null)
                
                    }
                }
    
    feature 
    opened by Rjmaurya13 24
  • Add modulepath support for Java >= 9

    Add modulepath support for Java >= 9

    Ktor application can't be compiled with JDK >=9. I'm getting a lot of such errors:

    error: module kotlinx.io.jvm reads package io.ktor.http from both ktor.server.core and ktor.http.jvm
    error: module kotlinx.io.jvm reads package io.ktor.http.content from both ktor.server.core and ktor.http.jvm
    error: module kotlinx.io.jvm reads package io.ktor.util from both ktor.server.core and ktor.utils.jvm
    error: module kotlinx.coroutines.jdk8 reads package io.ktor.http from both ktor.server.core and ktor.http.jvm
    error: module kotlinx.coroutines.jdk8 reads package io.ktor.http.content from both ktor.server.core and ktor.http.jvm
    error: module kotlinx.coroutines.jdk8 reads package io.ktor.util from both ktor.server.core and ktor.utils.jvm
    error: module kotlinx.coroutines.core reads package io.ktor.http from both ktor.server.core and ktor.http.jvm
    error: module kotlinx.coroutines.core reads package io.ktor.http.content from both ktor.server.core and ktor.http.jvm
    error: module kotlinx.coroutines.core reads package io.ktor.util from both ktor.server.core and ktor.utils.jvm
    ...................
    

    Support of Java 8 ends quite soon, so it makes sense to start supporting Jigsaw. IMHO, this should be prioritized, as it will require breaking backward compatibility. The less Ktor is popular, the easier would be to break backward compatibility. And Ktor will definitely become more popular over time.

    Ktor Version

    1.2.0

    JVM Version, Operating System and Relevant Context

    JDK 12

    ux 
    opened by remal 24
  • kotlin.native.concurrent.InvalidMutabilityException: mutation attempt of frozen kotlinx.coroutines.StandaloneCoroutine@28a82d8

    kotlin.native.concurrent.InvalidMutabilityException: mutation attempt of frozen kotlinx.coroutines.StandaloneCoroutine@28a82d8

    works on android, breaks on ios

    code:

    fun triggerNetworkCall(){
          GlobalScope.apply {
                launch(Background) {
                    try {
                        val data = repository.getSettings()
                    } catch (t: Throwable) {
                        Logger.d("ktor", t.message?:"null")
                    }
                }
            }
    }
    
     suspend fun getSettings(): String? {
            val response =  apiConfig.getReferralData()
            return response
    }
    
    suspend fun getReferralData(): String? {
           val localClient = HttpClient(PlatformHttpClient.httpClientEngine){
                install(JsonFeature)
            }
            return localClient.post {
                url {
                    protocol = URLProtocol.HTTPS
                    host = "postman-echo.com"
                    encodedPath = "post"
                }
                contentType(ContentType.Application.Json)
                body = "{}"
                HttpMethod.Post
            }
    }
    

    This post request works in android but fails in iOS with following stack trace:

    Uncaught Kotlin exception: kotlin.native.concurrent.InvalidMutabilityException: mutation attempt of frozen kotlinx.coroutines.StandaloneCoroutine@1a8b4e8
    

    whereas a get request works on both platforms. Following is the function being used:

    suspend fun getReferralData(): String? {
           val localClient = HttpClient(PlatformHttpClient.httpClientEngine){
                install(JsonFeature)
            }
    
            val address = Url("https://postman-echo.com/get?foo1=bar1&foo2=bar2")
            return localClient.get {
                url {
                    url(address.toString())
                }
            }
    }
    

    Dispatchers definition: iOS

    internal actual val Main: CoroutineDispatcher = NsQueueDispatcher(dispatch_get_main_queue())
    
    internal actual val Background: CoroutineDispatcher = Main
    
    
    internal class NsQueueDispatcher(
        private val dispatchQueue: dispatch_queue_t
    ) : CoroutineDispatcher() {
        override fun dispatch(context: CoroutineContext, block: Runnable) {
            dispatch_async(dispatchQueue) {
                block.run()
            }
        }
    }
    

    android

    internal actual val Main: CoroutineDispatcher = Dispatchers.Main
    
    internal actual val Background: CoroutineDispatcher = Dispatchers.Default
    

    dependencies

    commonMain {
    
                dependencies {
                    implementation "org.jetbrains.kotlin:kotlin-stdlib-common:1.3.61"
                    implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:0.14.0"
                    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:1.3.2-1.3.60"
                    implementation "co.touchlab:stately:0.9.4"
                    implementation "co.touchlab:stately-collections:0.9.4"
                    implementation "io.ktor:ktor-client-core:1.2.6"
                    implementation "io.ktor:ktor-client-json:1.2.6"
                    implementation "io.ktor:ktor-client-logging:1.2.6"
                    implementation "io.ktor:ktor-client-serialization:1.2.6"
                    implementation "com.github.aakira:napier:1.1.0"
    
                }
            }
    
            androidMain {
                dependencies {
                    implementation "org.jetbrains.kotlin:kotlin-stdlib:1.3.61"
                    implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.14.0"
                    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.2-1.3.60"
                    implementation "io.ktor:ktor-client-core-jvm:1.2.6"
                    implementation "io.ktor:ktor-client-json-jvm:1.2.6"
                    implementation "io.ktor:ktor-client-logging-jvm:1.2.6"
                    implementation "io.ktor:ktor-client-serialization-jvm:1.2.6"
                    implementation "io.ktor:ktor-client-android:1.2.6"
                    implementation "com.github.aakira:napier-android:1.1.0"
                }
            }
    
            iosMain {
                dependencies {
                    implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:0.14.0"
                    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-native:1.3.2-1.3.60"
    
                    implementation "io.ktor:ktor-client-core-native:1.2.6"
                    implementation "io.ktor:ktor-client-json-native:1.2.6"
                    implementation "io.ktor:ktor-client-logging-native:1.2.6"
                    implementation "io.ktor:ktor-client-serialization-native:1.2.6"
                    implementation "io.ktor:ktor-client-ios:1.2.6"
                    implementation "com.github.aakira:napier-ios:1.1.0"
                }
            }
    
    bug 
    opened by mishrabhilash 23
  • [Question] CPU 100% Apache Ktor Http Client

    [Question] CPU 100% Apache Ktor Http Client

    Ktor Version

    1.1.3

    Ktor Engine Used(client or server and name)

    Apache

    JVM Version, Operating System and Relevant Context

    Feedback

    I utilize ktor http client to communicating from service to other service, but after 10 minutes deployment my machine experience CPU 100%, any idea why ?

    here's the building block that I use,

    override fun sendAsync(request: HttpRequest, responseCallback: Callback<HttpResponse>) {
        GlobalScope.launch (Dispatchers.IO + CoroutineName(key ?: "")) {
          try {
            decorateRequest(request)
    
            val requestUrl = URL(request.url)
            val requestBody = String(request.body.asArray(), StandardCharsets.UTF_8)
            val requestMethod = HttpMethod(request.method)
            val requestContentType = createContentType(request)
    
            val clientResponse = httpClient!!.request<io.ktor.client.response.HttpResponse>{
              method = requestMethod
              url(requestUrl)
              body = TextContent(requestBody, requestContentType)
    
              request.headers.forEach {
                if (!unsafeHeaderSet.contains(it.name)) {
                  header(it.name, it.value)
                }
              }
            }
    
            val response = HttpResponse()
            val responseBodyString = String(clientResponse.readBytes())
            response.statusCode = clientResponse.status.value
            response.bodyEncoding = "UTF-8"
            response.body = IndirectNIOBuffer(ByteBuffer.wrap(responseBodyString.toByteArray(charset("UTF-8"))), true)
    
            clientResponse.headers.forEach { name, value ->
              val headerValue = value.joinToString(",")
    
              response.addHeader(name, headerValue)
            }
    
            clientResponse.close()
            responseCallback.onComplete(response)
          } catch (error: Exception) {
            responseCallback.onException(error)
          }
        }
      }
    
    perf problem 
    opened by davidasync 23
  • Fix bug causing headers to be omitted when connecting to websocket using K/JS (nodejs) (KTOR-1629)

    Fix bug causing headers to be omitted when connecting to websocket using K/JS (nodejs) (KTOR-1629)

    Subsystem Websocket client on Kotlin/JS (nodejs)

    Motivation Because the browser websocket client does not support custom headers on the WS handshake the Ktor JS engine just ignores them completely however the used NodeJS package (ws) supports setting custom headers

    Issue: KTOR-1629

    Solution Change the JsClientEngine.createWebsocketFunction() to also acknowledge the headers on nodejs

    - private fun createWebSocket(urlString_capturingHack: String): WebSocket {
    + private fun createWebSocket(urlString_capturingHack: String, headers: Headers): WebSocket {
            return if (PlatformUtils.IS_NODE) {
                val ws_capturingHack = js("require('ws')")
    +            val headers_capturingHack: dynamic = object {}
    +           headers.forEach { name, values ->
    +                val value = values.first()
    +                headers_capturingHack[name] = value
    +           }
    -            js("new ws_capturingHack(urlString_capturingHack)")
    +            js("new ws_capturingHack(urlString_capturingHack, { headers: headers_capturingHack })")
            } else {
                js("new WebSocket(urlString_capturingHack)")
            }
        }
    
    opened by DRSchlaubi 22
  • BasicAuth is not resolved as a valid import in 1.2.0

    BasicAuth is not resolved as a valid import in 1.2.0

    Ktor Version

    1.2.0

    Ktor Engine Used(client or server and name)

    Ktor-engine: Netty, httpclient: Apache

    JVM Version, Operating System and Relevant Context

    java: 11.0.2-open OS: linux, ubuntu build-system: maven

    Feedback

    After upgrade to version 1.2.0 from verison 1.1.4, the BasicAuth class fails to resolve: 'import io.ktor.client.features.auth.basic.BasicAuth' does not work.

    Error:

    [ERROR] /home/larsgard/workspace/ktor-test/src/main/kotlin/Main.kt: (8, 43) Unresolved reference: BasicAuth
    [ERROR] /home/larsgard/workspace/ktor-test/src/main/kotlin/Main.kt: (16, 21) Unresolved reference: BasicAuth
    [ERROR] /home/larsgard/workspace/ktor-test/src/main/kotlin/Main.kt: (17, 17) Unresolved reference: username
    [ERROR] /home/larsgard/workspace/ktor-test/src/main/kotlin/Main.kt: (18, 17) Unresolved reference: password
    [INFO] Kotlin compile iteration: /home/larsgard/workspace/ktor-test/src/main/kotlin/Main.kt
    

    Sample application with Main.kt and pom.xml below:

    src/main/kotlin/Main.kt:

    import io.ktor.application.call
    import io.ktor.client.HttpClient
    import io.ktor.client.engine.apache.Apache
    import io.ktor.http.ContentType
    import io.ktor.response.respondText
    import io.ktor.routing.get
    import io.ktor.routing.routing
    import io.ktor.client.features.auth.basic.BasicAuth
    import io.ktor.server.engine.embeddedServer
    import io.ktor.server.netty.Netty
    
    
    fun main(args: Array<String>) {
        val server = embeddedServer(Netty, port = 8080) {
            val myClient = HttpClient(Apache) {
                install(BasicAuth) {
                    username = "username"
                    password = "password"
                }
            }
            routing {
                get("/") {
                    call.respondText("Hello World!", ContentType.Text.Plain)
                }
                get("/demo") {
                    call.respondText("HELLO WORLD!")
                }
            }
        }
        server.start(wait = true)
    
    }
    
    

    Maven file:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>no.nils.ktortest</groupId>
      <artifactId>ktortest</artifactId>
      <version>1.0-SNAPSHOT</version>
    
      <name>ktortest</name>
    
      <properties>
        <source.java.version>11</source.java.version>
        <target.java.version>11</target.java.version>
        <kotlin.version>1.3.31</kotlin.version>
        <ktor.version>1.2.0</ktor.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <kotlin.compiler.incremental>true</kotlin.compiler.incremental>
      </properties>
    
    
      <dependencies>
        <dependency>
          <groupId>org.jetbrains.kotlin</groupId>
          <artifactId>kotlin-stdlib</artifactId>
          <version>${kotlin.version}</version>
        </dependency>
        <dependency>
          <groupId>org.jetbrains.kotlin</groupId>
          <artifactId>kotlin-stdlib</artifactId>
          <version>${kotlin.version}</version>
        </dependency>
        <dependency>
          <groupId>io.ktor</groupId>
          <artifactId>ktor-server-netty</artifactId>
          <version>${ktor.version}</version>
        </dependency>
        <dependency>
          <groupId>io.ktor</groupId>
          <artifactId>ktor-client-apache</artifactId>
          <version>${ktor.version}</version>
        </dependency>
        <dependency>
          <groupId>io.ktor</groupId>
          <artifactId>ktor-server-core</artifactId>
          <version>${ktor.version}</version>
        </dependency>
        <dependency>
          <groupId>io.ktor</groupId>
          <artifactId>ktor-client-auth-basic</artifactId>
          <version>${ktor.version}</version>
        </dependency>
      </dependencies>
    
      <build>
        <sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
        <testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>
    
        <plugins>
          <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
              <source>${source.java.version}</source>
              <target>${target.java.version}</target>
            </configuration>
          </plugin>
    
          <plugin>
            <artifactId>kotlin-maven-plugin</artifactId>
            <groupId>org.jetbrains.kotlin</groupId>
            <version>${kotlin.version}</version>
            <executions>
              <execution>
                <id>compile</id>
                <goals>
                  <goal>compile</goal>
                </goals>
                <configuration>
                  <args>-Xuse-experimental=kotlin.Experimental</args>
                </configuration>
              </execution>
              <execution>
                <id>test-compile</id>
                <goals>
                  <goal>test-compile</goal>
                </goals>
                <configuration>
                  <args>-Xuse-experimental=kotlin.Experimental</args>
                </configuration>
              </execution>
            </executions>
          </plugin>
    
        </plugins>
      </build>
    </project>
    
    opened by nilsmagnus 22
  • KTOR-1144 Make OAuth2 functionality multiplatform

    KTOR-1144 Make OAuth2 functionality multiplatform

    https://youtrack.jetbrains.com/issue/KTOR-1144/Make-OAuth2-functionality-of-the-ktor-auth-feature-to-be-common-client-feature

    No new code, only moving and splitting to expect/actual

    opened by rsinukov 0
  • [QUIC] added basic QUIC socket API

    [QUIC] added basic QUIC socket API

    Subsystem ktor-network

    Motivation These classes describe basic functionality around QUIC usage as transport protocol.

    Solution QUICServer exposes QUICStream input and output channels. (QUICStream is a stub for now, as we plan to work around it at last inside QUIC itself). QUICServer and QUICSocketBase are base classes, which will contain most of the QUIC logic we plan to implement.

    opened by Mr3zee 0
  • KTOR-4766 - Add basic support to use UnixSockets with CIO

    KTOR-4766 - Add basic support to use UnixSockets with CIO

    Subsystem CIO Client and Server

    Motivation Add basic support for unix sockets with a custom CIO client and server. Native (and better) support would require breaking changes.

    Solution Extract resolving the socketAddress into new functions without breaking changes. A user can now implement unix socket support using a custom cio client/server with minimal code.

    opened by hfhbd 0
  • Bump org.gradle.kotlin.kotlin-dsl from 3.2.4 to 4.0.1

    Bump org.gradle.kotlin.kotlin-dsl from 3.2.4 to 4.0.1

    Bumps org.gradle.kotlin.kotlin-dsl from 3.2.4 to 4.0.1.

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies java 
    opened by dependabot[bot] 0
  • GitHub Workflows security hardening

    GitHub Workflows security hardening

    Subsystem build

    Motivation This PR adds explicit permissions section to workflows. This is a security best practice because by default workflows run with extended set of permissions (except from on: pull_request from external forks). By specifying any permission explicitly all others are set to none. By using the principle of least privilege the damage a compromised workflow can do (because of an injection or compromised third party tool or action) is restricted.

    Solution It is recommended to have most strict permissions on the top level and grant write permissions on job level case by case.

    opened by sashashura 0
Releases(2.2.2)
  • 2.2.2(Jan 4, 2023)

    Published 3 January 2023

    Improvements

    • Resource annotation should be MetaSerializable (KTOR-5397)
    • The swaggerUI method is too restrictive and cannot be called inside a route (KTOR-5307)
    • Engine shutdown grace period and timeout are not configurable (KTOR-5359)
    • Allow specifying immutable in CacheControl (KTOR-3757)

    Bugfixes

    • Server cannot be started with the Swagger plugin (KTOR-5308)
    • Regression in 2.2.1: Got EOF but at least 0 bytes were expected (5372)
    • HttpRequestRetry: Memory leak of coroutines objects when using the plugin (KTOR-5099)
    • iOS unit test deadlocks with DarwinClientEngine (KTOR-5332)
    • Gzip encoding: IllegalStateException: Expected 112, actual 113 (KTOR-5300)
    • Netty, HSTS: UnsupportedOperationException is thrown when the server responds before HSTS plugin (KTOR-5276)
    Source code(tar.gz)
    Source code(zip)
  • 2.2.1(Dec 8, 2022)

  • 2.2.0(Dec 7, 2022)

    Published 7 December 2022

    • Intergate Swagger UI Hosting as Ktor Feature (KTOR-774)
    • New plugins API for client (KTOR-5161)
    • Rate-Limit Support on Server (KTOR-1196)
    • Make sessions plugin multiplatform (KTOR-4960)
    • Add the ability to access the route inside a route-scoped plugin (KTOR-5112)
    • Add a method that returns a list of child routes recursively (KTOR-581)
    • Support Default Value for missing Env Variables in YAML (KTOR-5283)
    • Netty: ApplicationStarted event is fired before the server starts accepting connections (KTOR-4259)
    • parseAuthorizationHeader throws ParseException on header value with multiple challenges (KTOR-5216)
    • ByteChannel exception: Got EOF but at least 1 byte were expected (KTOR-5252)
    • Application data in OAuth State parameter (KTOR-5225)
    • NativePRNGNonBlocking is not found, fallback to SHA1PRNG (KTOR-668)
    • Not calling call.respond() at server results in 404 for the client (KTOR-721)
    • Restoring thread context elements when directly resuming to parent is broken (KTOR-2644)
    • Out of the box ContentConverter for Protobuf (KTOR-763)
    • Darwin: response is never returned when usePreconfiguredSession is used (KTOR-5134)
    • List.merge() should have reversed priority (KTOR-5208)
    • Allow nested authentications to be combined using AND (KTOR-5021)
    • The swaggerUI plugin should be placed in the io.ktor.server.plugins.swagger package (KTOR-5192)
    • CORS Plugin should log reason for returning 403 Forbidden errors (KTOR-4236)
    • The default path to an OpenAPI specification doesn't work for the 'openAPI' plugin (KTOR-5193)
    • JWT: JWTPayloadHolder.getListClaim() throws NPE when specified claim is absent (KTOR-5098)
    • Logging: the plugin instantiates the default logger even when a custom one is provided (KTOR-5186)
    • Java client engine doesn't handle HttpTimeout.INFINITE_TIMEOUT_MS properly (KTOR-2814)
    • SessionTransportTransformerMessageAuthentication: Comparison of digests fails when there is a space in a value (KTOR-5168)
    • Support serving OpenAPI from resources (KTOR-5150)
    • Remove check for internal class in Select (KTOR-5035)
    • Persistent Client HttpCache (KTOR-2579)
    • Support native windows HTTP client (KTOR-735)
    • Add Server BearerAuthenticationProvider (KTOR-5118)
    • Merged config: "Property *.size not found" error when calling configList method on an array property (KTOR-5143)
    • "POSIX error 56: Socket is already connected" error when a socket is connection-mode on Darwin targets (KTOR-4877)
    • StatusPages can't handle errors in HTML template (KTOR-5107)
    • HttpRequestRetry: Memory leak of coroutines objects when using the plugin (KTOR-5099)
    • CallLogging and CallId: exceptions thrown in WriteChannelContent.writeTo are swallowed (KTOR-4954)
    • Temp files generated by multipart upload are not cleared in case of exception or cancellation (KTOR-5051)
    • Websockets, Darwin: trusting a certificate via handleChallenge doesn't work for Websockets connections (KTOR-5094)
    • Digest auth: Support returning any objects which implement Principal interface (KTOR-5059)
    • Add Debug Logging to Default Transformers (KTOR-4529)
    • No way getting client's source address from IP packet (KTOR-2501)
    • Add Env Variable to Change Log Level on Native Server (KTOR-4998)
    • Add Debug Logging for Ktor Plugins and Routing (KTOR-4510)
    • Add Debug Logging to ContentNegotiation (KTOR-4518)
    • Add Debug Logging to Routing (KTOR-4524)
    • Add Debug Logging to Auth Plugin (KTOR-4519)
    • Add Debug Logging to Status Pages Plugin (KTOR-4527)
    • Add Debug Logging to PartialContent Plugin (KTOR-4525)
    • Add Debug Logging to Sessions Plugin (KTOR-4526)
    • Add Debug Logging to Call Id (KTOR-4520)
    • Add Debug Logging to WebSockets Plugin (KTOR-4528)
    • Add Debug Logging to Double Receive Plugin (KTOR-4530)
    • Add Debug Logging to Compression Plugin (KTOR-4521)
    • Make certificate generation helpers more flexible (KTOR-5023)
    • Jackson converter: Support requests with Content-Length header (KTOR-4904)
    • Add a way to get a client's port (KTOR-430)
    • Retry and timeout client plugins don't work together (KTOR-4652)
    • Server Session - Switch to Kotlinx serialization (KTOR-2572)
    • ApplicationCall.respondRedirect should have overload for Url (KTOR-1538)
    • Make API to Use Configuration in Application Plugins (KTOR-4533)
    • Way to block use of TLS 1.0/1.1 when using Ktor/Netty (KTOR-4587)
    • testApplication: application initialization block isn't eagerly called (KTOR-4819)
    • testApplication: test server lifecycle management (KTOR-4773)
    • The beginning character of encodedPath field(Url class) is wrong when relative path (KTOR-621)
    • Unable to access userPrincipal of servletRequest in ktor-server-servlet (KTOR-4784)
    • When unable to get JWKS, JWTAuth swallows the underlying exception and only logs the last message (KTOR-636)
    • CIO Server generates wrong URL for OAuth URL provider using Locations (KTOR-2143)
    • Inconsistency among server engines when determining port/host of an incoming request (KTOR-4141)
    • Update Versions of Dependencies (KTOR-5293)
    Source code(tar.gz)
    Source code(zip)
  • 2.1.3(Oct 28, 2022)

    Published 26 October 2022

    • JS: window.location.origin returns null when executed in iframe via srcdoc attribute (KTOR-4993)
    • SensitivityWatchEventModifier - Move the reflection call of this modifier out from the Ktor Core (KTOR-1647)
    • "java.lang.IllegalArgumentException: Failed requirement." in SelectorManagerSupport (KTOR-2914)
    • HOCON: CLI parameters don't override custom properties since 2.1.0 (KTOR-5000)
    • Websockets timeout doesn't cause a close of a connection (KTOR-3504)
    • DefaultHeaders: a header is duplicated in a StatusPages's handler (KTOR-4990)
    • Websockets: timeout doesn't cause closing of incoming and outgoing channels (KTOR-2430)
    • RFC 3986 recommendation for encoding URI is NOT followed (KTOR-993)
    • Cookies: Invalid encoding of cookies' values since 1.4.0 (KTOR-917)
    • ByteReadChannel is unable to read files with long lines (KTOR-2588)
    • WebSocketDeflateExtension configureProtocols always failed with stackOverflow (KTOR-4916)
    • Update Kotlin to 1.7.20 (KTOR-4963)
    • Netty HTTP/2: response headers contain ":status" header and that leads to IllegalHeaderNameException in the ConditionalHeaders plugin (KTOR-4943)
    • Maven: ktor-server-test-host-jvm causes dependency error starting from Ktor 2.0.3 (KTOR-4900)
    • Autoreloading: "Flow invariant is violated" error since Ktor 2.0.3 (KTOR-4926)
    • Autoreloading: ClassCastException when retrieving plugins in testApplication (KTOR-4729)
    • CIO engine has wrong doc for request timeout (KTOR-4941)
    • CIO: A request through a proxy server results in 403 from Cloudflare (KTOR-4925)
    Source code(tar.gz)
    Source code(zip)
  • 2.1.2(Sep 30, 2022)

    Published 29 September 2022

    • HttpCacheEntry ignoring Request Cache-Control directives (KTOR-4894)
    • testApplication does not handle port and connectors (KTOR-4875)
    • Native: Wrong status code when requesting with DELETE method and body (KTOR-3566)
    • Default host address 0.0.0.0 isn't reachable on Windows (KTOR-4834)
    • TestApplicationEngine error handling is inconsistent with DefaultEnginePipeline, breaking clients (KTOR-4009)
    • Routing: Wrong content-type results in 400 Bad Request instead of 415 Unsupported Media type (KTOR-4849)
    Source code(tar.gz)
    Source code(zip)
  • 2.1.1(Sep 6, 2022)

    Published 6 September 2022

    • CIO: responses are received with a huge delay on JVM Windows (due to reverse DNS lookup internally) (KTOR-4827)
    • Netty HTTP/2 not working (KTOR-578)
    • HTTP/2 push fails with Netty engine (KTOR-800)
    • HttpCookies: no space between cookie pairs (KTOR-3854)
    • Netty ALPN provider detection not working (KTOR-4712)
    • CIO: Connection reset by peer on MacOS (KTOR-2036)
    • CallLogging MDC with sessions: Application feature Sessions is not installed (KTOR-550)
    • Deprecate Public API with Atomicfu Declarations (KTOR-4774)
    • Deprecate receiveOrNull because it's confusing (KTOR-4772)
    • Server ContentNegotiation Plugin doesn't check ignoredTypes for Request Body (KTOR-4770)
    • IllegalArgumentException is thrown when UnixSocketAddress.path is accessed on JVM (JDK 16+) (KTOR-4695)
    • WebSocketDeflateExtension not following RFC (KTOR-4696)
    • The parseWebSocketExtensions function behaves incorrectly (KTOR-3189)
    • Receive non-Nullable Type Throws NPE in Case of Failure (KTOR-4771)
    • Darwin: Symbol not found: OBJC_CLASS$_NSURLSessionWebSocketMessage on iOS 12 (KTOR-4159)
    • Fix Merging Date Headers on the Client (KTOR-4782)
    • Replace exception in InputStreamAdapter and OutputStreamAdapter constructors with warning message If parking (KTOR-4736)
    • Clearing Session Cookie in Chrome 80+ with SameSite and Secure (KTOR-437)
    • The OutgoingContent.toByteArray() stalls when used in combination with a OutgoingContent.WriteChannelContent (KTOR-2126)
    • Missing Content-Type header in a request (KTOR-1407)
    • Crash when making requests from browser inside of web worker (KTOR-4715)
    • An error occurs when there is a binary such as protobuf in the response body of error (KTOR-1619)
    • CallLogging configured MDC entries are not passed to StatusPages exception handlers (KTOR-4193)
    • LocalFileContent incorrectly relies on the last modification time of a file to check its existence (KTOR-4707)
    • Sessions: WSS in combination with Secure cookies throws IllegalArgumentException (KTOR-4697)
    • Json request failure with configured form authentication (KTOR-678)
    Source code(tar.gz)
    Source code(zip)
  • 2.1.0(Aug 11, 2022)

    Published 11 August 2022

    • Add YAML Configuration Format Support (KTOR-3572)
    • Allow overriding HSTS settings per host (KTOR-4578)
    • CORS: Pattern matching for origin (KTOR-316)
    • Darwin: Allow setting custom NSURLSession (KTOR-583)
    • Support setting caching options on call (KTOR-457)
    • Revert default behavior of string encoding for ContentNegotiation and JsonPlugin (KTOR-4739)
    • Make Content-Length header validation optional (KTOR-4655)
    • Client resources plugin miss builders for PATCH method (KTOR-4658)
    • The awaitSuspend method wakes up early in closed ByteChannelSequential (KTOR-4597)
    • HttpCache plugin does not support max-stale directive (KTOR-4610)
    • Incoming request body validation (KTOR-503)
    • Client does not support sending or receiving json null value (KTOR-745)
    • Jetty: Content Length exception when body size is greater than 4096 bytes (KTOR-4622)
    • Darwin: configureRequest doesn't actually configure a NSMutableURLRequest when HTTP request is made (KTOR-4719)
    • OAuth2: Allow sending extra parameters for authorization and access token requests (KTOR-2128)
    • Java engine: Allow configuring HTTP version (KTOR-4609)
    • ContentEncoding: body<ByteArray>() receives truncated array (KTOR-4653)
    • Support configuring Netty codec limits via application config (KTOR-4636)
    • [OkHttp] StreamRequestBody should override isOneShot or allow multiple reads of request body (KTOR-4637)
    • OverridingClassLoader fails to delegate to parent for resources (KTOR-4004)
    • OkHttp and iOS: request with only-if-cache directive in Cache-Control header fails with 504 when match is stale (KTOR-4127)
    • Allow Pebble to use Accepted Language header for built-in i18n support (KTOR-4593)
    • Test engine can't handle concurrent requests (KTOR-4572)
    • Parameters of cloned UrlBuilder affect parameters of an original builder (KTOR-4573)
    • Reified type causes ApplicationCall.receive() throw UnsupportedOperationException (KTOR-3715)
    • ApplicationConfig lacks the ability to export a part of the config to a third-party library (KTOR-4416)
    • Path parameter doesn't get encoded in type safe requests (KTOR-3953)
    • Update Kotlin to 1.7.0 (KTOR-4450)
    • Bump jteVersion from 2.0.3 to 2.1.2 (KTOR-4648)
    Source code(tar.gz)
    Source code(zip)
  • 2.0.3(Jun 28, 2022)

    Published 28 June 2022

    • Development mode class loader leads to ClassCastException within a CouroutineScope (KTOR-4164)
    • Validate that the body of an incoming request is received completely (KTOR-4379)
    • UrlBuilder escapes fragment parameters (KTOR-4412)
    • CallLogging: JVM crashes when jansi checks whether a file descriptor refers to a terminal (KTOR-3476)
    • WebSocket client closes connection due to an HTTP request timeout (KTOR-4419)
    • [JS client] Cannot change redirect policy by followRedirects=false (KTOR-326)
    • CIO engine doesn't apply a request timeout from the HttpTimeout plugin (KTOR-4473)
    • CIO: Websockets request doesn't include query parameters (KTOR-4390)
    • Ignore SIGPIPE for server sockets (KTOR-4474)
    • Direct byte buffers are increased in size when server slowly processes request (KTOR-4397)
    • UDP responses are received with a huge delay on JVM Windows (due to reverse DNS lookup internally) (KTOR-4423)
    • "No instance for key AttributeKey: ApplicationPluginRegistry" when exception is thrown during the Call phase (KTOR-4448)
    • Non-decipherable exception "No result transformation found" (KTOR-4287)
    • Unable to set the Content-Type header in a request (KTOR-620)
    • Update kotlinx.coroutines to 1.6.2 (KTOR-4451)
    • Support the HttpTimeout capability in the DelegatingTestClientEngine (KTOR-4436)
    • Limit the number of parallel running requests in Netty (KTOR-4575)
    • Resources plugin fails to process parameters of type UShort (KTOR-4424)
    • Resources plugin doesn't respect default values for Enum (KTOR-4411)
    • Invalid request line produced by CIO engine for URL with parameters and without path (KTOR-4347)
    • call.receiveText() tries to parse body as JSON when the ContentNegotiation plugin is installed (KTOR-4426)
    • Ignore ByteReadChannel as receive type in ContentNegotiation (KTOR-4511)
    • Setting body to TextContent leads to NPE when the ContentNegotiation plugin is installed (KTOR-4383)
    • submitFormWithBinaryData call leads to NPE when the ContentNegotiation plugin is installed (KTOR-4269)
    • ResponseConverter NPE when returning ByteArray with the ContentNegotiation plugin (KTOR-4399)
    Source code(tar.gz)
    Source code(zip)
  • 2.0.2(May 30, 2022)

    Published 27 May 2022

    • [iOS] Prevent HttpClient from persisting cookies across requests (KTOR-3748)
    • Web feedback from "Creating HTTP APIs", https://ktor.io/docs/creating-http-apis.html (KTOR-4380)
    • When returning a String, content negotiation is ignored (KTOR-662)
    • HttpResponse.bodyAsChannel should not be converted by ContentNegotiation (KTOR-4341)
    • Strings are not decoded when received as application/json (KTOR-385)
    • Document how to enable/disable HTTP/2 for different client engines (KTOR-4340)
    • Revert Dokka to 1.6.10 due to Publication Freeze (KTOR-4290)
    • Document a new memory model in KMM tutorial (KTOR-4354)
    • Make client docs less JVM-centric (KTOR-4351)
    • Darwin engine: Client connection is closed after each request (KTOR-4145)
    • Ios: NullPointerException when query parameters contain cyrillic symbols in values (KTOR-1858)
    • A native application with the Darwin engine doesn't make a request (KTOR-3900)
    • Darwin and Kotlin/JS: "List has more than one element" error when header like Content-type is duplicated in a response (KTOR-4105)
    • Invalid response without error (KTOR-369)
    • Invalid HTTP version should fail (KTOR-380)
    • The colon after the host parameter requires a port (KTOR-382)
    • Kotlin/Native: testApplication's client sometimes fails to receive ByteArray response from a route (KTOR-4197)
    • "Application started" is never printed (KTOR-4319)
    • Default request without explicit port sets port 80 for all requests (KTOR-4281)
    • Documentation about how to configure libcurl on Windows (KTOR-3988)
    • API Docs reference RFCs. Better to reference our own documentation (KTOR-3764)
    • UninitializedPropertyAccessException in the handleResponseExceptionWithRequest when request or response are accessed through (KTOR-4230)HttpClientCall
    • The original exception is swallowed by "No request transformation found" exception when request body is serializable object (KTOR-4160)
    • IncorrectDereferenceException when trying to create HttpClient from background thread on iOS (KTOR-4263)
    • JacksonWebsocketContentConverter.deserialize just doesn't work (KTOR-4248)
    • Documentation for migration of Authentication server plugin (KTOR-4253)
    • Add sample for the AuthenticationChecked hook (KTOR-4278)
    • Web feedback from "Docker", https://ktor.io/docs/docker.html (KTOR-4282)
    • Route's path parameters are empty when ApplicationCall.authentication is first accessed in a different ApplicationCall context (KTOR-4250)
    • Routes with tailcard should not count for specific http error codes (KTOR-4280)
    • Documentation for appending query parameters for URL in the DefaultRequest (KTOR-4252)
    • Routing returns 405 even for not completely matched paths (KTOR-4267)
    • Resources: builder methods return routes with PathSegmentConstantRouteSelector instead of HttpMethodRouteSelector (KTOR-4239)
    • Update Netty to 4.1.77.Final (KTOR-4339)
    • External services should use config from environment (KTOR-4373)
    • Update Jackson to 2.13.3 (KTOR-4394)
    Source code(tar.gz)
    Source code(zip)
  • 2.0.1(Apr 28, 2022)

    2.0.1

    Published 28 April 2022

    • Fix URL representation (KTOR-4241)
    • embeddedServer for CIO and Netty inconsistency (KTOR-755)
    • Update Coroutines to 1.6.1 (KTOR-4240)
    • Locations: Support trailing / (KTOR-836)
    • Resources: Make Route.handle public (KTOR-4200)
    • Fix CURL flaky initialization (KTOR-4223)
    • Optimize Slow Native Tests (KTOR-4224)
    • Print Native Stacktrace on Timeout (KTOR-4198)
    • """IllegalStateException: Operation is already in progress"" when the readByte is called the second time after a timeout" (KTOR-4218)
    • Update Kotlin to 1.6.21 (KTOR-4221)
    • Update code for editing an article in the 'Interactive website' tutorial (KTOR-4227)
    • DefaultRequest: HTTPS protocol isn't set when using Ktor 2.0.0 (KTOR-4142)
    • DefaultRequest: host and port aren't used for a request (KTOR-4154)
    • A table with test methods should span the entire width of the dialog (KTOR-4064)
    • StatusPages plugin does not handle most specific exception in Ktor 2.0.0 (KTOR-4187)
    • Behaviour of ApplicationEngine start method not documented properly (KTOR-2271)
    • CORS plugin should be route scoped (KTOR-4157)
    • Raw Web Socket Connection Suspending Forever (KTOR-4166)
    • StatusPages: SerializationException isn't handled when CallID plugin is installed after StatusPages plugin (KTOR-4155)
    • HttpClient.wss defaults to port 80 instead of 443 (KTOR-4175)
    • Missing subject parameter in StatusPages status config method (KTOR-4191)
    • ConditionalHeaders cause the Last-Modified header appears twice in a response (2.0.0) (KTOR-4163)
    • DefaultHeaders: The Server header appears twice in a response (2.0.0) (KTOR-4152)
    • Testing: Resolving a substitution to a value in default config fails when custom HOCON config is used (KTOR-4130)
    • Combination of HttpCache and Logging plugins cause receiving incomplete response body for chunked replies (KTOR-3916)
    Source code(tar.gz)
    Source code(zip)
  • 2.0.0(Apr 11, 2022)

    • Fix dokka version catalog generation
    • Update API docs for all plugins
    • Cleanup after migrating to version catalog
    • Update Kotlin to 1.6.20
    • Keep original content type when no registrations match
    • Fix body logging mixed with different request
    • Fix CIO client timeout
    • Migrate to version catalog
    • Support WebSockets in Darwin engine
    • Fix freeze with WriteChannelContent in test client
    • Use request timeout instead of socket timeout in Java client
    • Fix selector manager
    • Fix InvalidPathException in ApplicationEngineEnvironmentReloading.kt
    • Add native html builder support
    • Allow overriding dispatcher in MockEngine
    • Fix freeze in response observer
    • Fix allocation issues
    • CIO Native WebSockets
    • Change HttpClientCall fields visibility
    • Adjust CORS configuration names
    • Fix Deflater leak
    • Move ApplicationCallPlugin to companion object
    • Fix OAuth scopes encoded to %2B
    • Add more KtorDsl annotations
    • CORS allowHeadersPrefixed should ignore case
    • Remove mutex from call logging
    • Reuse most useful hooks
    • Use secure random for nonce generation
    • SinglePageApplication plugin returns 404 for non-existent paths
    • The "charset=UTF-8" part is added for the Content-Type header
    • Add jte template support
    • Fix contextual serializer with kotlinx
    • Add isNotEmpty() and size methods to PlaceholderList
    • Add call to CachingHeadersConfig.options callback
    • Fix MDC context in client response body logging
    • Rewrite Netty Engine
    • Add links to a migration guide
    • Bump actions/checkout from 2 to 3
    • Break infinite refresh token cycle on 401
    • Use conditional headers from response
    • Ktor client content encoding: do not decode empty body
    • Clarify the selector problem in the exception message
    • Introduce BaseApplicationPlugin
    • Introduce file cache; Prevent blocking when receiving conte…
    • handleResponseException should have access to request to provide valuable information in exceptions
    • Rename the 'io.ktor.resources.serialisation' package to '...serialization' for consistency
    • Bump micrometer-core from 1.7.5 to 1.8.3
    • Update slf4j to 1.7.36
    • Update node_fetch_version to 2.6.7, remove kotlin-js-store/yarn.lock from .gitignore
    • Replace specify pattern for JSON.stringify
    • Drop obsolete dependency; cleanup configuration
    • Clean up of the plugins API
    • Handle any generic failures in CIO and debugger flag
    • Migrate rest of the plugins
    • Clarify exception message
    • multipart/form-data requests: No way of streaming data asynchronously
    • Convert (X)ForwardedHeader to new API and rename plugin
    • Drop ApplicationReceiveRequest
    • Fixes invalidating cookies cache on every request
    • Support query and fragment in default request
    • Drop before and after from new plugins API
    • Add HTTPS Connector to TestApplicationEngine
    • Remove explicit JVM 8 target
    • Add auth from single provider if no WWW-Auth header is present
    • Support streaming of body in curl
    • Use global DslMarker
    • Fix SPA javadoc
    • Rewrite CallLogging, PartialContent, HttpsRedirect, WebJars, Metrics, CallId, ConditionalHeaders, Compression, Auto Head, DoubleReceive, Auth, FreeMarker, CORS, HSTS, ContentNegotiation, Sessions, XHttpMethodOverride, DefaultHeaders, Thymeleaf to new plugins API
    • Fix SinglePageApplicationTest
    • Remove single page plugin from ktor-server
    • Fix SinglePageApplicationTest after rebase
    • Support routing scoped plugins in hooks
    • Add Single Page Plugin
    • Bump metrics-core from 4.2.6 to 4.2.8
    • Bump metrics-jvm from 4.2.4 to 4.2.8
    • Drop ExperimentalTime
    • Status pages Fixes
    • Use UTF-8 as default charset for text and forms
    • Delete jvmAndNix in ktor-server
    • Update slf4j to 1.7.35
    • Fix NoClassDefFoundError on android in debugger detector
    • Disable response validation by default
    • Migrate server plugins to multiplatform
    • Flush unread bytes after readAvailable
    • Remove unnecessary command from Linux CONTRIBUTING.md setup instructions
    • Drop headerSizeHint
    • Update logback to 1.2.10
    • Fix routing is called for handled requests
    • Drop old native memory model
    • Add apiDump for DefaultHeader plugin changes
    • Fix webSocketSession method suspends indefinitely on connection error
    • Add defaults to stop method
    • Change version to snapshot
    • Fix double slash when appending segments
    • Support java modules
    • Retry-after header value should be in seconds
    • Fixed appendIfNameAbsent and appendIfNameAndValueAbsent
    • Fix receiving streaming body breaks client
    • Fix sockets on Android
    • Use DEFAULT_COMPRESSION for java.util.zip.Deflater
    • Fix binary compatibility with jdk8
    • Fix curl configuration
    • Update Dokka to 1.6.10 and remove ZipException workaround for JS files
    • Returning Thymeleaf fragments from Routes
    • Add protocol support to testApplication
    • Add option to choose value for X-Forwarded-* and Forwarded headers
    Source code(tar.gz)
    Source code(zip)
  • 1.6.8(Mar 15, 2022)

    • Update Gradle to 7.4
    • Update Kotlin to 1.6.10
    • Migrate gradle to version catalog
    • Update logback version to 1.2.11 (KTOR-3935)
    • Update atomicfu to 0.17.1
    • Update netty to 4.1.74.Final
    • Update netty-tcnative to 2.0.45.Final
    • Update jetty to 9.4.45.v20220203
    • Update tomcat to 9.0.59
    • Update apache to 4.1.5
    • Update okhttp to 4.9.3
    • Update gson to 2.9.0
    • Update jackson 2.13.1
    • Update slf4j to 1.7.36
    • Update node-fetch to 2.6.7
    • Update js ws package to 8.5.0
    • Revert wrong check to prevent anyHost with allowCredentials (KTOR-2872)
    Source code(tar.gz)
    Source code(zip)
  • 2.0.0-beta-1(Dec 23, 2021)

    • EAP Naming: main-number conflicts with dependencies (KTOR-2724)
    • ktor.io/learn typo (KTOR-3563)
    • Multiple messages around upgrading to new version (KTOR-3494)
    • Deploy Ktor application to docker topic contains hard coded project name (KTOR-2852)
    • Improvements for Docker sample in documentation (KTOR-3294)
    • "io.ktor.serializaion.gson" - package naming in 2.0 (KTOR-3527)
    • Drop client.get Operator Because of Ambiguity with get(URL) (KTOR-3487)
    • Option "Add imports for Ktor modules automatically" doesn't work (KTOR-3226)
    • Migrations are unavailable (KTOR-3570)
    • AttributeKey instance is identified by its identity instead of its name (KTOR-3538)
    • Fix Log Size for Java 11 Windows Build (KTOR-3535)
    • ByteChannelSequential freezes after closing due to race condition (KTOR-2776)
    • Apple Arm: 'Resolving NPM dependencies using yarn' returns 139 (KTOR-3561)
    • Change log level from INFO to ERROR for tests only (KTOR-3466)
    • Responding without contentLength freezes on CIO native (KTOR-3492)
    • webSocketSession freeze every time (KTOR-3460)
    • Exceptions are Swallowed in HttpClient.wss block (KTOR-3461)
    • Support receiving headers before sending body in CIO client engine (KTOR-3491)
    • [netty] Headers are only flushed after first byte is written (KTOR-3364)
    • Fix testErrorHandling with JS (KTOR-3510)
    • Build and test on Apple Silicon Arm (KTOR-3248)
    • Fix old metadata publication (KTOR-3469)
    • Remove checking body transformation from ContentNegotation (KTOR-3272)
    • Ktor-Utils references a Java API not supported by Android (KTOR-3426)
    • With test application should load environment from the application.conf (KTOR-2794)
    • Inconsistent TestApplicationRequest and Client HttpRequestBuilder API's (KTOR-1246)
    • Server features instead of client in the client install block (KTOR-3412)
    • Using proguard and CallLogging feature causes JVM crashes (KTOR-3345)
    • ContentNegotiation is missing in the plugins completion window (KTOR-3411)
    • Code Snippets use Groovy in build files as opposed to default Kotlin option for Wizard (KTOR-2190)
    • IJ locked after attempt to create new run config in a dialog (KTOR-3385)
    • ContentNegotiation plugins don't accept null-responses from ContentConverts (KTOR-3346)
    • High CPU consumption/Lock after project opening in org.jetbrains.kotlin.storage.getValue ; org.jetbrains.kotlin.idea.caches.resolve.IdeaResolverForProject (KTOR-3337)
    • Update Ktor Plugin Description (KTOR-3388)
    • Project Generated with eap-256 has Errors in Imports (KTOR-3397)
    • Update non-generic samples to 2.0 (KTOR-3285)
    • Simplify plugin descriptions in wizard, remove empty options (KTOR-3386)
    • Bearer Authentication: Queue requests until refresh of tokens is completed (KTOR-3325)
    • Article about storing sensitive data and accessing it in application.conf (KTOR-3340)
    • Android: Failed resolution of: Ljava/nio/file/Paths using API 25 and lower (KTOR-3269)
    • IDE action to migrate to 2.0.0 (KTOR-3225)
    • Passing port 0 to start server on random port doesn't publish correct port to log (KTOR-3288)
    • XForwardedHeaderSupport is installed late in the pipeline (KTOR-731)
    • Error in 2.0 doc/sample for HttpClient retry (KTOR-3303)
    • Cyclic dependency issue in latest 2.0 (main branch) (KTOR-3240)
    • An error occurred when running a sample with the configured XML serializer (KTOR-3286)
    • respondOutputStream behind nginx fails (KTOR-346)
    • ProxyConfig.type checking for DIRECT instead of SOCKS (KTOR-1733)
    • Freeze the screen when I create routes (KTOR-3004)
    • httpMethod is not affected by X-Http-Method-Override (in opposite to docs) (KTOR-404)
    • Client: DefaultRequest apply defaults before request builder (KTOR-2877)
    • KDoc: HttpRequestBuilder.header actually appends header value, does not set it (KTOR-2492)
    • TLS relared tests are failing on CI (KTOR-3224)
    • Jackson: receiveOrNull crashes with an exception when sending empty content (KTOR-727)
    • Content Negotiation: Gson: Should be able to return 400 for badly formatted request. (KTOR-373)
    • Jackson-backed ApplicationCall.receive does not throw ContentTransformationException (KTOR-614)
    • Remove Obsolete Check Cast from SuspendFunctionGun (KTOR-3178)
    • Support 2.0.0 in IDE (KTOR-3196)
    • Client HttpCache feature is not documented (KTOR-1279)
    • Update server dependencies and imports in docs for 2.0.0 (KTOR-3150)
    • Prioritize text found in feature titles over descriptions (KTOR-2488)
    • SerializationException when serializing request body object of generic class type (KTOR-1019)
    • The 'Create test for Ktor module' intention actions changes files from other modules for a multimodule Gradle project (KTOR-3062)
    • Wizard Plugin listing strange link (KTOR-2882)
    • Nothing happens when no test routes is selected when generating Ktor test for module (KTOR-3095)
    • The 'Create test for Ktor module' intention action doesn't create any tests if routes are defined inside the extension function (KTOR-3079)
    • Allow using the client itself inside Auth plugin in the refreshTokens lambda. (KTOR-2977)
    • ADE at io.ktor.ide.plugins.add.KtorMarketplacePluginsUpdater.checkForUpdates (KTOR-3076)
    • Ktor Client JS: request to /example requests http://localhost/example (KTOR-453)
    • URLBuilder: Move Default Values to build() function (KTOR-1345)
    • Impossible to modify response headers (KTOR-2822)
    • Missing Locations params result in 404 instead of 400 (KTOR-447)
    • Should return 405 when route exists but not for given method instead of 404 (KTOR-737)
    • Fix 2.0.0 branch compilation (KTOR-2603)
    • Query of pre-signed URL has been altered after decode and re-encode process (KTOR-778)
    • ApplicationCall.locationOrNull raises error (KTOR-1684)
    • Make body nullable for request builder (KTOR-1400)
    • Provide better support for Ktor clients (KTOR-883)
    • Retry on HttpCode or network error (KTOR-572)
    • HttpRequestRetry in KTOR 2.0 should allow for request altering between retries (KTOR-3544)
    • HttpCookies: parse / in the name of a cookie (KTOR-3497)
    • Support for adding values to the MDC later on in the pipeline. (KTOR-536)
    • Pull Request - fix #1970 - update MultiPartFormDataContent to allow contentType override using optional builder (KTOR-1833)
    • Pull Request - KTOR-1264 - Add UUID to DefaultConversionService (KTOR-1815)
    • Pull Request - Intercept pipeline at Setup phase for XForwardedHeaderSupport feature… (KTOR-1844)
    • Pull Request - Add locale to ThymeleafContent (KTOR-1838)
    • Pull Request - KTOR-404 Introduce support for X-Http-Method-Override (KTOR-1825)
    • Objections to changing boundary to internal on MultiPartFormDataContent? (KTOR-325)
    • Prototype anchors in new plugins API (KTOR-3392)
    • Rename the 'Ios' client engine to more generic term to cover all Apple operating systems (KTOR-3394)
    • Update Samples to Ktor 2.0 (KTOR-3218)
    • Implement new Locations feature (KTOR-1706)
    • Feature: Use websockets with serialization (KTOR-423)
    • JS Client doesn't support ServiceWorker (KTOR-3448)
    • Move Server Related Code from ktor-http-cio to ktor-server-cio (KTOR-3462)
    • Client request builder: add shortcuts for authentication headers (KTOR-2876)
    • Add Check if Feature is installed for WebSocket builders (KTOR-3459)
    • Implementation for Create ktor-test module with mocks of engine and clients for writing tests (KTOR-3236)
    • TestEngineApplication - implement HttpClient API (KTOR-2416)
    • Add explicit menu action for migration (KTOR-3400)
    • Add possibility to fully configure metricName in ktor-server-metrics-micrometer (KTOR-3302)
    • Support New Native Memory Model (KTOR-3217)
    • Server for Kotlin Native (KTOR-746)
    • call.request.queryParameters decode plus as space (KTOR-3297)
    • Migrate existing plugins to RoutingScoped (KTOR-3201)
    • Support receiving OAuth code response as form post (KTOR-3342)
    • Add parameter for specifying content-length in ApplicationCall#respondBytes (KTOR-3087)
    • Allow application environment configuration when running via commandLineEnvironment (KTOR-3027)
    • Add locale to ThymeleafContent (KTOR-3313)
    • Add support for ports in withTestApplication (KTOR-725)
    • Expose non-reified request methods (KTOR-2590)
    • XML Support in Ktor (KTOR-489)
    • Start ktor server on random port (KTOR-686)
    • parameterOf() should have a variant that takes in a Map<String, List> (KTOR-399)
    • [Ktor Client] CborFeature (KTOR-3174)
    • Can't set a base url that includes path data (KTOR-730)
    • Ktor: Fold internal stack frames for HTTP server (KTOR-2274)
    • Add method to Client and ServerResponseException (KTOR-3128)
    • Add UUID to DefaultConversionService (KTOR-1264)
    • Implementation for Simple API for writing features (KTOR-2480)
    • Add filtering support in Ktor client response interceptor (KTOR-2992)
    • Define completion priorities for Ktor keywords (KTOR-2773)
    • Adding features action in IDE (KTOR-2893)
    • Implement design about moving features from ktor-server-core (KTOR-1239)
    • Move server code to io.ktor.server.* package (KTOR-2865)
    • ApplicationConfig: how to iterate over keys and values of config (KTOR-2318)
    • Implementation for Events Feature For Client Metrics (KTOR-2472)
    • ContentConverter.convertForSend should receive a KType (KTOR-444)
    • Send 100 Continue response only when getting a request to receive IncomingContent (KTOR-855)
    • Update Documentation and Code for HttpsRedirect Feature (KTOR-1879)
    • Improve documentation for native/Apple client engines (KTOR-3375)
    • Update Documentation and Code for CallId Feature (KTOR-1874)
    • Feature to Plugin changes in Documentation (KTOR-2372)
    Source code(tar.gz)
    Source code(zip)
  • 1.6.7(Dec 8, 2021)

  • 1.6.6(Nov 29, 2021)

    • Some Netty EngineMain properties are not set (KTOR-3464)
    • Session cookie with BASE64 encoding fails to set correct cookie (KTOR-524)
    • corsCheckRequestHeaders false (KTOR-445)
    • DropwizardMetrics does not append baseName to the 'per endpoint'-metrics (KTOR-2527)
    • Cookies that added to request got removed if HttpCookies plugin is installed (KTOR-3105)
    • Development mode isn't taken into account for subroutes (KTOR-3316)
    • URL port should be in 0..65535 (KTOR-3314)
    • Basic auth not sending second request (KTOR-3472)
    • Update Kotlin to 1.6.0 (KTOR-3422)
    Source code(tar.gz)
    Source code(zip)
  • 1.6.5(Nov 2, 2021)

    • Bump kotlin from 1.5.30 to 1.5.31
    • Bump tomcat from 9.0.48 to 9.0.54
    • Bump logback from 1.2.3 to 1.2.6
    • Bump slf4j from 1.7.30 to 1.7.32
    • Bump gson from 2.8.6 to 2.8.9
    • Bump okhttp from 4.6.0 to 4.9.2
    • Bump jackson from 2.12.3 to 2.13.0
    • Bump mockk from 1.10.6 to 1.12.0
    • Add Apple Silicon targets (KTOR-3082)
    • Fix HttpCookies feature overwriting request cookies (KTOR-3105)
    • Change EAP version scheme (KTOR-3319)
    • Update Netty to 4.1.69.Final (KTOR-472)
    • Allow wildcard origins for CORS requests (KTOR-316)
    • Add a host check for illegal symbols (KTOR-384)
    • Add check to prevent anyHost with allowCredentials (KTOR-2872)
    • Bump metrics-core from 4.2.3 to 4.2.4
    • Bump webjars-locator-core from 0.47 to 0.48
    • Bump metrics-jvm from 4.2.3 to 4.2.4
    • Fix ProxyType.SOCKS being mapped to Proxy.Type.DIRECT
    • fix grammar (KTOR-3237)
    • Bump micrometer-core from 1.7.4 to 1.7.5
    • Ignore flaky testTimeoutPriority (KTOR-3243)
    • Fix npe if static file not found (KTOR-2811)
    • Fix flaky timeoutPriorityTest (KTOR-3243)
    • Fill Content-Length for PartialContent (KTOR-308)
    • Change default log-level to INFO (KTOR-806)
    • Use require from the stdlib instead of internal require (KTOR-2626)
    Source code(tar.gz)
    Source code(zip)
  • 1.6.4(Oct 1, 2021)

    1.6.4

    Published 30 September 2021

    • [Auth] [Interceptors] Phase Phase('Challenge') was not registered for this pipeline (KTOR-3156)
    • insertPhaseBefore and insertPhaseAfter lead to different order (KTOR-438)
    • Ktor 1.6.3 crashes on restart due to java.lang.ClassNotFoundException: Didn't find class "java.nio.file.WatchService" on Android 24 (KTOR-3166)
    • GraalVM binary using CIO fails on start "Module function cannot be found" (KTOR-2987)
    • Logging in Shutdown thread looks not informative (KTOR-3175)
    • Installed Closeable features not closed when closing HttpClient (KTOR-3116)
    • Explain method(HttpMethod.Options) in docs for CORS (KTOR-2913)
    • ContentType.parse("text/html qqq") must fail with error (KTOR-3080)
    • Update JSON topics using code snippets from the 'codeSnippets' project (KTOR-2955)
    • Could not find artifact org.jetbrains.kotlinx:kotlinx-html-jvm:pom:0.7.2 (KTOR-2481)
    • Update the 'Modules' topic (KTOR-1861)
    • Native engines tests are not run outside of the ktor-client-tests module (KTOR-3069)
    • MultiPartData.readAllParts throws IOException when the epilogue is omitted (KTOR-3173)
    • Update Kotlin and Coroutines Versions (KTOR-3103)
    Source code(tar.gz)
    Source code(zip)
  • 1.6.3(Aug 26, 2021)

    • Auth Feature: token refresh works only on main thread in Kotlin/Native (KTOR-3055)
    • FUS report mixes up feature id and feature version (KTOR-3067)
    • SessionTrackerById - doesn't remove invalid session id (KTOR-2584)
    • Bearer Token is Not Initialized after Clean (KTOR-3008)
    • ktor does not support semicolon query parameter in Netty Engine (KTOR-2991)
    • HOCON config not resolved in ServletApplicationEngine (KTOR-3020)
    • Deploy WAR on Tomcat (KTOR-2867)
    • The wizard missing the Pebble plugin (KTOR-2922)
    • Wizard: Creating a project without sample code creates Application.configureRouting without routing (KTOR-2581)
    • The 'Create Run Configuration automatically' option name is cropped (KTOR-2898)
    • InvalidMutabilityException when using withContext and SavedHttpCall (KTOR-2033)
    • Reuse Package Search to add dependencies for Ktor Features in Plugin (KTOR-2433)
    • Server: TLSConfigBuilder.addKeyStore: store.getCertificateChain could return null(KTOR-3047)
    Source code(tar.gz)
    Source code(zip)
  • 1.6.2(Jul 29, 2021)

    • Fixed Ktor plugin raises StackOverflowError when opening some files (KTOR-2950)
    • Added parseUrlEncodedParameters Documentation (KTOR-2843)
    • Fixed CIO WebSockets client incorrectly sends Sec-WebSocket-Extensions header even if empty regression (KTOR-2388)
    • Updated serialization version to 1.2.2 (KTOR-2968)
    • Made code example complete in OAuth documentation(KTOR-1415)
    • Added quick action on a Application.module(...) to generate tests for a given module with all the endpoints in plugin (KTOR-2411)
    • Fixed kotlin.native.concurrent.InvalidMutabilityException: mutation attempt of frozen @72c18 (KTOR-2883)
    • Fixed 404 errors in ktor docs (KTOR-2915)
    • Added prometeus version to Ktor docs (KTOR-2015)
    • Fixed incorrect Structured Markup (LD+JSON) on Ktor docs (KTOR-2943)
    • Fixed confusing/incorrect JWT auth documentation (KTOR-979)
    • Fixed embedded Netty Server with watch paths is crashing in API level 22 when calling stopping server (KTOR-1613)
    • Fixed NoSuchMethodError: No virtual method getParameterCount on Android API 25 and lower regression (KTOR-2924)
    • Fixed X-Forwarded-Port Parse Exception when it contains comma separated list of ports regression (KTOR-2918)
    • Made CookieConfiguration default to secure configuration and require user opt-out long-standing (KTOR-628)
    • Updated docs section about testing with cookies (KTOR-273)
    • Fixed "ApplicationEngineEnvironment was not started" when accessing application before server is started (KTOR-1854)
    • Updated HTTP/2 documentation (KTOR-267)
    • Fixed NPE in ApacheRequestProducer when "http://" is requested (KTOR-1405)
    • Updated vulnerable versions from sonatype report (KTOR-2875)
    • Fixed ByteReadChannel.readUTF8Line() indefinitely returns empty lines when \r is not followed by \n (KTOR-2868)
    • Source code(tar.gz)
      Source code(zip)
    • 1.6.1(Jun 30, 2021)

      • Linked back to site from Docs (KTOR-2843)
      • Fixed unbound public symbol for public io.ktor.network.sockets/SocketTimeoutException when iosArm64 framework (KTOR-2276)
      • Fixed configureBootstrap hook overwritten by Ktor settings (KTOR-356)
      • Fixed crypto is undefined in IE11 (KTOR-409)
      • Added support for X-Forwarded-Port header in XForwardedHeaderSupport plugin (KTOR-2788)
      • Fixed StatusPages doesn't catch FreeMarker exceptions (KTOR-343)
      • Fixed java.nio.charset.IllegalCharsetNameException: %s (KTOR-2645)
      • Added application startup and hot-reloading time log (KTOR-2816)
      • Fixed postpone (and don't cache) name resolution in cio client (KTOR-2513)
      • Improved diagnostics for exceptions inherited from IOException (KTOR-2691)
      • Fixed refresh token gets stuck (KTOR-2797)
      • Fixed developmentMode is on by default in tests (KTOR-2727)
      • Fixed unable to run new Ktor project (KTOR-2586)
      • Fixed unhandled get freezes with CIO server (KTOR-333)
      • Fixed double host header (KTOR-379)
      • Fixed use kotlin.reflect.jvm.javaType instead of the type token pattern in io.ktor.util.reflect.typeInfo (KTOR-2709)
      • Fixed "JWK Public Key of type ""EC""" (KTOR-2387)
      • Fixed lots of Run Configurations Created for Ktor Project with the Similar Names (KTOR-2803)
      • Fixed ApplicationEngineEnvironmentBuilder.module { … } is executed twice on Exception (KTOR-2734)
      • Researched shared indexes for Ktor (KTOR-2774)
      • Fixed selecting custom package name in Ktor wizard still results in example.com import in ApplicationTest.kt (KTOR-2707)
      • Fixed generated project with specific security and session features selected fails to compile / run (KTOR-2636)
      • Fixed Wizard: Misleading comment in Static Feature (KTOR-2560)
      • Fixed "Update ktor 1.5.0 docs. Deprecated ""challenge"" function for form auth in docs." (KTOR-1974)
      • Fixed Auth Feature Code Snippet: form authentication the doesn't work (KTOR-821)
      • Fixed the '-ea' flag works differently when running a server using Application.module and embeddedServer (KTOR-1758)
      • Fixed enabled-by-default development mode breaks reflection by overriding classloader (KTOR-2306)
      • Reviewed documentation for the onUpload/onDownload client callbacks (KTOR-2710)
      • Fixed Ktor fails to deliver response with error: failed with exception: kotlinx.coroutines.JobCancellationException: Parent job is Completed; (KTOR-2711)
      • Replaced kotlin-test dependency with junit in ktor-server-test-host (KTOR-2555)
      Source code(tar.gz)
      Source code(zip)
    • 1.6.0(May 28, 2021)

      • Ktor fails to deliver response with error: failed with exception: kotlinx.coroutines.JobCancellationException: Parent job is Completed; (KTOR-2711)
      • Wrong Tabs Name in Code Blocks (KTOR-2726)
      • Apache HTTP Client does not send Content-Length header if body is empty content (KTOR-556)
      • Review Auth providers (KTOR-2637)
      • When the main thread executes runBlocking, using the iOS engine will cause a deadlock (KTOR-2683)
      • Deprecate TestApplicationCall.requestHandled (KTOR-2712)
      • Update Dokka: Dokka tasks fails with old dokka version and Gradle 7 (KTOR-2693)
      • Duplicate server Features Section on the Documentation Website (KTOR-2702)
      • Duplicate entry "Features" in Server docs (KTOR-1546)
      • Upgrading from 1.4.3 to 1.5.2 introduced a routing precedence (KTOR-2278)
      • Sporadic OkHttp errors after upgrading to ktor 1.3.1 (KTOR-449)
      • Netty: server freezes after start error (KTOR-803)
      • aSocket().bind() sometimes throws Already bound SocketException (KTOR-638)
      • UDPSocketTest.testBroadcastSuccessful[jvm] is failing (KTOR-2616)
      • Fix flaky CIOHttpsTest.customDomainsTest[jvm] (KTOR-2065)
      • Occasionally empty response using Netty + Jackson (KTOR-1973)
      • '%3D' inside query of redirect target location will be replaced to '=' (KTOR-2057)
      • CIO: TLSConfigBuilder JVM allow null as password (KTOR-940)
      • route("{...}") stopped matching root (KTOR-1965)
      • call.respond() will not check or apply ContentNegotiation for some types (KTOR-2194)
      • Add support for Velocity Tools (KTOR-2345)
      • Base name of micrometer metrics is not configurable (KTOR-2210)
      • Support for Compression Extensions for WebSocket (RFC 7692) (KTOR-688)
      • Document usage of Bearer token in Http Client (KTOR-2439)
      • How to track leaked buffers in ktor-io? (KTOR-2442)
      • Routing: Add PutTyped and PatchTyped Overload (KTOR-1344)
      • Migrate to Dokka 1.4.0 (KTOR-1032)
      • Client upload/download progress observer/handler/interceptor (KTOR-400)
      • HTTP-client auth with Bearer token (KTOR-331)
      • Expose TrailingSlashRouteSelector (KTOR-2511)
      • Add an option to disable URL Encoding (KTOR-553)
      Source code(tar.gz)
      Source code(zip)
    • 1.5.4(Apr 30, 2021)

    • 1.5.3(Apr 5, 2021)

      Published 2 Apr 2021

      • Upgraded to coroutines 1.4.3 (KTOR-2254)
      • Upgraded kotlinx.serialization to 1.1.0 (KTOR-2238)
      • Fixed I/O readRemaining sometimes looses exception (KTOR-2263)
      • Fixed autoreload with 1.5.x when using embeddedServer NOT in debug mode regression (KTOR-2214)
      • Fixed flaky CIOSustainabilityTest.testBlockingConcurrency[jvm] (KTOR-2265)
      • Resolve 'node-fetch' on libs produced by jsBrowserProductionLibraryDistribution regression (KTOR-2230)
      • Updated doc string for FormPart (KTOR-2173)
      • Fixed java.lang.IllegalStateException: No instance for key AttributeKey: ExpectSuccessAttribyteKey regression (KTOR-2389)
      • Supported overriding Kotlin module configuration using jackson dsl function (KTOR-1692)
      • Fixed CORS can't pass on some none standard orgin on jvm (KTOR-469)
      • Fixed unexpected exception when using Session feature: "Using blocking primitives on this dispatcher is not allowed" regression jvm (KTOR-1452)
      • Fixed NettyApplicationEngine providing a configureBootstrap in the configuration throws IllegalStateException: group set already (KTOR-2078)
      • Fixed wrong indentation in Serving Static Content guide (KTOR-2017)
      • Fixed InsufficientSpaceException trying to build ByteReadPacket jvm (KTOR-960)
      • Fixed flaky ProxyTest.testHttpProxy[CIO][jvm] (KTOR-2082)
      • Fixed invalid assertion for existence of the key in the key store (KTOR-2311)
      • Fixed incorrect grammar in exception messages (KTOR-2284)
      • Fixed flaky JavaEngineTests.testThreadLeak[jvm] (KTOR-2098)
      • Fixed flaky JettyStressTest.highLoadStressTest (KTOR-2080)
      • Fixed flaky ExceptionsJvmTest.testConnectionClosedDuringRequest[jvm] (KTOR-2063)
      Source code(tar.gz)
      Source code(zip)
    • 1.5.2(Feb 26, 2021)

      1.5.2

      Published 25 Feb 2021

      • Fixed Dokka building for master (KTOR-2206)
      • Fixed native build on linux machine (KTOR-2200)
      • Fixed docker doc is incorrect / does not work (KTOR-2179)
      • Fixed crash with Firebase Performance in iOS (KTOR-642)
      • Fixed Ktor Client CIO engine Jvm ignores Cipher suites with key strength more than 128 bits. (KTOR-1914)
      • Fixed mandatory Path Segment parameter can be empty, if no explicit route with trailing / is defined (KTOR-2054)
      • Fixed flaky ClientSocketTest.testSelfConnect[jvm] (KTOR-2060)
      • Switch JS Fetch API to Standard Library (org.w3c.fetch.*) (KTOR-1460)
      • Fixed CIO server always start on "0.0.0.0" - does not respect "connector" configuration (KTOR-334)
      • Fixed server/netty: IllegalReferenceCountException (KTOR-1801)
      • Fixed digest authentication: cannot successfully pass authentication using curl or web browser (KTOR-1466)
      • Fixed HTTP Client exception is masked by JobCancellationException with Ktor 1.5.0 (KTOR-1967)
      • Fixed changing requestTimeoutMillis in config of HttpTimeout feature doesn't change the CIO's timeout (KTOR-2000)
      • Fixed test a POST with MultiPart using TestApplicationEngine does not success or fail (KTOR-345)
      • Fixed default Headers feature adds duplicated Server header (KTOR-1976)
      • Fixed custom response validation is not running when default is disabled (KTOR-2007)
      • Fixed session cookie with very long max age duration (KTOR-692)
      Source code(tar.gz)
      Source code(zip)
    • 1.5.1(Jan 28, 2021)

      Published 27 Jan 2021

      • Circular reference for SocketException and StackOverflowError when using SLF4J logger (KTOR-1080)
      • start.ktor.io - Incorrect import for websockets for ktor 1.2.4 (KTOR-274)
      • Unable to catch socket exceptions (KTOR-1166)
      • Support explicit WebSocket session close (KTOR-340)
      • ktor-client-apache: thread stuck in ByteBufferChannel.readRemainingSuspend (KTOR-1463)
      • Logging tests fails due to floating log entries (KTOR-1870)
      • Adding existing dropwizard metrics registry to Ktor (KTOR-1798)
      • Exception kotlinx.serialization.SerializationException: Class 'ArrayList' is not registered for polymorphic serialization in the scope of 'Collection' in 1.5.0 (KTOR-1795)
      • Prevent double quotes on header params (KTOR-1797)
      • Post request shows empty body after upgrading v1.3.2 (KTOR-426)
      • CIO native selector doesn't select new descriptors (KTOR-1856)
      • Client logging docs don't mention all required dependencies (KTOR-280)
      • Out of date self-signed-certificate documentation (KTOR-272)
      • ClosedReceiveChannelException when making request with CIO engine using a proxy to https (KTOR-1458)
      • Incorrect encoding function used for URL path by URLBuilder (KTOR-1543)
      • A single slash gets ignored for defining a route, but 1.5 requires them due to KTOR-372 (KTOR-1615)
      • Wrong shadow plugin version in Fat JAR docs (KTOR-1359)
      • ktor server documentation is returning 404 (KTOR-1602)
      • CORS doesn't reject bad headers (KTOR-1662)
      • OkHTTP client engine tries to close the connection twice during the closing handshake (KTOR-1374)
      • Dispatcher is closing earlier than client (KTOR-1661)
      • Server losing channel exceptions at receive (KTOR-1590)
      • Request parameters should have name (KTOR-378)
      • Status-code must be 3-digit (KTOR-370)
      • Connect request sends wrong status line (KTOR-1612)
      • Response channel is always cancelled with Logging feature (KTOR-1598)
      • Java client logging tests are fluky (KTOR-1599)
      • HttpTimeoutTest.testConnect are flaky (KTOR-1583)
      • Jetty: requests to resources, that doesn't respond with HTTP/2, lead to unexpected behaviour (KTOR-874)
      • "Unfinished workers detected" using client on native (KTOR-1220)
      • HttpTimeout.testSocketTimeoutWriteFail is flaky (KTOR-1584)
      • Reserved characters in path is not encoded (KTOR-570)
      • testTimeoutCancelsWhenParentScopeCancels is flaky (KTOR-1585)
      • Java client freeze (KTOR-1567)
      • CallLoggingTest is flaky (KTOR-1582)
      • Missing dependency information the Authentication and Authorization topic (KTOR-1575)
      • "Using a Self-Signed Certificate" docs provide wrong dependency for 1.3.x (KTOR-21)
      • "Testing Http Client" docs page contains artifact name with -native suffix (KTOR-1006)
      • Custom JSON mapping with Jackson (KTOR-603)
      • Serialization for client section does not explain how to use it (KTOR-999)
      • Add information about required artifacts to the WebSockets topic (KTOR-1532)
      • Missing dependency information the Client Auth topic (KTOR-1533)
      • New documentation lacks artifacts information for Gradle and Maven (KTOR-1167)
      • ResponseException is no longer serializable starting from 1.4.0 (breaking change) (KTOR-1552)
      • Upgrade kotlin to 1.4.21 (KTOR-1637)
      Source code(tar.gz)
      Source code(zip)
    • 1.5.0(Dec 22, 2020)

      Published 22 Dec 2020

      • Fixed crash when sending large responses in 1.4.2 (KTOR-1369)
      • Introduced URLBuilder function to append paths (KTOR-403)
      • Allowed OkHttpConfig to configure WebSocket.Factory (KTOR-951)
      • Get client certificate information from request (KTOR-424)
      • Fixed quoting Content-Disposition additional parameters (KTOR-455)
      • Support Java HTTP Client (KTOR-348)
      • Serializing collections of different element types (KTOR-1163)
      • Introduced Netty tcpKeepAlive option (KTOR-368)
      • Implemented development mode for Ktor (KTOR-1184)
      • Implemented proper unhandled exception handling strategy (KTOR-835)
      • Added OAuth feature config to avoid Dropbox issue (KTOR-715)
      • Fixed trailing slashes handling in routing (KTOR-372)
      • Added CIO client proxy tunneling support (KTOR-1458)
      • Supported Sealed Classes inside Session-Objects (KTOR-826)
      • Fixed code autoreload (KTOR-664)
      • Added response text to the message of ResponseException and derived exceptions (KTOR-844)
      • Added ability to send cookies with HttpRequestBuilder (KTOR-926)
      • Added warning to HTTP/2 push API (KTOR-1329)
      • Fixed parsing Authorization header diagnostics (KTOR-1406)
      • Fixed CORS character encoding issue (KTOR-1370)
      • Added CORS anyHeader in feature configuration (KTOR-977, KTOR-1263)
      • Added curl engine option sslVerify (KTOR-1093)
      • Fixed client response validation in some cases (KTOR-1412)
      • Introduced support for pre-compresed files (KTOR-1447)
      • Fixed Apache client engine sometimes hits an unrecoverable socket timeout when using ChannelWriterContent (KTOR-1149)
      • Fixed typo val socketTimeout in CIOEngineConfig cause it's a property in the config (KTOR-1240)
      • Added excludeSuffix to HttpsRedirect feature (KTOR-1197)
      • Fixed CIO client connectRetryAttempts = 0 handling (KTOR-1125)
      • Added option to use specific alias from keystore in CIO TLSConfigBuilder JVM (KTOR-941)

      1.4.3

      Published 1 Dec 2020

      • Client: URL encode / escaping is wrong (KTOR-341)
      • HTTP/2 push fails with netty engine (KTOR-800)
      • Request headers exceeding expected threshold are not handled correctly (KTOR-905)
      • iOS client fails with CoroutinesInternalError when Logging is used (KTOR-924)
      • Experimental API and compatibility guarantees (KTOR-1035)
      • CIO: client engine exceptions are both logged and thrown (KTOR-1127)
      • Timeout feature: android engine throws Java's SocketTimeoutException instead of ConnectTimeoutException (KTOR-1229)
      • Input.readTextExactBytes(n) on empty input different behavior per platform (KTOR-1235)
      • HttpRedirect feature alters Location header value (KTOR-1236)
      • Wrong pool is used to release IOBuffer after ByteChannelSequential.copyTo from static initialized instance. (KTOR-1237)
      • CIO Engine's HttpClient may fail when trying to send large size binary data. (KTOR-1247)
      • ByteBufferChannel.readRemaining doesn't read whole channel (KTOR-1268)
      • Cannot receive content via jackson negotiator since 1.4.2 (KTOR-1286)
      • ktor-io: JVM shared function decrease performance starting from 1.4.0 (KTOR-1290)
      • Sessions + SSL (Netty) (KTOR-1292)
      • Netty HTTP/2 HEAD response hangs (KTOR-1298)
      • Using blocking primitives on this dispatcher is not allowed. Consider using async channel instead or use blocking primitives in withContext(Dispatchers.IO) instead. (KTOR-1305)
      • "Wrong HEX escape": gracefully handle invalid URLs (KTOR-1308)
      • Add build parameter to build ktor with JVM IR compiler (KTOR-1336)
      • Update kotlin to 1.4.20 (KTOR-1346)
      • Fix configuration if project without VPN and cache (KTOR-1347)
      • Client: NPE in FormDataContentKt -> Input.copyTo (KTOR-1349)
      • Upgrade Netty to 4.1.54.Final (KTOR-1363)
      • Handle failure in reading request body (KTOR-1367)
      • Remove copyTo usage from ServerPipeline (KTOR-1381)
      Source code(tar.gz)
      Source code(zip)
    • 1.4.3(Dec 1, 2020)

      • Client: URL encode / escaping is wrong (KTOR-341)
      • HTTP/2 push fails with netty engine (KTOR-800)
      • Request headers exceeding expected threshold are not handled correctly (KTOR-905)
      • iOS client fails with CoroutinesInternalError when Logging is used (KTOR-924)
      • Experimental API and compatibility guarantees (KTOR-1035)
      • CIO: client engine exceptions are both logged and thrown (KTOR-1127)
      • Timeout feature: android engine throws Java's SocketTimeoutException instead of ConnectTimeoutException (KTOR-1229)
      • Input.readTextExactBytes(n) on empty input different behavior per platform (KTOR-1235)
      • HttpRedirect feature alters Location header value (KTOR-1236)
      • Wrong pool is used to release IOBuffer after ByteChannelSequential.copyTo from static initialized instance. (KTOR-1237)
      • CIO Engine's HttpClient may fail when trying to send large size binary data. (KTOR-1247)
      • ByteBufferChannel.readRemaining doesn't read whole channel (KTOR-1268)
      • Cannot receive content via jackson negotiator since 1.4.2 (KTOR-1286)
      • ktor-io: JVM shared function decrease performance starting from 1.4.0 (KTOR-1290)
      • Sessions + SSL (Netty) (KTOR-1292)
      • Netty HTTP/2 HEAD response hangs (KTOR-1298)
      • Using blocking primitives on this dispatcher is not allowed. Consider using async channel instead or use blocking primitives in withContext(Dispatchers.IO) instead. (KTOR-1305)
      • "Wrong HEX escape": gracefully handle invalid URLs (KTOR-1308)
      • Add build parameter to build ktor with JVM IR compiler (KTOR-1336)
      • Update kotlin to 1.4.20 (KTOR-1346)
      • Fix configuration if project without VPN and cache (KTOR-1347)
      • Client: NPE in FormDataContentKt -> Input.copyTo (KTOR-1349)
      • Upgrade Netty to 4.1.54.Final (KTOR-1363)
      • Handle failure in reading request body (KTOR-1367)
      • Remove copyTo usage from ServerPipeline (KTOR-1381)
      Source code(tar.gz)
      Source code(zip)
    • 1.4.1(Sep 24, 2020)

      • OkHttp: Can't reuse same HttpRequestBuilder for different network clients (KTOR-949)
      • Empty body in response using macosX64 target (KTOR-479)
      • Native: InvalidMutabilityException creating HttpClient (KTOR-915)
      • MultiPartData.readAllParts() throws java.io.IOException when multipart list is empty (KTOR-767)
      • kotlin.native.concurrent.InvalidMutabilityException: mutation attempt of frozen io(.ktor.client.request.HttpRequestPipeline (KTOR-693)
      • "FreezingException: freezing of InvokeOnCompletion has failed" using native-mt coroutines (KTOR-973)
      • kotlin.native.concurrent.InvalidMutabilityException with 1.3.3-native-mt (KTOR-497)
      • Parser Exception in header with character code 1 not allowed (KTOR-860)
      • Calling HttpStatement#toString more than once throws IllegalArgumentException (KTOR-1005)
      • Wrong session id get stuck at clients (KTOR-1007)
      • Exception after WebSocketSession.close() invocation. (KTOR-847)
      • Error Ktor running on background thread on iOS (KTOR-499)
      • HttpClient can only be used on the main thread for native targets (KTOR-491)
      • Ignore content length when transfer encoding is chunked for CIO server (KTOR-1036)
      • ConcurrentList.increaseCapacity() throws ArrayIndexOutOfBoundsException (KTOR-1034)
      • Ktor 1.3.1 Fails File Upload with MalformedInputException (KTOR-391)
      • Update library versions, fix config after release (KTOR-1027)
      • Fix parsing urls with trailing spaces (KTOR-886)
      • 1.4.0: breaking change by making response nullable in ResponseException (KTOR-916)
      • Netty: Not started servers leak resources (KTOR-939)
      • Ktor websocket client passes configured max frame as timeout millis (KTOR-923)
      • Routing: get matcher has higher priority than param matcher on the same level (KTOR-792)
      • Confusing log message about failed session lookup (KTOR-776)
      • Implement runtime check of using native-mt coroutines (KTOR-956)
      • Http parse security issue (KTOR-841)
      • Bumped versions:
        • kotlinx.coroutines 1.3.9-native-mt-2
        • kotlinx.serialization 1.0.0-RC2
        • kotlin 1.4.10
      Source code(tar.gz)
      Source code(zip)
    • 1.4.0(Aug 19, 2020)

      Published 18 Aug 2020

      • Upgrade to kotlin 1.4.0
      • Add native platform support for CIO client (#2021)
      • Prevent access Tomcat servletRequest after recycling
      • Fix verbose IO exception logging
      • Fix client cookies remove
      • Fix suspend tests for digest provider
      • Add deprecation to BasicAuth feature
      • Add client.get operator for features
      • Add client websocket feature config
      • iOS Certificate Pinning (#1750)
      • Add originHost support in browser
      • Fix client logging issues with POST body
      • Prevent CURL multi-handle double close
      • Add content-type header to default transformers
      • Fix report for multiple failed engines in native
      • Use window.location.origin as default host in URLBuilder
      • Prevent Empty Cookie addition (#2008)
      • Fix executor service termination in okhttp (#1860)
      • Verify sending Content-Type and custom object body via POST (#1897)
      • Fix ByteBufferPool recycle (#2016)
      • Update jetty version
      • Fix CIO exception logged twice
      • Change exception type for long strings in readUtf8Line
      • Fix uri field in digest auth header to include query params (#1992)
      • Fix empty multipart post
      • Move the default test server to CIO
      • Fix webpack warning about ktor-client-core critical dependency
      • Fix missing qop in DigestAuthProvider (Issue #1974)
      • Handle " in different position cases
      • Fix parsing of quoted header parameter value
      • Fix saved call early completion
      • Fix tests with empty json check
      • Fix sending blank ContentType in Apache engine
      • Parse blank content type to Any
      • Fixed serialization of empty body (#1952)
      • JsonFeature: Fixed header behavior and made it more flexible (#1927)
      • Fix max-age header to use '=' instead f ':'. (#1769)
      • Add contextual serialization support
      • Introduce non-suspend api for writing
      • fix memory alignment check (#1742)
      • JetBrains Toolbox icon (#1805)
      • Apache should use existing approach when merging headers (#1919)
      • Fix conditional headers behaviour (Fix #1849).
      • Change IosHttpRequestException parent to improve usability
      • OAuth2: Added option to pass params in URL (#1847)
      • Fix doubling host
      • Enhanced handling of statusCode for AndroidEngine (#1852)
      • Fix deserialization issue in client (Fix #1800).
      • GitHub issue/pr links in IDEA Git log (#1806)
      • Fix log channel is not closed for ByteArrayContent (#1808)
      • Use comma to divide headers (Fix #1765).
      • HTTP Client tracing using Stetho Android library.
      • Fix static content resolution for directories inside Jar (#1777).
      • Improve WebSocket routing API (Fix #1075).
      • Implemented cookies encoding with their own encoding and added test cases for this
      • Fix URI support (#1755)
      • Fix OkHttp WebSocket close reason completion (#1363).
      • Fix package directive; Add unimported cfnetwork constants
      • Fix client.join to wait engine close
      • Verify receive from response in exception
      • Update okhttp version to 4.4.0
      • Cleanup iOS proxy configuration
      • Fix WebSocketTest.testMaxSize
      • Fix UTF8 parsing (#1718).
      Source code(tar.gz)
      Source code(zip)
    • Owner
      ktor.io
      Ktor is an application framework for building microservices, web applications, and more. Brought to you by JetBrains
      ktor.io
      Funstuff - Minimal Kotlin Multiplatform project with SwiftUI, Jetpack Compose, Compose for Wear OS, Compose for Desktop

      PeopleInSpace Minimal Kotlin Multiplatform project with SwiftUI, Jetpack Compose

      Shivam Dhuria 2 Feb 15, 2022
      Minimal UI library for Android inspired by React

      Anvil - reactive views for Android Anvil is a small Java library for creating reactive user interfaces. Originally inspired by React, it suits well as

      null 1.4k Dec 23, 2022
      Android app with minimal UI to run snowflake pluggable transports proxy, based on library IPtProxy

      Simple Kotlin app for testing IPtProxy's snowflake proxy on Android Essentially a button for starting and stopping a Snowflake Proxy with the default

      null 2 Jun 26, 2022
      A minimal notes application in Jetpack Compose with MVVM architecture. Built with components like DataStore, Coroutines, ViewModel, LiveData, Room, Navigation-Compose, Coil, koin etc.

      Paper - A Minimal Notes App A minimal notes application in Jetpack Compose with MVVM architecture. Built with components like DataStore, Coroutines, V

      Akshay Sharma 139 Jan 2, 2023
      An example of a test task for creating a simple currency converter application for the Android platform. The app is developed using Kotlin, MVI, Dagger Hilt, Retrofit, Jetpack Compose.

      Simple Currency Converter Simple Currency Converter Android App by Isaev Semyon An example of a test task for creating a simple currency converter app

      Semyon Isaev 1 Nov 8, 2021
      Kotlin library for creating long running connections using MQTT protocol

      About Courier Courier is a kotlin library for creating long running connections using MQTT protocol. Long running connection is a persistent connectio

      Gojek 92 Dec 23, 2022
      Carousel Recyclerview let's you create carousel layout with the power of recyclerview by creating custom layout manager.

      Carousel Recyclerview Create carousel effect in recyclerview with the CarouselRecyclerview in a simple way. Including in your project Gradle Add below

      Jack and phantom 514 Jan 8, 2023
      A library for creating dynamic skeleton view

      Skeleton Placeholder View Overview A Library designed to draw a Skeleton by "skinning" the view from a provided layout. Skeleton is composed of Bone w

      Ferry Irawan 25 Jul 20, 2021
      Example mod with Mixin to help you to get started with creating a mod with mixins.

      ExampleMixinMod Example mod with Mixin to help you to get started with creating a mod with mixins. For usage of mixins, see here. Also, remember to tu

      null 0 Dec 16, 2021
      An android application for creating a journal for subjects you studied and also you can set timer for break.

      Study Journal An android application for creating a journal for subjects you studied and also you can set timer for break between two consecutive subj

      Prasoon 3 Aug 10, 2022
      Survey-service - Application for creating online surveys and polls

      Survey Service Application for creating online surveys and polls Functionality A

      Anatoly Babushkin 2 Apr 6, 2022
      A declarative, Kotlin-idiomatic API for writing dynamic command line applications.

      A declarative, Kotlin-idiomatic API for writing dynamic command line applications.

      Varabyte 349 Jan 9, 2023
      Kotlin Multiplatform is an SDK for cross-platform mobile development, which enables teams to use the same business logic in both Android and iOS client applications.

      Kotlin Multiplatform is an SDK for cross-platform mobile development, which enables teams to use the same business logic in both Android and iOS client applications.

      Chris Russell 1 Feb 11, 2022
      A Kotlin library providing a simple, high-performance way to use off-heap native memory in JVM applications.

      native_memory_allocator A library which uses sun.misc.Unsafe to allocate off-heap native memory. Motivation The goal of this project is to provide a s

      Target 5 Dec 8, 2022
      Embeddable custom voice assistant for Android applications

      Aimybox voice assistant Open source voice assistant built on top of Aimybox SDK iOS version is available here Key Features Provides ready to use UI co

      Just AI 176 Jan 2, 2023
      🚀Optimizer for mobile applications

      Overview | 概览 Booster is an easy-to-use, lightweight, powerful and extensible quality optimization toolkit designed specially for mobile applications.

      DiDi 4.3k Dec 29, 2022
      A plugin for Termux to use native Android GUI components from CLI applications.

      Termux:GUI This is a plugin for Termux that enables command line programs to use the native android GUI. In the examples directory you can find demo v

      null 342 Dec 23, 2022
      Sample project that shows an approach for designing a multi-module architecture for Jetpack Compose Android applications.

      Compose Multi-Module Architecture Sample Sample project that shows an approach for designing a multi-module architecture for Jetpack Compose Android a

      Pavlo Stavytskyi 77 Jan 3, 2023
      A Template for a Github Actions Pipeline for building and publishing Gradle-JVM Applications

      github-actions-cd-template-jvm A Template for a Github Actions Pipeline for building and publishing Gradle-JVM Applications It build a executable shad

      Raphael Panic 0 Dec 5, 2021