From 1c6a044c376fe6efc79643d4261075ade1f9f8dc Mon Sep 17 00:00:00 2001 From: admin Date: Sun, 12 Jul 2026 21:55:01 +0200 Subject: [PATCH] Dodaj Origin dla WebSocket Reverb --- .../kierowca/sync/DriverLiveSyncClient.kt | 20 ++++++++++++++++++- .../kierowca/sync/DriverLiveSyncClientTest.kt | 7 +++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/pl/firmatpp/kierowca/sync/DriverLiveSyncClient.kt b/app/src/main/java/pl/firmatpp/kierowca/sync/DriverLiveSyncClient.kt index ac50043..ccd03b4 100644 --- a/app/src/main/java/pl/firmatpp/kierowca/sync/DriverLiveSyncClient.kt +++ b/app/src/main/java/pl/firmatpp/kierowca/sync/DriverLiveSyncClient.kt @@ -3,6 +3,7 @@ package pl.firmatpp.kierowca.sync import com.google.gson.Gson import com.google.gson.JsonObject import com.google.gson.JsonParser +import java.net.URI import java.util.concurrent.TimeUnit import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -49,9 +50,26 @@ class OkHttpLiveWebSocketFactory( private val client: OkHttpClient, ) : LiveWebSocketFactory { override fun newWebSocket(url: String, listener: WebSocketListener): WebSocket = - client.newWebSocket(Request.Builder().url(url).build(), listener) + client.newWebSocket( + Request.Builder() + .url(url) + .header("Origin", websocketOrigin(url)) + .build(), + listener, + ) } +internal fun websocketOrigin(url: String): String = + URI( + url + .replaceFirst("wss://", "https://") + .replaceFirst("ws://", "http://") + ).let { uri -> + val defaultPort = (uri.scheme == "https" && uri.port == 443) || (uri.scheme == "http" && uri.port == 80) + val port = if (uri.port > 0 && !defaultPort) ":${uri.port}" else "" + "${uri.scheme}://${uri.host}$port" + } + enum class LiveSyncConnectionState { Stopped, WaitingForNetwork, diff --git a/app/src/test/java/pl/firmatpp/kierowca/sync/DriverLiveSyncClientTest.kt b/app/src/test/java/pl/firmatpp/kierowca/sync/DriverLiveSyncClientTest.kt index 8b15a85..c4544f0 100644 --- a/app/src/test/java/pl/firmatpp/kierowca/sync/DriverLiveSyncClientTest.kt +++ b/app/src/test/java/pl/firmatpp/kierowca/sync/DriverLiveSyncClientTest.kt @@ -25,6 +25,13 @@ class DriverLiveSyncClientTest { reverbWsBaseUrl = "wss://example.test/app", ) + @Test + fun derivesBrowserCompatibleOriginFromWebSocketUrl() { + assertEquals("https://api-intranet.firmatpp.pl", websocketOrigin("wss://api-intranet.firmatpp.pl/ws/app/app-key")) + assertEquals("https://example.test:8443", websocketOrigin("wss://example.test:8443/app/app-key")) + assertEquals("http://localhost:8080", websocketOrigin("ws://localhost:8080/app/app-key")) + } + @Test fun reconnectsWithBackoffAfterSocketFailure() = runTest { val factory = FakeWebSocketFactory()