From 93390ffa7b995ebcb8d0b0683f6b7d2d9087f40c Mon Sep 17 00:00:00 2001 From: Diamond <33725716+DiamondMiner88@users.noreply.github.com> Date: Fri, 23 Sep 2022 16:44:34 -0700 Subject: [PATCH] fix: use ipv4 only for `raw.githubusercontent.com` (#21) --- app/build.gradle.kts | 2 +- .../com/aliucord/manager/di/HttpModule.kt | 24 +++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ec98a4b..341d4c4 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -90,7 +90,7 @@ dependencies { // Ktor val ktorVersion = "2.1.1" implementation("io.ktor:ktor-client-core:$ktorVersion") - implementation("io.ktor:ktor-client-cio:$ktorVersion") + implementation("io.ktor:ktor-client-okhttp:$ktorVersion") implementation("io.ktor:ktor-client-content-negotiation:$ktorVersion") implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion") diff --git a/app/src/main/kotlin/com/aliucord/manager/di/HttpModule.kt b/app/src/main/kotlin/com/aliucord/manager/di/HttpModule.kt index d7d4d7d..94e6b22 100644 --- a/app/src/main/kotlin/com/aliucord/manager/di/HttpModule.kt +++ b/app/src/main/kotlin/com/aliucord/manager/di/HttpModule.kt @@ -1,19 +1,39 @@ package com.aliucord.manager.di import io.ktor.client.* -import io.ktor.client.engine.cio.* +import io.ktor.client.engine.okhttp.* import io.ktor.client.plugins.contentnegotiation.* import io.ktor.serialization.kotlinx.json.* import kotlinx.serialization.json.Json +import okhttp3.Dns import org.koin.core.module.dsl.singleOf import org.koin.dsl.module +import java.net.Inet4Address +import java.net.InetAddress val httpModule = module { fun provideJson() = Json { ignoreUnknownKeys = true } - fun provideHttpClient(json: Json) = HttpClient(CIO) { + fun provideHttpClient(json: Json) = HttpClient(OkHttp) { + engine { + config { + dns(object : Dns { + override fun lookup(hostname: String): List { + val addresses = Dns.SYSTEM.lookup(hostname) + + // Github's nameservers do not respond to IPv6 requests for raw.githubusercontent.com, + // which causes CIO, Android and OkHTTP to all hang + return if (hostname == "raw.githubusercontent.com") { + addresses.filterIsInstance() + } else { + addresses + } + } + }) + } + } install(ContentNegotiation) { json(json) }