[download] Upgrade Ktor to 2.0

This commit is contained in:
Torsten Grote 2022-04-19 11:08:40 -03:00
parent db1eac1b80
commit d937732ce0
No known key found for this signature in database
GPG Key ID: 3E5F77D92CF891FF
9 changed files with 238 additions and 48 deletions

View File

@ -5,7 +5,7 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.10"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.20"
}
}
allprojects {

View File

@ -22,7 +22,7 @@ kotlin {
// else throw new GradleException("Host OS is not supported in Kotlin/Native.")
ext {
ktor_version = "1.6.8" //"2.0.0-beta-1"
ktor_version = "2.0.0"
}
sourceSets {
@ -102,7 +102,7 @@ android {
targetCompatibility JavaVersion.VERSION_1_8
}
lintOptions {
disable "InvalidPackage" // FIXME remove when Ktor 2.0 has been released
disable "InvalidPackage"
}
}

View File

@ -23,7 +23,7 @@ package org.fdroid.download
import android.annotation.TargetApi
import android.os.Build.VERSION.SDK_INT
import io.ktor.client.features.ResponseException
import io.ktor.client.plugins.ResponseException
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.runBlocking
import mu.KotlinLogging

View File

@ -1,6 +1,6 @@
package org.fdroid.download
import io.ktor.client.features.ResponseException
import io.ktor.client.plugins.ResponseException
import kotlinx.coroutines.runBlocking
import java.io.IOException

View File

@ -1,44 +1,42 @@
package org.fdroid.download
import io.ktor.client.HttpClient
import io.ktor.client.call.receive
import io.ktor.client.call.body
import io.ktor.client.engine.HttpClientEngineFactory
import io.ktor.client.engine.ProxyConfig
import io.ktor.client.features.HttpTimeout
import io.ktor.client.features.ResponseException
import io.ktor.client.features.UserAgent
import io.ktor.client.features.defaultRequest
import io.ktor.client.features.timeout
import io.ktor.client.plugins.HttpTimeout
import io.ktor.client.plugins.ResponseException
import io.ktor.client.plugins.UserAgent
import io.ktor.client.plugins.timeout
import io.ktor.client.request.HttpRequestBuilder
import io.ktor.client.request.basicAuth
import io.ktor.client.request.get
import io.ktor.client.request.head
import io.ktor.client.request.header
import io.ktor.client.request.parameter
import io.ktor.client.request.post
import io.ktor.client.request.prepareGet
import io.ktor.client.request.setBody
import io.ktor.client.request.url
import io.ktor.client.statement.HttpResponse
import io.ktor.client.statement.HttpStatement
import io.ktor.http.HttpHeaders.Authorization
import io.ktor.http.HttpHeaders.ContentType
import io.ktor.http.HttpHeaders.ETag
import io.ktor.http.HttpHeaders.LastModified
import io.ktor.http.HttpHeaders.Range
import io.ktor.http.HttpMessageBuilder
import io.ktor.http.HttpStatusCode.Companion.PartialContent
import io.ktor.http.Url
import io.ktor.http.contentLength
import io.ktor.util.InternalAPI
import io.ktor.util.encodeBase64
import io.ktor.util.toByteArray
import io.ktor.utils.io.ByteChannel
import io.ktor.utils.io.ByteReadChannel
import io.ktor.utils.io.charsets.Charsets
import io.ktor.utils.io.close
import io.ktor.utils.io.core.isEmpty
import io.ktor.utils.io.core.readBytes
import io.ktor.utils.io.core.toByteArray
import io.ktor.utils.io.readRemaining
import io.ktor.utils.io.writeFully
import mu.KotlinLogging
import kotlin.coroutines.cancellation.CancellationException
import kotlin.jvm.JvmOverloads
internal expect fun getHttpClientEngineFactory(): HttpClientEngineFactory<*>
@ -82,12 +80,6 @@ public open class HttpManager @JvmOverloads constructor(
agent = userAgent
}
install(HttpTimeout)
defaultRequest {
// add query string parameters if existing
parameters?.forEach { (key, value) ->
parameter(key, value)
}
}
}
}
@ -98,14 +90,14 @@ public open class HttpManager @JvmOverloads constructor(
* However, due to non-standard ETags on mirrors, change detection is unreliable.
*/
public suspend fun head(request: DownloadRequest, eTag: String? = null): HeadInfo? {
val authString = constructBasicAuthValue(request)
val response: HttpResponse = try {
mirrorChooser.mirrorRequest(request) { mirror, url ->
resetProxyIfNeeded(request.proxy, mirror)
log.debug { "HEAD $url" }
httpClient.head(url) {
addQueryParameters()
// add authorization header from username / password if set
if (authString != null) header(Authorization, authString)
basicAuth(request)
// increase connect timeout if using Tor mirror
if (mirror.isOnion()) timeout { connectTimeoutMillis = 10_000 }
}
@ -133,7 +125,7 @@ public open class HttpManager @JvmOverloads constructor(
if (skipFirstBytes != null && response.status != PartialContent) {
throw NoResumeException()
}
val channel: ByteReadChannel = response.receive()
val channel: ByteReadChannel = response.body()
val limit = 8L * 1024L
while (!channel.isClosedForRead) {
val packet = channel.readRemaining(limit)
@ -150,12 +142,12 @@ public open class HttpManager @JvmOverloads constructor(
url: Url,
skipFirstBytes: Long? = null,
): HttpStatement {
val authString = constructBasicAuthValue(request)
resetProxyIfNeeded(request.proxy, mirror)
log.debug { "GET $url" }
return httpClient.get(url) {
return httpClient.prepareGet(url) {
addQueryParameters()
// add authorization header from username / password if set
if (authString != null) header(Authorization, authString)
basicAuth(request)
// increase connect timeout if using Tor mirror
if (mirror.isOnion()) timeout { connectTimeoutMillis = 20_000 }
// add range header if set
@ -170,8 +162,9 @@ public open class HttpManager @JvmOverloads constructor(
request: DownloadRequest,
skipFirstBytes: Long? = null,
): ByteReadChannel {
// TODO check if closed
return mirrorChooser.mirrorRequest(request) { mirror, url ->
getHttpStatement(request, mirror, url, skipFirstBytes).receive()
getHttpStatement(request, mirror, url, skipFirstBytes).body()
}
}
@ -195,9 +188,11 @@ public open class HttpManager @JvmOverloads constructor(
public suspend fun post(url: String, json: String, proxy: ProxyConfig? = null) {
resetProxyIfNeeded(proxy)
httpClient.post<HttpResponse>(url) {
httpClient.post {
addQueryParameters()
url(url)
header(ContentType, "application/json; utf-8")
body = json
setBody(json)
}
}
@ -216,14 +211,17 @@ public open class HttpManager @JvmOverloads constructor(
}
}
@OptIn(InternalAPI::class) // ktor 2.0 remove
private fun constructBasicAuthValue(request: DownloadRequest): String? {
if (request.username == null || request.password == null) return null
val authString = "${request.username}:${request.password}"
val authBuf = authString.toByteArray(Charsets.UTF_8).encodeBase64()
return "Basic $authBuf"
private fun HttpMessageBuilder.basicAuth(request: DownloadRequest) {
// non-null if hasCredentials is true
if (request.hasCredentials) basicAuth(request.username!!, request.password!!)
}
private fun HttpRequestBuilder.addQueryParameters() {
// add query string parameters if existing
this@HttpManager.parameters?.forEach { (key, value) ->
parameter(key, value)
}
}
}
public class NoResumeException : Exception()

View File

@ -3,10 +3,8 @@ package org.fdroid.download
import io.ktor.http.URLBuilder
import io.ktor.http.URLParserException
import io.ktor.http.Url
import io.ktor.http.pathComponents
import io.ktor.http.appendPathSegments
import mu.KotlinLogging
import kotlin.jvm.JvmOverloads
import kotlin.jvm.JvmStatic
public data class Mirror @JvmOverloads constructor(
private val baseUrl: String,
@ -14,7 +12,7 @@ public data class Mirror @JvmOverloads constructor(
) {
public val url: Url by lazy {
try {
URLBuilder(baseUrl).build()
URLBuilder(baseUrl.trimEnd('/')).build()
// we fall back to a non-existent URL if someone tries to sneak in an invalid mirror URL to crash us
// to make it easier for potential callers
} catch (e: URLParserException) {
@ -29,7 +27,7 @@ public data class Mirror @JvmOverloads constructor(
}
public fun getUrl(path: String): Url {
return URLBuilder(url).pathComponents(path).build()
return URLBuilder(url).appendPathSegments(path).build()
}
public fun isOnion(): Boolean = url.isOnion()

View File

@ -1,6 +1,6 @@
package org.fdroid.download
import io.ktor.client.features.ResponseException
import io.ktor.client.plugins.ResponseException
import io.ktor.http.HttpStatusCode.Companion.Forbidden
import io.ktor.http.Url
import io.ktor.utils.io.errors.IOException

View File

@ -9,9 +9,9 @@ import io.ktor.client.engine.mock.respond
import io.ktor.client.engine.mock.respondError
import io.ktor.client.engine.mock.respondOk
import io.ktor.client.engine.mock.respondRedirect
import io.ktor.client.features.ClientRequestException
import io.ktor.client.features.RedirectResponseException
import io.ktor.client.features.ServerResponseException
import io.ktor.client.plugins.ClientRequestException
import io.ktor.client.plugins.RedirectResponseException
import io.ktor.client.plugins.ServerResponseException
import io.ktor.http.HttpHeaders.Authorization
import io.ktor.http.HttpHeaders.ETag
import io.ktor.http.HttpHeaders.Range

View File

@ -2263,6 +2263,7 @@
</component>
<component group="io.github.detekt.sarif4k" name="sarif4k" version="0.0.1">
<artifact name="sarif4k-0.0.1.jar">
<pgp value="8569c95cadc508b09fe90f3002216ed811210daa"/>
<sha256 value="41ec72cf2521783224581c76aaa7e97d4a50f396a66d642500ff4777b395a376" origin="Generated by Gradle"/>
</artifact>
</component>
@ -2314,6 +2315,11 @@
<sha256 value="f1cfda2aac377524c8e71c631ff4784489ed884d259d26c4b1972c25f0d86e70" origin="Generated by Gradle because artifact wasn't signed"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-client-cio" version="2.0.0">
<artifact name="ktor-client-cio-metadata-2.0.0-all.jar">
<sha256 value="57c77cac92bd58d5e65bee78402ca675a1e284b1ae5edc6d696ce366341a9df2" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-client-cio" version="2.0.0-beta-1">
<artifact name="ktor-client-cio-metadata-2.0.0-beta-1-all.jar">
<sha256 value="08e95f2424ba28ca226d6cacd90f6056de2d621b32006752c083ed09aa3a5da0" origin="Generated by Gradle because artifact wasn't signed"/>
@ -2345,6 +2351,14 @@
<sha256 value="8cd148b193904f63965576c5cc6e2a015de8acc1442a72c616baa1de9a9a8829" origin="Generated by Gradle because artifact wasn't signed"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-client-core" version="2.0.0">
<artifact name="ktor-client-core-2.0.0.jar">
<sha256 value="230c88baec683c08da2a2ca99e886b2d77a17fa21ed9a28a6f58ae48aee9ca41" origin="Generated by Gradle"/>
</artifact>
<artifact name="ktor-client-core-metadata-2.0.0-all.jar">
<sha256 value="1dc442151f1558d971a6942f4636098e9be4935246833b8e6169db2b74fbda63" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-client-core" version="2.0.0-beta-1">
<artifact name="ktor-client-core-2.0.0-beta-1.jar">
<sha256 value="58ad1ef2e783e40b5508a1eb5ddc73c04d133a84d038251497b7e0555541e0a1" origin="Generated by Gradle because a key couldn't be downloaded"/>
@ -2363,6 +2377,11 @@
<sha256 value="8ea6a915d1d9255a779647c41e7e3521bca1352c962c99c541d37b22a4bd58af" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-client-core-jvm" version="2.0.0">
<artifact name="ktor-client-core-jvm-2.0.0.jar">
<sha256 value="205413e4b172a724ea434679dba496eff7e214dbccfcdd410e19c298e03edac6" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-client-core-jvm" version="2.0.0-beta-1">
<artifact name="ktor-client-core-jvm-2.0.0-beta-1.jar">
<sha256 value="c565624e44b4f83713a6259f118e6ee828af360eccaa1c57917d5c48c0bd620e" origin="Generated by Gradle because a key couldn't be downloaded"/>
@ -2393,6 +2412,11 @@
<sha256 value="d7f149621879a5e7710b3c719b4ab18297ad77361b8d9b99a5f994569ffc058d" origin="Generated by Gradle because artifact wasn't signed"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-client-curl" version="2.0.0">
<artifact name="ktor-client-curl-metadata-2.0.0-all.jar">
<sha256 value="6325ea0d626f62862163dd74996a7a95a9286e4f7e3d5206887f03291a29d1a6" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-client-curl" version="2.0.0-beta-1">
<artifact name="ktor-client-curl-metadata-2.0.0-beta-1-all.jar">
<sha256 value="289779c28934d36bf7e764b6d92852af1b301ba199aa66f839814458cbe17c6a" origin="Generated by Gradle because artifact wasn't signed"/>
@ -2432,6 +2456,11 @@
<sha256 value="62c226f038870e69f61e6d72078f90cd2e221a9c65e4a52379aa75c9a8d6702f" origin="Generated by Gradle because artifact wasn't signed"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-client-mock" version="2.0.0">
<artifact name="ktor-client-mock-metadata-2.0.0-all.jar">
<sha256 value="262b117efc9809e1e3653eec3224d6540253a925f16abfae5a9743b2b95e7050" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-client-mock-jvm" version="1.6.7">
<artifact name="ktor-client-mock-jvm-1.6.7.jar">
<sha256 value="18a1f03278658ebffc43210ccfc315ef98651a68a2b7cc893dbbcdd322163e3b" origin="Generated by Gradle because artifact wasn't signed"/>
@ -2442,6 +2471,11 @@
<sha256 value="17bbd5db22ce26c228dcc1caca543807fefbed0368edf24e583aff4aa8a7022b" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-client-mock-jvm" version="2.0.0">
<artifact name="ktor-client-mock-jvm-2.0.0.jar">
<sha256 value="d56ff1e7ea8df81e2cc286f7739f5c39cad9c83d4263ccd2dcddbb64bc1282b4" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-client-mock-linuxx64" version="1.6.7">
<artifact name="ktor-client-mock.klib">
<sha256 value="a642d23fd74a54e08326af04a9d6ecee154348e5f3d3aa73ca5a98f12f112de0" origin="Generated by Gradle because artifact wasn't signed"/>
@ -2462,17 +2496,35 @@
<sha256 value="f04c0ba1f642cad1a7ca516d1540175551b492628f76f96da2f4142a84154b11" origin="Generated by Gradle because artifact wasn't signed"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-client-okhttp" version="2.0.0">
<artifact name="ktor-client-okhttp-metadata-2.0.0-all.jar">
<sha256 value="f91c8e20a95b3f2fe9c3c35b2eb2971ae2f4e19ae9961589626161a1ab6f6651" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-client-okhttp" version="2.0.0-beta-1">
<artifact name="ktor-client-okhttp-metadata-2.0.0-beta-1-all.jar">
<sha256 value="012c653e21af55ae42b70796fb31927c65a4fdb478190c5fe1c4300654a7932b" origin="Generated by Gradle because artifact wasn't signed"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-client-okhttp-jvm" version="2.0.0">
<artifact name="ktor-client-okhttp-jvm-2.0.0.jar">
<sha256 value="f4258ffa7da88e37c4cf26057b6c72697602cacca0a52b573ac77775694ea0d1" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-client-okhttp-jvm" version="2.0.0-beta-1">
<artifact name="ktor-client-okhttp-jvm-2.0.0-beta-1.jar">
<pgp value="8e3a02905a1ae67e7b0f9acd3967d4eda591b991"/>
<sha256 value="0f7e222a8386cc52893fdfe35c9e3ce9346a6451d63307dce6288e8cd05efe31"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-events" version="2.0.0">
<artifact name="ktor-events-2.0.0.jar">
<sha256 value="f98526ebe576d707c96674350512d96d3ba2d90e9e68ed78babc4fc811f44d78" origin="Generated by Gradle"/>
</artifact>
<artifact name="ktor-events-metadata-2.0.0-all.jar">
<sha256 value="86999411a5e0fc2463b81de42414a2de064abfcc549c4967385cbb28444321b7" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-events" version="2.0.0-beta-1">
<artifact name="ktor-events-2.0.0-beta-1.jar">
<sha256 value="361269a6cb488ac30621941c879e05751ab9414ef4753f716bc7378c9d2d7de2" origin="Generated by Gradle because a key couldn't be downloaded"/>
@ -2481,6 +2533,11 @@
<sha256 value="12c26a3a28a304ac7cdc1da37c318716b92ce20080728d40d8ca8636a4e185b9" origin="Generated by Gradle because artifact wasn't signed"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-events-jvm" version="2.0.0">
<artifact name="ktor-events-jvm-2.0.0.jar">
<sha256 value="fdb425e731b3691f1e9316643b4a50a5968c0c40cfa8261dc5ffd22b9dbb6013" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-events-jvm" version="2.0.0-beta-1">
<artifact name="ktor-events-jvm-2.0.0-beta-1.jar">
<sha256 value="55803053a94674f772091816537e80da2c85646748bbd68d8cdb5fd86f6d82a8" origin="Generated by Gradle because a key couldn't be downloaded"/>
@ -2507,6 +2564,14 @@
<sha256 value="a0efb7bb39bcbb687d505cf237d53bcfda8297657d679bd936235839f3153a9c" origin="Generated by Gradle because artifact wasn't signed"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-http" version="2.0.0">
<artifact name="ktor-http-2.0.0.jar">
<sha256 value="63b4cf506824d4752907b6c73a930644fec14f861a73c21113a39a13146a2e03" origin="Generated by Gradle"/>
</artifact>
<artifact name="ktor-http-metadata-2.0.0-all.jar">
<sha256 value="151aa59e3b7fb60d2fdb7b4b5443bb8a83ee9a2ba0360e90c816462334645bef" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-http" version="2.0.0-beta-1">
<artifact name="ktor-http-2.0.0-beta-1.jar">
<sha256 value="15080bebbbf861cad7d18e05e1202c5a3125521e93efb43d48002d46432ee6b4" origin="Generated by Gradle because a key couldn't be downloaded"/>
@ -2531,6 +2596,11 @@
<sha256 value="2833c11eccff8a1bfcedd4d9f293a3bc1bda13f0f91cb3a3c1f2b6b5a6a65161" origin="Generated by Gradle because artifact wasn't signed"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-http-cio" version="2.0.0">
<artifact name="ktor-http-cio-metadata-2.0.0-all.jar">
<sha256 value="a739b26662e3f7ccc5702ec669a31ac0bec6adf6ada7a3c56bb2878ca0d7271e" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-http-cio" version="2.0.0-beta-1">
<artifact name="ktor-http-cio-metadata-2.0.0-beta-1-all.jar">
<sha256 value="270d03b08ede003f90b0234d4deb970c727a1ac9958624873c3e10d968730caa" origin="Generated by Gradle because artifact wasn't signed"/>
@ -2576,6 +2646,11 @@
<sha256 value="39c9032392bd44a4dc2d1177649188acfc500530c7ba07430d2fec143e2f4f3c" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-http-jvm" version="2.0.0">
<artifact name="ktor-http-jvm-2.0.0.jar">
<sha256 value="b9104ab4984ff1b9ff888bda9c709a5e1152ce1c67256f1929a7af035c735986" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-http-jvm" version="2.0.0-beta-1">
<artifact name="ktor-http-jvm-2.0.0-beta-1.jar">
<sha256 value="f8aed40449e782ffd8e5032be1aceefd09739df9f85e934cf3cc36b6c330ad98" origin="Generated by Gradle because a key couldn't be downloaded"/>
@ -2612,6 +2687,14 @@
<sha256 value="e616ad0f68eecda6f90470475d80072c63d579dfb5c2bc23b2d23c0a24fc3e24" origin="Generated by Gradle because artifact wasn't signed"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-io" version="2.0.0">
<artifact name="ktor-io-2.0.0.jar">
<sha256 value="997e2115bab1d98808e60f94af2146a89409a2b6ccf04359a0958cb1142a74b5" origin="Generated by Gradle"/>
</artifact>
<artifact name="ktor-io-metadata-2.0.0-all.jar">
<sha256 value="2c30b356a2216c7aa7f32a1af0b527bb7e7d702c97aacb0af2465642e010ccfb" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-io" version="2.0.0-beta-1">
<artifact name="ktor-io-2.0.0-beta-1.jar">
<sha256 value="6d67c9aaaf2f20a8fc6f7c9ab6a13e06c57d8dabd7a64e4a697dc43ef3b632d8" origin="Generated by Gradle because a key couldn't be downloaded"/>
@ -2630,6 +2713,11 @@
<sha256 value="9455dcafdabafe2eec78e60a8a4bf8d23e07e8491ae8baffc545e0b5545f8f33" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-io-jvm" version="2.0.0">
<artifact name="ktor-io-jvm-2.0.0.jar">
<sha256 value="daaba6fda5f37280d0f8c70b7ed707bb66c154aa4f0c71fbb0b454b2c9d5edb8" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-io-jvm" version="2.0.0-beta-1">
<artifact name="ktor-io-jvm-2.0.0-beta-1.jar">
<sha256 value="27a18b9e78aca8cfff41156fb54ba02943b450b33e505029630f7a728f3dff22" origin="Generated by Gradle because a key couldn't be downloaded"/>
@ -2672,6 +2760,11 @@
<sha256 value="f8bb1df9963c9f6d361a9c0c54c06c0606fdf56502745393e5110517a6364a36" origin="Generated by Gradle because artifact wasn't signed"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-network" version="2.0.0">
<artifact name="ktor-network-metadata-2.0.0-all.jar">
<sha256 value="a42e48bb8793a3f06dae0bf5aef7d5ec5e1d7a5914c73563d6dc20e13f648783" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-network" version="2.0.0-beta-1">
<artifact name="ktor-network-metadata-2.0.0-beta-1-all.jar">
<sha256 value="41425690a6e3ac1097b062b5f3e89510c27460c8281cc4a78bae3532e11033cd" origin="Generated by Gradle because artifact wasn't signed"/>
@ -2702,6 +2795,11 @@
<sha256 value="4e54f223e2984d194f8bc81f1318fed682f7504271c44274650cb648a2aae2eb" origin="Generated by Gradle because artifact wasn't signed"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-network-tls" version="2.0.0">
<artifact name="ktor-network-tls-metadata-2.0.0-all.jar">
<sha256 value="48fc90bf02e139978e7e53063331ee85add51eaaee066d919a0260003eb7417c" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-network-tls" version="2.0.0-beta-1">
<artifact name="ktor-network-tls-metadata-2.0.0-beta-1-all.jar">
<sha256 value="8148fc9cefdeb1aca9332db0cde028fa4caf073ca7bac59937fabc277485e896" origin="Generated by Gradle because artifact wasn't signed"/>
@ -2717,6 +2815,14 @@
<sha256 value="870f52f530ab0b521a9bdb5d7ac46815cfed9ae3aae3e8d7c4d6375d65361647" origin="Generated by Gradle because a key couldn't be downloaded"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-serialization" version="2.0.0">
<artifact name="ktor-serialization-2.0.0.jar">
<sha256 value="5733399841c20dd12cfe795308c5ca7d632068f605854d2c3fc59ba23023171d" origin="Generated by Gradle"/>
</artifact>
<artifact name="ktor-serialization-metadata-2.0.0-all.jar">
<sha256 value="3bc3a14681afc19edec387c0316bd4aa15caa0bf8f68e43e4ae2ca3fc381e34e" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-serialization" version="2.0.0-beta-1">
<artifact name="ktor-serialization-2.0.0-beta-1.jar">
<sha256 value="e611383645944b3154908ccb59470e88c720a0dd9b0931dfbbb3764bfc0fe8fa" origin="Generated by Gradle because a key couldn't be downloaded"/>
@ -2725,6 +2831,11 @@
<sha256 value="03fd54642e919d9109f6d99928111b72dde1cc2b1fd4be41ed1a3df037a7cf43" origin="Generated by Gradle because artifact wasn't signed"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-serialization-jvm" version="2.0.0">
<artifact name="ktor-serialization-jvm-2.0.0.jar">
<sha256 value="e8cb74ee1adc720c8d2aee47563d30b2b483439eae6fd21e2daa9094269d55e2" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-serialization-jvm" version="2.0.0-beta-1">
<artifact name="ktor-serialization-jvm-2.0.0-beta-1.jar">
<sha256 value="cb67983240248443a290b82a458192fea84b6a93efb4a19b9c47f7b6c8927568" origin="Generated by Gradle because a key couldn't be downloaded"/>
@ -2751,6 +2862,14 @@
<sha256 value="845f4320b354136a4ca91717fe7531a31392b3e059d6613f5b7bf12f66362349" origin="Generated by Gradle because artifact wasn't signed"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-utils" version="2.0.0">
<artifact name="ktor-utils-2.0.0.jar">
<sha256 value="169bbb1aea1b88671017aeec728ce7e060b9bc4ceb49ab434da93b951934857d" origin="Generated by Gradle"/>
</artifact>
<artifact name="ktor-utils-metadata-2.0.0-all.jar">
<sha256 value="dc8b84f7dfd056581e3b6bea32ab38f17fec60f20bb1d34420446cd8d00d2986" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-utils" version="2.0.0-beta-1">
<artifact name="ktor-utils-2.0.0-beta-1.jar">
<sha256 value="3b2c97807bd8557b3c5ba6721c341fc2a928e711c1824f3f248a42bef73ebfb1" origin="Generated by Gradle because a key couldn't be downloaded"/>
@ -2769,6 +2888,11 @@
<sha256 value="c5ab2b8cbf38b3f2e03bb45782a157fc43472743884b46f75a8117e514cfb023" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-utils-jvm" version="2.0.0">
<artifact name="ktor-utils-jvm-2.0.0.jar">
<sha256 value="1877890d1363eb167bcb81b74582f6a90e524acdce2832b575f92402773ca0b2" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-utils-jvm" version="2.0.0-beta-1">
<artifact name="ktor-utils-jvm-2.0.0-beta-1.jar">
<sha256 value="a261885c15bcfd57c7f7f87910ba47df8aaf3d461536f674a598379140105bfa" origin="Generated by Gradle because a key couldn't be downloaded"/>
@ -2795,6 +2919,14 @@
<sha256 value="c94c118cc5fd747635dd97f1cf0ab56378f3d2fb490eaa73f35de56720146aa3" origin="Generated by Gradle because artifact wasn't signed"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-websocket-serialization" version="2.0.0">
<artifact name="ktor-websocket-serialization-2.0.0.jar">
<sha256 value="2e068ca0a5ef40758b757f58f5fb24b5f489dcee043668f425b55d569fea75cc" origin="Generated by Gradle"/>
</artifact>
<artifact name="ktor-websocket-serialization-metadata-2.0.0-all.jar">
<sha256 value="6327fd741d9b8cd8f3292d26a44f61fe467e08a5dd95295dc9d705edd548200b" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-websocket-serialization" version="2.0.0-beta-1">
<artifact name="ktor-websocket-serialization-2.0.0-beta-1.jar">
<sha256 value="1019a86df4a0d73be0c3c6dceaf9e88903571b140166af25687995e8522b931a" origin="Generated by Gradle because a key couldn't be downloaded"/>
@ -2803,6 +2935,11 @@
<sha256 value="0a4f5aed043969b999b0aa1a87dbd4cd89b6dc3c4f81dc366825dfbe281d12e6" origin="Generated by Gradle because artifact wasn't signed"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-websocket-serialization-jvm" version="2.0.0">
<artifact name="ktor-websocket-serialization-jvm-2.0.0.jar">
<sha256 value="cfcec1c853f696c5794497a04713c8cbb93f4d530372f39fd9b28c777d32d0bd" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-websocket-serialization-jvm" version="2.0.0-beta-1">
<artifact name="ktor-websocket-serialization-jvm-2.0.0-beta-1.jar">
<sha256 value="9e2b4ece9c8a3799d30f6c92478d23bad9ba8166a8701c08b494af01c51aae8e" origin="Generated by Gradle because a key couldn't be downloaded"/>
@ -2813,6 +2950,14 @@
<sha256 value="49bdb43d612b15b88fd1a57a810a8c3d5aa65afd2bb7b8151d509d421c792688" origin="Generated by Gradle because artifact wasn't signed"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-websockets" version="2.0.0">
<artifact name="ktor-websockets-2.0.0.jar">
<sha256 value="1fde73424bf6a72ed0195ac73298af5394ef826b00880463a1ea0a3fae9d6264" origin="Generated by Gradle"/>
</artifact>
<artifact name="ktor-websockets-metadata-2.0.0-all.jar">
<sha256 value="a3c01396968496ad96b1a508f99a26ee0fdf7bcf56e54c19f9c2eb08814327a7" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-websockets" version="2.0.0-beta-1">
<artifact name="ktor-websockets-2.0.0-beta-1.jar">
<sha256 value="38466e9b58f7ae9372f84c463fc28dfaf08a2f0b59c1596d8e48b4594bbe255f" origin="Generated by Gradle because a key couldn't be downloaded"/>
@ -2821,6 +2966,11 @@
<sha256 value="cb46e25c9f7c96f3eec42bd6e0ea77031dde0add2f9c7383a164213b2d282d98" origin="Generated by Gradle because artifact wasn't signed"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-websockets-jvm" version="2.0.0">
<artifact name="ktor-websockets-jvm-2.0.0.jar">
<sha256 value="673bd57e11450ffbb9dd7fd31c5416d133ed90d24ab9aadd1a40e6a6a616a1e3" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.ktor" name="ktor-websockets-jvm" version="2.0.0-beta-1">
<artifact name="ktor-websockets-jvm-2.0.0-beta-1.jar">
<sha256 value="f0dabbae5a420838cdbff168e3bb75b88c8cf27991e5621b19ebed72f3ea146f" origin="Generated by Gradle because a key couldn't be downloaded"/>
@ -3825,6 +3975,11 @@
<sha256 value="5305f7a4dee7a6cb79a29c258aca93de47b49588a6dfc6da01bd8772589ea66c" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-stdlib" version="1.6.20">
<artifact name="kotlin-stdlib-1.6.20.jar">
<sha256 value="eeb51c2b67b26233fd81d0bc4f8044ec849718890905763ceffd84a31e2cb799" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-stdlib-common" version="1.3.71">
<artifact name="kotlin-stdlib-common-1.3.71.jar">
<sha256 value="974f8a9b7bfce3d730a86efe0eab219a72621e8530f91e30c89f400ba98092ec" origin="Generated by Gradle"/>
@ -3840,6 +3995,11 @@
<sha256 value="280ddd0994e4560c9a49ee81c1b047ddc2b8f2176159475066025b474b37effd" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-stdlib-common" version="1.6.20">
<artifact name="kotlin-stdlib-common-1.6.20.jar">
<sha256 value="8da40a2520d30dcb1012176fe93d24e82d08a3e346c37e0343b0fb6f64f6be01" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-stdlib-jdk7" version="1.3.71">
<artifact name="kotlin-stdlib-jdk7-1.3.71.jar">
<sha256 value="b046a5ef54c7006db852e48e547aaff525a9e7a0a5909ffe5fe2c966c1a3a72e" origin="Generated by Gradle"/>
@ -3855,6 +4015,11 @@
<sha256 value="2aedcdc6b69b33bdf5cc235bcea88e7cf6601146bb6bcdffdb312bbacd7be261" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-stdlib-jdk7" version="1.6.20">
<artifact name="kotlin-stdlib-jdk7-1.6.20.jar">
<sha256 value="aa2fa2e81355c4d98dd97da2169bf401f842261378f5b1cbea1aa11855d67620" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-stdlib-jdk8" version="1.3.71">
<artifact name="kotlin-stdlib-jdk8-1.3.71.jar">
<sha256 value="a22192ac779ba8eff09d07084ae503e8be9e7c8ca1cb2b511ff8af4c68d83d66" origin="Generated by Gradle"/>
@ -3875,6 +4040,11 @@
<sha256 value="1456d82d039ea30d8485b032901f52bbf07e7cdbe8bb1f8708ad32a8574c41ce" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-stdlib-jdk8" version="1.6.20">
<artifact name="kotlin-stdlib-jdk8-1.6.20.jar">
<sha256 value="fdab1bf120e2b5e7ab6d7888e9ebc024ec6b8ca729361296395dab634b213695" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-test" version="1.6.10">
<artifact name="kotlin-test-1.6.10.jar">
<sha256 value="b891453cafbf961532d2ba0fb8969e40b0f7c168c9a2fc6a8cdf7c1b0577a36a" origin="Generated by Gradle"/>
@ -3954,6 +4124,11 @@
<sha256 value="f36ea75c31934bfad0682cfc435cce922e28b3bffa5af26cf86f07db13008f8a" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-android" version="1.6.0">
<artifact name="kotlinx-coroutines-android-1.6.0.jar">
<sha256 value="ad89b520c22eab46e63610588a8c424040243294015ec214e30643c0efb7e5d4" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-core" version="1.3.4">
<artifact name="kotlinx-coroutines-core-1.3.4.jar">
<sha256 value="17bec6112d93f5fcb11c27ecc8a14b48e30a5689ccf42c95025b89ba2210c28f" origin="Generated by Gradle"/>
@ -3968,6 +4143,9 @@
</artifact>
</component>
<component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-core" version="1.6.0">
<artifact name="kotlinx-coroutines-core-1.6.0.jar">
<sha256 value="0c08e1f40e00a0fb35f45fd064162ad2b5a5aa889bb461979cf26d6ee015eb94" origin="Generated by Gradle"/>
</artifact>
<artifact name="kotlinx-coroutines-core-metadata-1.6.0-all.jar">
<sha256 value="2185ed84d158e4c1881d9465a11a13721a289987a1da8d37df6825254ea95ecf" origin="Generated by Gradle because artifact wasn't signed"/>
</artifact>
@ -3983,11 +4161,26 @@
<sha256 value="db754be65cd22e18c8861a141cc35cedc3b659292eacb7f9d2c78a5386795dec" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-core-jvm" version="1.6.0">
<artifact name="kotlinx-coroutines-core-jvm-1.6.0.jar">
<sha256 value="acc8c74b1fb88121c51221bfa7b6f5e920201bc20183ebf74165dcf5d45a8003" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-core-linuxx64" version="1.5.2-native-mt">
<artifact name="kotlinx-coroutines-core.klib">
<sha256 value="bd5e3639e853cc1e8dca4db696ab29f95924453da93db96e20f30979e9463ef2" origin="Generated by Gradle because artifact wasn't signed"/>
</artifact>
</component>
<component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-jdk8" version="1.6.0">
<artifact name="kotlinx-coroutines-jdk8-1.6.0.jar">
<sha256 value="cf93f59cafabea454b0bb03c4c3ea055f6ea17f7ff06770a765eca94dd5de867" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-slf4j" version="1.6.0">
<artifact name="kotlinx-coroutines-slf4j-1.6.0.jar">
<sha256 value="d8a019ae7be13992867be62d97e6993afc141a956010f5f704d569f5e9677167" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlinx" name="kotlinx-datetime-linuxx64" version="0.3.1">
<artifact name="kotlinx-datetime-cinterop-date.klib">
<sha256 value="b7a3f64fb70f8931cab585eb58ebc6471da23712e964f243e5299b51a0876ffb" origin="Generated by Gradle because artifact wasn't signed"/>
@ -4050,6 +4243,7 @@
</component>
<component group="org.json" name="json" version="20211205">
<artifact name="json-20211205.jar">
<pgp value="86616cd3c4f0803e73374a434dbf5995d492505d"/>
<sha256 value="7f38d61fbb7e2afdc31c6be865720ee4fc8a0c3c14fac4f3ec47fd3deb3939c6" origin="Generated by Gradle"/>
</artifact>
</component>