Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#192 move http client engine dependencies to separated module #193

Merged
merged 1 commit into from
Jan 15, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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