From bba2c6b725500cdb5a7d2a6426a72cb0ec07595b Mon Sep 17 00:00:00 2001 From: "zuev.aleksey31" Date: Fri, 30 Jan 2026 20:10:18 +0300 Subject: [PATCH 1/3] fix(android): implement androidMain HttpClient (OkHttp) to fix hostname-aware checkServerTrusted error --- kmp-socketio/build.gradle.kts | 20 +++++++++++ .../engineio/transports/transport.android.kt | 35 +++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 kmp-socketio/src/androidMain/kotlin/com/piasy/kmp/socketio/engineio/transports/transport.android.kt diff --git a/kmp-socketio/build.gradle.kts b/kmp-socketio/build.gradle.kts index b7cceb3..8e2e300 100644 --- a/kmp-socketio/build.gradle.kts +++ b/kmp-socketio/build.gradle.kts @@ -6,13 +6,28 @@ plugins { alias(libs.plugins.kmp) alias(libs.plugins.vanniktech.mavenPublish) alias(libs.plugins.kover) + alias(libs.plugins.android.library) } version = Consts.releaseVersion group = Consts.releaseGroup +android { + namespace = "${Consts.androidNS}.android" + compileSdk = libs.versions.compileSdk.get().toInt() + defaultConfig { + minSdk = libs.versions.minSdk.get().toInt() + } + + compileOptions { + sourceCompatibility = JavaVersion.toVersion(libs.versions.jvm.get().toInt()) + targetCompatibility = JavaVersion.toVersion(libs.versions.jvm.get().toInt()) + } +} + kotlin { jvm() + androidTarget() iosArm64() iosSimulatorArm64() @@ -69,6 +84,11 @@ kotlin { api(libs.ktor.client.cio) // cio engine works fine } } + androidMain { + dependencies { + api(libs.ktor.client.okhttp) + } + } jvmTest { dependencies { implementation(libs.kotlin.test) diff --git a/kmp-socketio/src/androidMain/kotlin/com/piasy/kmp/socketio/engineio/transports/transport.android.kt b/kmp-socketio/src/androidMain/kotlin/com/piasy/kmp/socketio/engineio/transports/transport.android.kt new file mode 100644 index 0000000..979c346 --- /dev/null +++ b/kmp-socketio/src/androidMain/kotlin/com/piasy/kmp/socketio/engineio/transports/transport.android.kt @@ -0,0 +1,35 @@ +package com.piasy.kmp.socketio.engineio.transports + +import io.ktor.client.HttpClient +import io.ktor.client.HttpClientConfig +import io.ktor.client.engine.okhttp.OkHttp +import java.security.SecureRandom +import java.security.cert.X509Certificate +import javax.net.ssl.SSLContext +import javax.net.ssl.X509TrustManager + +actual fun httpClient( + trustAllCerts: Boolean, + config: HttpClientConfig<*>.() -> Unit +): HttpClient = HttpClient(OkHttp) { + if (trustAllCerts) { + val trustManager = object : X509TrustManager { + override fun checkClientTrusted(chain: Array?, authType: String?) = Unit + override fun checkServerTrusted(chain: Array?, authType: String?) = Unit + override fun getAcceptedIssuers(): Array = emptyArray() + } + + val sslContext = SSLContext.getInstance("TLS").apply { + init(null, arrayOf(trustManager), SecureRandom()) + } + + engine { + config { + sslSocketFactory(sslContext.socketFactory, trustManager) + hostnameVerifier { _, _ -> true } + } + } + } + + config(this) +} From 146c004a58d810314e087c87ab98d620d6f2b12c Mon Sep 17 00:00:00 2001 From: Piasy Date: Sun, 1 Feb 2026 14:52:57 +0800 Subject: [PATCH 2/3] fix CI issue --- README.md | 5 ++++- buildSrc/src/main/kotlin/Constants.kt | 2 +- example/androidApp/src/main/AndroidManifest.xml | 1 + .../kotlin/com/piasy/kmp/socketio/example/Greeting.kt | 4 +++- kmp-socketio/build.gradle.kts | 9 ++++++++- 5 files changed, 17 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 3af6e9c..eeeedd3 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,9 @@ kotlin { ## Usage ```kotlin -IO.socket("http://localhost:3000", IO.Options()) { socket -> +val opt = IO.Options() +// opt.trustAllCerts = true +IO.socket("http://localhost:3000", opt) { socket -> socket.on(Socket.EVENT_CONNECT) { args -> println("on connect ${args.joinToString()}") @@ -156,6 +158,7 @@ Maven central portal credentials and signing configs are set in `~/.gradle/gradl # on macOS: need manual release on website ./gradlew clean \ publishKotlinMultiplatformPublicationToMavenCentralRepository \ + publishAndroidReleasePublicationToMavenCentralRepository \ publishJvmPublicationToMavenCentralRepository \ publishIosArm64PublicationToMavenCentralRepository \ publishIosSimulatorArm64PublicationToMavenCentralRepository \ diff --git a/buildSrc/src/main/kotlin/Constants.kt b/buildSrc/src/main/kotlin/Constants.kt index 927cfc0..8ebb7e1 100644 --- a/buildSrc/src/main/kotlin/Constants.kt +++ b/buildSrc/src/main/kotlin/Constants.kt @@ -1,7 +1,7 @@ object Consts { const val releaseGroup = "com.piasy" const val releaseName = "kmp-socketio" - const val releaseVersion = "1.4.0" + const val releaseVersion = "1.4.1" val androidNS = "$releaseGroup.${releaseName.replace('-', '.')}" } diff --git a/example/androidApp/src/main/AndroidManifest.xml b/example/androidApp/src/main/AndroidManifest.xml index 32c911c..3aca396 100644 --- a/example/androidApp/src/main/AndroidManifest.xml +++ b/example/androidApp/src/main/AndroidManifest.xml @@ -6,6 +6,7 @@ + val opt = IO.Options() + //opt.trustAllCerts = true + IO.socket("http://172.16.11.186:3000", opt) { socket -> socket.on(Socket.EVENT_CONNECT) { args -> println("Greeting on connect ${args.joinToString()}") diff --git a/kmp-socketio/build.gradle.kts b/kmp-socketio/build.gradle.kts index 8e2e300..790ce22 100644 --- a/kmp-socketio/build.gradle.kts +++ b/kmp-socketio/build.gradle.kts @@ -23,11 +23,18 @@ android { sourceCompatibility = JavaVersion.toVersion(libs.versions.jvm.get().toInt()) targetCompatibility = JavaVersion.toVersion(libs.versions.jvm.get().toInt()) } + testOptions { + unitTests.all { + it.failOnNoDiscoveredTests = false + } + } } kotlin { jvm() - androidTarget() + androidTarget { + publishLibraryVariants("release") + } iosArm64() iosSimulatorArm64() From e142e1b77983891f8ffe56ae76f542d4997d192d Mon Sep 17 00:00:00 2001 From: Piasy Date: Sun, 1 Feb 2026 15:13:16 +0800 Subject: [PATCH 3/3] fix unstable ut --- .../kotlin/com/piasy/kmp/socketio/engineio/TestUtil.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/kmp-socketio/src/jvmTest/kotlin/com/piasy/kmp/socketio/engineio/TestUtil.kt b/kmp-socketio/src/jvmTest/kotlin/com/piasy/kmp/socketio/engineio/TestUtil.kt index a373188..dabf478 100644 --- a/kmp-socketio/src/jvmTest/kotlin/com/piasy/kmp/socketio/engineio/TestUtil.kt +++ b/kmp-socketio/src/jvmTest/kotlin/com/piasy/kmp/socketio/engineio/TestUtil.kt @@ -43,7 +43,9 @@ object TestUtil { @JvmStatic fun closeManager(manager: Manager) { - manager.close() + manager.engine?.scope?.launch { + manager.close() + } } @JvmStatic