Skip to content

Commit 78f3acc

Browse files
committed
handle ktor tls errors
1 parent ba5eb5b commit 78f3acc

3 files changed

Lines changed: 17 additions & 9 deletions

File tree

common/src/main/java/com/pedro/common/socket/ktor/TcpStreamSocketKtor.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import io.ktor.network.sockets.InetSocketAddress
55
import io.ktor.network.sockets.ReadWriteSocket
66
import io.ktor.network.sockets.aSocket
77
import io.ktor.network.tls.tls
8+
import kotlinx.coroutines.CoroutineExceptionHandler
89
import kotlinx.coroutines.Dispatchers
910
import java.security.SecureRandom
1011
import javax.net.ssl.TrustManager
@@ -16,14 +17,17 @@ class TcpStreamSocketKtor(
1617
private val certificate: TrustManager? = null
1718
): TcpStreamSocketKtorBase(host, port) {
1819

19-
override suspend fun onConnectSocket(timeout: Long): ReadWriteSocket {
20+
override suspend fun onConnectSocket(timeout: Long, error: (Throwable) -> Unit): ReadWriteSocket {
2021
selectorManager = SelectorManager(Dispatchers.IO)
2122
val builder = aSocket(selectorManager).tcp().connect(
2223
remoteAddress = InetSocketAddress(host, port),
2324
configure = { if (!secured) socketTimeout = timeout }
2425
)
2526
return if (secured) {
26-
builder.tls(Dispatchers.IO) {
27+
val tlsContext = CoroutineExceptionHandler { _, throwable ->
28+
error(throwable)
29+
}
30+
builder.tls(tlsContext + Dispatchers.IO) {
2731
trustManager = certificate
2832
random = SecureRandom()
2933
}

common/src/main/java/com/pedro/common/socket/ktor/TcpStreamSocketKtorBase.kt

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import io.ktor.utils.io.readLine
1313
import io.ktor.utils.io.writeByte
1414
import io.ktor.utils.io.writeFully
1515
import kotlinx.coroutines.Dispatchers
16+
import kotlinx.coroutines.runBlocking
17+
import kotlinx.io.IOException
1618
import java.net.InetAddress
1719

1820
abstract class TcpStreamSocketKtorBase(
@@ -26,10 +28,12 @@ abstract class TcpStreamSocketKtorBase(
2628
protected var output: ByteWriteChannel? = null
2729
protected var selectorManager = SelectorManager(Dispatchers.IO)
2830

29-
abstract suspend fun onConnectSocket(timeout: Long): ReadWriteSocket
31+
abstract suspend fun onConnectSocket(timeout: Long, error: (Throwable) -> Unit): ReadWriteSocket
3032

3133
override suspend fun connect() {
32-
val socket = onConnectSocket(timeout)
34+
val socket = onConnectSocket(timeout) {
35+
runBlocking { close() }
36+
}
3337
input = socket.openReadChannel()
3438
output = socket.openWriteChannel(autoFlush = false)
3539
address = java.net.InetSocketAddress(host, port).address
@@ -48,23 +52,23 @@ abstract class TcpStreamSocketKtorBase(
4852
}
4953

5054
override suspend fun write(bytes: ByteArray) {
51-
output?.writeFully(bytes)
55+
output?.writeFully(bytes) ?: throw IOException("Socket already closed")
5256
}
5357

5458
override suspend fun write(bytes: ByteArray, offset: Int, size: Int) {
55-
output?.writeFully(bytes, offset, offset + size)
59+
output?.writeFully(bytes, offset, offset + size) ?: throw IOException("Socket already closed")
5660
}
5761

5862
override suspend fun write(b: Int) {
59-
output?.writeByte(b.toByte())
63+
output?.writeByte(b.toByte()) ?: throw IOException("Socket already closed")
6064
}
6165

6266
override suspend fun write(string: String) {
6367
write(string.toByteArray())
6468
}
6569

6670
override suspend fun flush() {
67-
output?.flush()
71+
output?.flush() ?: throw IOException("Socket already closed")
6872
}
6973

7074
override suspend fun read(bytes: ByteArray) {

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ dokka = "2.2.0"
99
appcompat = "1.6.1"
1010
#noinspection GradleDependency, version 2.2.0 need min sdk 21
1111
constraintlayout = "2.1.4"
12-
ktor = "3.4.3"
12+
ktor = "3.5.0"
1313
camerax = "1.5.3"
1414
multidex = "2.0.1"
1515
annotation = "1.10.0"

0 commit comments

Comments
 (0)