Skip to content

Commit

Permalink
Merge pull request #193 from icerockdev/#192-ios-12-support
Browse files Browse the repository at this point in the history
#192 move http client engine dependencies to separated module
  • Loading branch information
Alex009 authored Jan 15, 2023
2 parents 69e6a88 + f443bdd commit fee2cbd
Show file tree
Hide file tree
Showing 15 changed files with 102 additions and 28 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/compilation-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ on:

jobs:
build:
runs-on: macOS-latest
runs-on: macOS-11

steps:
- uses: actions/checkout@v1
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ on:
jobs:
publish:
name: Publish library at mavenCentral
runs-on: macOS-latest
runs-on: macOS-11
env:
OSSRH_USER: ${{ secrets.OSSRH_USER }}
OSSRH_KEY: ${{ secrets.OSSRH_KEY }}
Expand Down
9 changes: 5 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ buildscript {
}
dependencies {
classpath "dev.icerock.moko:network-generator:0.19.0"
classpath "dev.icerock.moko:network-generator:0.20.0"
}
}
Expand All @@ -53,9 +53,10 @@ project build.gradle
apply plugin: "dev.icerock.mobile.multiplatform-network-generator"
dependencies {
commonMainApi("dev.icerock.moko:network:0.19.0")
commonMainApi("dev.icerock.moko:network-bignum:0.19.0") // kbignum serializer
commonMainApi("dev.icerock.moko:network-errors:0.19.0") // moko-errors integration
commonMainApi("dev.icerock.moko:network:0.20.0")
commonMainApi("dev.icerock.moko:network-engine:0.20.0") // configured HttpClientEngine
commonMainApi("dev.icerock.moko:network-bignum:0.20.0") // kbignum serializer
commonMainApi("dev.icerock.moko:network-errors:0.20.0") // moko-errors integration
}
```

Expand Down
5 changes: 1 addition & 4 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ mokoResourcesVersion = "0.20.1"
mokoMvvmVersion = "0.12.0"
mokoErrorsVersion = "0.6.0"
mokoTestVersion = "0.6.1"
mokoNetworkVersion = "0.19.0"
mokoNetworkVersion = "0.20.0"

# tests
espressoCoreVersion = "3.2.0"
Expand Down Expand Up @@ -61,9 +61,6 @@ mokoResources = { module = "dev.icerock.moko:resources", version.ref = "mokoReso
mokoMvvmCore = { module = "dev.icerock.moko:mvvm-core", version.ref = "mokoMvvmVersion" }
mokoMvvmLiveData = { module = "dev.icerock.moko:mvvm-livedata", version.ref = "mokoMvvmVersion" }
mokoErrors = { module = "dev.icerock.moko:errors", version.ref = "mokoErrorsVersion" }
mokoNetwork = { module = "dev.icerock.moko:network", version.ref = "mokoNetworkVersion" }
mokoNetworkErrors = { module = "dev.icerock.moko:network-errors", version.ref = "mokoNetworkVersion" }
mokoNetworkBignum = { module = "dev.icerock.moko:network-bignum", version.ref = "mokoNetworkVersion" }

# tests
espressoCore = { module = "androidx.test.espresso:espresso-core", version.ref = "espressoCoreVersion" }
Expand Down
40 changes: 40 additions & 0 deletions network-engine/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*
* Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
*/

plugins {
id("dev.icerock.moko.gradle.multiplatform.mobile")
id("dev.icerock.moko.gradle.detekt")
id("dev.icerock.moko.gradle.publication")
id("dev.icerock.moko.gradle.stub.javadoc")
id("dev.icerock.moko.gradle.tests")
}

kotlin {
jvm()

sourceSets {
val commonMain by getting

val commonJvmAndroid = create("commonJvmAndroid") {
dependsOn(commonMain)
dependencies {
api(libs.ktorClientOkHttp)
}
}

val androidMain by getting {
dependsOn(commonJvmAndroid)
}

val jvmMain by getting {
dependsOn(commonJvmAndroid)
}
}
}

dependencies {
commonMainImplementation(libs.coroutines)
commonMainApi(projects.network)
iosMainApi(libs.ktorClientIos)
}
2 changes: 2 additions & 0 deletions network-engine/src/androidMain/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest package="dev.icerock.moko.network.engine" />
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,12 @@ package dev.icerock.moko.network

import io.ktor.client.engine.HttpClientEngine
import io.ktor.client.engine.darwin.Darwin
import io.ktor.client.engine.darwin.DarwinHttpRequestException

actual fun createHttpClientEngine(block: HttpClientEngineConfig.() -> Unit): HttpClientEngine {
// configure darwin throwable mapper
ThrowableToNSErrorMapper.setup { (it as? DarwinHttpRequestException)?.origin }
// configure darwin engine
val config = HttpClientEngineConfig().also(block)
return Darwin.create {
this.configureSession {
Expand Down
5 changes: 0 additions & 5 deletions network/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,6 @@ kotlin {

val commonJvmAndroid = create("commonJvmAndroid") {
dependsOn(commonMain)
dependencies {
api(libs.ktorClientOkHttp)
}
}

val androidMain by getting {
Expand All @@ -44,8 +41,6 @@ dependencies {
commonMainImplementation(libs.coroutines)
commonMainApi(libs.kotlinSerialization)
commonMainApi(libs.ktorClient)
androidMainApi(libs.ktorClientOkHttp)
iosMainApi(libs.ktorClientIos)

androidMainImplementation(libs.appCompat)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,24 @@

package dev.icerock.moko.network

import io.ktor.client.engine.darwin.DarwinHttpRequestException
import platform.Foundation.NSError
import platform.Foundation.NSURLErrorCannotConnectToHost
import platform.Foundation.NSURLErrorCannotFindHost
import platform.Foundation.NSURLErrorCannotLoadFromNetwork
import platform.Foundation.NSURLErrorDomain

actual fun Throwable.isNetworkConnectionError(): Boolean {
return when (this) {
is DarwinHttpRequestException -> isSSLException().not()
val nsError: NSError? = ThrowableToNSErrorMapper(this)

return when {
this.isSSLException().not() -> true

nsError?.domain == NSURLErrorDomain && nsError?.code in listOf(
NSURLErrorCannotConnectToHost,
NSURLErrorCannotFindHost,
NSURLErrorCannotLoadFromNetwork
) -> true

else -> false
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/*
* Copyright 2023 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
*/

package dev.icerock.moko.network

import platform.Foundation.NSError
import kotlin.native.concurrent.AtomicReference

object ThrowableToNSErrorMapper : (Throwable) -> NSError? {
private val mapperRef: AtomicReference<((Throwable) -> NSError?)?> = AtomicReference(null)

override fun invoke(throwable: Throwable): NSError? {
return requireNotNull(mapperRef.value) { "please setup ThrowableToNSErrorMapper by call ThrowableToNSErrorMapper.setup() in iosMain or use dev.icerock.moko.network.createHttpClientEngine" }
.invoke(throwable)
}

fun setup(block: (Throwable) -> NSError?) {
mapperRef.value = block
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@

package dev.icerock.moko.network

import io.ktor.client.engine.darwin.DarwinHttpRequestException
import platform.Foundation.NSError
import platform.Foundation.NSURLErrorCannotLoadFromNetwork
import platform.Foundation.NSURLErrorClientCertificateRequired
import platform.Foundation.NSURLErrorDomain
import platform.Foundation.NSURLErrorSecureConnectionFailed
import platform.Foundation.NSURLErrorServerCertificateHasBadDate
import platform.Foundation.NSURLErrorServerCertificateHasUnknownRoot
Expand All @@ -24,13 +25,14 @@ private val sslKeys = mapOf(
)

actual fun Throwable.isSSLException(): Boolean {
val iosHttpException = this as? DarwinHttpRequestException ?: return false
return sslKeys.keys.contains(
iosHttpException.origin.code
)
val nsError: NSError = ThrowableToNSErrorMapper(this) ?: return false

return nsError.domain == NSURLErrorDomain && sslKeys.keys.contains(nsError.code)
}

actual fun Throwable.getSSLExceptionType(): SSLExceptionType? {
val iosHttpException = this as? DarwinHttpRequestException ?: return null
return sslKeys[iosHttpException.origin.code]
val nsError: NSError = ThrowableToNSErrorMapper(this) ?: return null
if (nsError.domain != NSURLErrorDomain) return null

return sslKeys[nsError.code]
}
4 changes: 1 addition & 3 deletions sample/mpp-library/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,9 @@ dependencies {

commonMainApi(libs.mokoMvvmCore)
commonMainApi(libs.mokoMvvmLiveData)
commonMainApi(libs.mokoNetwork)
commonMainApi(libs.mokoNetworkErrors)
commonMainApi(libs.mokoNetworkBignum)

commonMainApi(projects.network)
commonMainApi(projects.networkEngine)
commonMainApi(projects.networkBignum)
commonMainApi(projects.networkErrors)

Expand Down
1 change: 1 addition & 0 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ includeBuild("network-generator")
include(":network")
include(":network-errors")
include(":network-bignum")
include(":network-engine")

include(":sample:android-app")
include(":sample:websocket-echo-server")
Expand Down

0 comments on commit fee2cbd

Please sign in to comment.