From a33e73ba2ff906b8570ed48d420256f09f90fff1 Mon Sep 17 00:00:00 2001 From: "a.emogurov" Date: Mon, 19 Jan 2026 17:18:01 +0400 Subject: [PATCH 1/3] fix: make DebugStage optional --- .../debug/plugin/servers/ServersPlugin.kt | 4 ++-- .../servers/data/DebugStageRepository.kt | 6 +++--- .../plugin/servers/data/model/DebugStage.kt | 19 +++++++++++++++-- .../interceptor/DebugStageInterceptor.kt | 21 ++++++++++++------- 4 files changed, 35 insertions(+), 15 deletions(-) diff --git a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/ServersPlugin.kt b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/ServersPlugin.kt index a81730fb..19f8145c 100644 --- a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/ServersPlugin.kt +++ b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/ServersPlugin.kt @@ -35,11 +35,11 @@ public class ServersPlugin( return getPlugin().getContainer().serversRepository.getDefault() } - public fun getSelectedStage(): DebugStage { + public fun getSelectedStage(): DebugStage? { return getPlugin().getContainer().stagesRepository.getSelectedStage() } - public fun getDefaultStage(): DebugStage { + public fun getDefaultStage(): DebugStage? { return getPlugin().getContainer().stagesRepository.getDefault() } } diff --git a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/DebugStageRepository.kt b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/DebugStageRepository.kt index 20161c41..21474eb0 100644 --- a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/DebugStageRepository.kt +++ b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/DebugStageRepository.kt @@ -34,7 +34,7 @@ internal class DebugStageRepository( } } - fun getSelectedStage(): DebugStage { + fun getSelectedStage(): DebugStage? { val stageName = sharedPreferences.getString(SELECTED_STAGE_NAME, null) val hostsHash = sharedPreferences.getInt(SELECTED_STAGE_HOSTS_HASH, -1) @@ -48,8 +48,8 @@ internal class DebugStageRepository( } } - fun getDefault(): DebugStage { - return preInstalledStages.first { it.isDefault } + fun getDefault(): DebugStage? { + return preInstalledStages.firstOrNull { it.isDefault } } suspend fun getStages(): List { diff --git a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/model/DebugStage.kt b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/model/DebugStage.kt index d8335758..b8957a71 100644 --- a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/model/DebugStage.kt +++ b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/model/DebugStage.kt @@ -17,7 +17,22 @@ public data class DebugStage( } override fun equals(other: Any?): Boolean { - val otherServer = other as DebugStage - return this.hosts.size == otherServer.hosts.size && this.hosts == otherServer.hosts + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as DebugStage + + if (name != other.name) return false + if (hosts != other.hosts) return false + if (isDefault != other.isDefault) return false + + return true + } + + override fun hashCode(): Int { + var result = name.hashCode() + result = 31 * result + hosts.hashCode() + result = 31 * result + isDefault.hashCode() + return result } } diff --git a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/interceptor/DebugStageInterceptor.kt b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/interceptor/DebugStageInterceptor.kt index 36ec20e8..0b297865 100644 --- a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/interceptor/DebugStageInterceptor.kt +++ b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/interceptor/DebugStageInterceptor.kt @@ -33,14 +33,19 @@ public class DebugStageInterceptor(private val hostName: String) : Interceptor { var request = chain.request() return if (DebugPanel.isInitialized) { val debugStage = stageRepository.getSelectedStage() - val host = debugStage.hosts[hostName] - if (host != null) { - val newUrl = request.getNewUrl(host) - request = request.newBuilder() - .url(newUrl) - .build() - } - chain.proceed(requestModifier?.invoke(request, debugStage) ?: request) + val modifiedRequest = debugStage?.let { stage -> + val host = stage.hosts[hostName] + if (host != null) { + val newUrl = request.getNewUrl(host) + request = request.newBuilder() + .url(newUrl) + .build() + } + + requestModifier?.invoke(request, stage) + } ?: request + + chain.proceed(modifiedRequest) } else { chain.proceed(request) } From c634a5a419fae953f76301e10d03cf3d713adc8e Mon Sep 17 00:00:00 2001 From: "a.emogurov" Date: Mon, 19 Jan 2026 17:19:33 +0400 Subject: [PATCH 2/3] sample: replace stage with server interceptor --- .../debug_data/DebugServersProvider.kt | 18 ------------- .../debug_sample/network/ApiFactory.kt | 27 ++++--------------- 2 files changed, 5 insertions(+), 40 deletions(-) diff --git a/sample/src/debug/kotlin/com/redmadrobot/debug_sample/debug_data/DebugServersProvider.kt b/sample/src/debug/kotlin/com/redmadrobot/debug_sample/debug_data/DebugServersProvider.kt index e3517fad..5de4470f 100644 --- a/sample/src/debug/kotlin/com/redmadrobot/debug_sample/debug_data/DebugServersProvider.kt +++ b/sample/src/debug/kotlin/com/redmadrobot/debug_sample/debug_data/DebugServersProvider.kt @@ -2,7 +2,6 @@ package com.redmadrobot.debug_sample.debug_data import com.redmadrobot.debug.plugin.servers.data.model.DebugServer import com.redmadrobot.debug.plugin.servers.data.model.DebugServerData -import com.redmadrobot.debug.plugin.servers.data.model.DebugStage class DebugServersProvider { @@ -22,23 +21,6 @@ class DebugServersProvider { DebugServer( name = "debug 4", url = "https://testserver4.com" ), - DebugStage( - name = "debug stage 1", - hosts = mapOf( - "main" to "https://testserver1main.com", - "s3" to "https://testserver1s3.com", - "wss" to "https://testserver1wss.com" - ), - isDefault = true - ), - DebugStage( - name = "debug stage 2", - hosts = mapOf( - "main" to "https://testserver2main.com", - "s3" to "https://testserver2s3.com", - "wss" to "https://testserver2wss.com" - ) - ), ) } } diff --git a/sample/src/main/kotlin/com/redmadrobot/debug_sample/network/ApiFactory.kt b/sample/src/main/kotlin/com/redmadrobot/debug_sample/network/ApiFactory.kt index b127dc7f..c595dcc7 100644 --- a/sample/src/main/kotlin/com/redmadrobot/debug_sample/network/ApiFactory.kt +++ b/sample/src/main/kotlin/com/redmadrobot/debug_sample/network/ApiFactory.kt @@ -1,17 +1,11 @@ package com.redmadrobot.debug_sample.network -import com.redmadrobot.debug.plugin.servers.interceptor.DebugStageInterceptor +import com.redmadrobot.debug.plugin.servers.interceptor.DebugServerInterceptor import okhttp3.Interceptor import okhttp3.OkHttpClient -import okhttp3.Response import retrofit2.Retrofit -import java.net.HttpURLConnection -import java.net.URL -import java.net.URLConnection -import java.net.URLStreamHandler object ApiFactory { - fun getSampleApi(onCalled: (String) -> Unit): SampleApi { val retrofit = Retrofit.Builder() .baseUrl("https://jsonplaceholder.typicode.com/") @@ -22,25 +16,14 @@ object ApiFactory { } private fun getSampleClient(onCalled: (String) -> Unit): OkHttpClient { - return OkHttpClient.Builder() + .addInterceptor(interceptor = DebugServerInterceptor()) .addInterceptor( - DebugStageInterceptor("s3").modifyRequest { request, server -> - if (server.name == "Test") { - request.newBuilder() - .addHeader("Authorization", "testToken") - .build() - } else { - request - } - } - ) - .addInterceptor(object : Interceptor { - override fun intercept(chain: Interceptor.Chain): Response { + interceptor = Interceptor { chain -> onCalled.invoke(chain.request().url.toString()) - return chain.proceed(chain.request()) + chain.proceed(chain.request()) } - }) + ) .build() } } From 2dc7c1a84a63ca26bb3bbe728a6f4b53b0850e63 Mon Sep 17 00:00:00 2001 From: "a.emogurov" Date: Wed, 21 Jan 2026 13:51:02 +0400 Subject: [PATCH 3/3] review: fixes & improves --- .../plugin/servers/data/model/DebugStage.kt | 19 +-------- .../interceptor/DebugStageInterceptor.kt | 39 ++++++++++--------- .../debug_data/DebugServersProvider.kt | 10 +++++ 3 files changed, 33 insertions(+), 35 deletions(-) diff --git a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/model/DebugStage.kt b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/model/DebugStage.kt index b8957a71..d8335758 100644 --- a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/model/DebugStage.kt +++ b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/model/DebugStage.kt @@ -17,22 +17,7 @@ public data class DebugStage( } override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as DebugStage - - if (name != other.name) return false - if (hosts != other.hosts) return false - if (isDefault != other.isDefault) return false - - return true - } - - override fun hashCode(): Int { - var result = name.hashCode() - result = 31 * result + hosts.hashCode() - result = 31 * result + isDefault.hashCode() - return result + val otherServer = other as DebugStage + return this.hosts.size == otherServer.hosts.size && this.hosts == otherServer.hosts } } diff --git a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/interceptor/DebugStageInterceptor.kt b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/interceptor/DebugStageInterceptor.kt index 0b297865..ae859e57 100644 --- a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/interceptor/DebugStageInterceptor.kt +++ b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/interceptor/DebugStageInterceptor.kt @@ -30,25 +30,28 @@ public class DebugStageInterceptor(private val hostName: String) : Interceptor { } override fun intercept(chain: Interceptor.Chain): Response { - var request = chain.request() - return if (DebugPanel.isInitialized) { - val debugStage = stageRepository.getSelectedStage() - val modifiedRequest = debugStage?.let { stage -> - val host = stage.hosts[hostName] - if (host != null) { - val newUrl = request.getNewUrl(host) - request = request.newBuilder() - .url(newUrl) - .build() - } - - requestModifier?.invoke(request, stage) - } ?: request - - chain.proceed(modifiedRequest) - } else { - chain.proceed(request) + val originalRequest = chain.request() + + if (!DebugPanel.isInitialized) { + return chain.proceed(originalRequest) + } + + val debugStage = stageRepository.getSelectedStage() + val host = debugStage?.hosts?.get(hostName) + var currentRequest = originalRequest + + if (host != null) { + val newUrl = originalRequest.getNewUrl(host) + if (newUrl != originalRequest.url) { + currentRequest = originalRequest.newBuilder().url(newUrl).build() + } } + + val modifiedRequest = debugStage?.let { stage -> + requestModifier?.invoke(currentRequest, stage) + } + + return chain.proceed(modifiedRequest ?: currentRequest) } diff --git a/sample/src/debug/kotlin/com/redmadrobot/debug_sample/debug_data/DebugServersProvider.kt b/sample/src/debug/kotlin/com/redmadrobot/debug_sample/debug_data/DebugServersProvider.kt index 5de4470f..27e9cb81 100644 --- a/sample/src/debug/kotlin/com/redmadrobot/debug_sample/debug_data/DebugServersProvider.kt +++ b/sample/src/debug/kotlin/com/redmadrobot/debug_sample/debug_data/DebugServersProvider.kt @@ -2,6 +2,7 @@ package com.redmadrobot.debug_sample.debug_data import com.redmadrobot.debug.plugin.servers.data.model.DebugServer import com.redmadrobot.debug.plugin.servers.data.model.DebugServerData +import com.redmadrobot.debug.plugin.servers.data.model.DebugStage class DebugServersProvider { @@ -21,6 +22,15 @@ class DebugServersProvider { DebugServer( name = "debug 4", url = "https://testserver4.com" ), + DebugStage( + name = "debug stage 1", + hosts = mapOf( + "main" to "https://testserver1main.com", + "s3" to "https://testserver1s3.com", + "wss" to "https://testserver1wss.com" + ), + isDefault = true + ), ) } }