From 1af7108c13f3e7140ee3af23c2389447bb3d8910 Mon Sep 17 00:00:00 2001 From: Gus Narea Date: Wed, 30 Sep 2020 10:28:06 +0100 Subject: [PATCH 1/2] Try retryOnConnectionFailure(true) --- src/main/kotlin/tech/relaycorp/poweb/PoWebClient.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/tech/relaycorp/poweb/PoWebClient.kt b/src/main/kotlin/tech/relaycorp/poweb/PoWebClient.kt index de3846b..775131d 100644 --- a/src/main/kotlin/tech/relaycorp/poweb/PoWebClient.kt +++ b/src/main/kotlin/tech/relaycorp/poweb/PoWebClient.kt @@ -24,6 +24,7 @@ import kotlinx.coroutines.channels.ClosedReceiveChannelException import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.FlowCollector import kotlinx.coroutines.flow.flow +import okhttp3.OkHttpClient import tech.relaycorp.poweb.handshake.Challenge import tech.relaycorp.poweb.handshake.InvalidChallengeException import tech.relaycorp.poweb.handshake.Response @@ -55,7 +56,9 @@ public class PoWebClient internal constructor( internal val hostName: String, internal val port: Int, internal val useTls: Boolean, - ktorEngine: HttpClientEngine = OkHttp.create {} + ktorEngine: HttpClientEngine = OkHttp.create { + preconfigured = OkHttpClient.Builder().retryOnConnectionFailure(true).build() + } ) : Closeable { internal var ktorClient = HttpClient(ktorEngine) { install(WebSockets) From b4c4d42481590ed8bef6d33f1bda613eac733037 Mon Sep 17 00:00:00 2001 From: Gus Narea Date: Wed, 30 Sep 2020 11:26:42 +0100 Subject: [PATCH 2/2] Add comment --- src/main/kotlin/tech/relaycorp/poweb/PoWebClient.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/kotlin/tech/relaycorp/poweb/PoWebClient.kt b/src/main/kotlin/tech/relaycorp/poweb/PoWebClient.kt index 0d8a90a..91fab7b 100644 --- a/src/main/kotlin/tech/relaycorp/poweb/PoWebClient.kt +++ b/src/main/kotlin/tech/relaycorp/poweb/PoWebClient.kt @@ -57,6 +57,11 @@ public class PoWebClient internal constructor( internal val port: Int, internal val useTls: Boolean, ktorEngine: HttpClientEngine = OkHttp.create { + // By default, OkHTTP would throw an IOException when an illegal HTTP response is returned. + // Enabling retryOnConnectionFailure would treat that as a connection failure and try again, + // throwing a java.net.ConnectException if it still fails -- And ConnectException is a + // more reliable exception to handle when something like this goes wrong. See: + // https://github.com/relaycorp/relaynet-poweb-jvm/issues/61 preconfigured = OkHttpClient.Builder().retryOnConnectionFailure(true).build() } ) : Closeable {