From ce3ad4c1c7877709bcaa73ac01ea62e6258c8b44 Mon Sep 17 00:00:00 2001 From: Jason Date: Mon, 10 Nov 2025 23:52:32 -0800 Subject: [PATCH] fix(kobo): prevent double URL encoding when proxying Closes: #2130 --- .../komga/infrastructure/kobo/KoboProxy.kt | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/kobo/KoboProxy.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/kobo/KoboProxy.kt index 6aa3da1a3..2a35c9116 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/kobo/KoboProxy.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/kobo/KoboProxy.kt @@ -18,6 +18,7 @@ import org.springframework.util.LinkedMultiValueMap import org.springframework.web.client.RestClient import org.springframework.web.client.toEntity import org.springframework.web.server.ResponseStatusException +import org.springframework.web.util.DefaultUriBuilderFactory import kotlin.time.Duration.Companion.minutes import kotlin.time.toJavaDuration @@ -29,18 +30,26 @@ class KoboProxy( private val komgaSyncTokenGenerator: KomgaSyncTokenGenerator, private val komgaSettingsProvider: KomgaSettingsProvider, ) { - private val koboApiClient = - RestClient - .builder() - .baseUrl("https://storeapi.kobo.com") - .requestFactory( - ClientHttpRequestFactoryBuilder.reactor().build( - ClientHttpRequestFactorySettings - .defaults() - .withReadTimeout(1.minutes.toJavaDuration()) - .withConnectTimeout(1.minutes.toJavaDuration()), - ), - ).build() + private val koboApiClient: RestClient + + init { + val uriBuilderFactory = DefaultUriBuilderFactory("https://storeapi.kobo.com") + uriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE) + + koboApiClient = + RestClient + .builder() + .uriBuilderFactory( + uriBuilderFactory, + ).requestFactory( + ClientHttpRequestFactoryBuilder.reactor().build( + ClientHttpRequestFactorySettings + .defaults() + .withReadTimeout(1.minutes.toJavaDuration()) + .withConnectTimeout(1.minutes.toJavaDuration()), + ), + ).build() + } private val pathRegex = """\/kobo\/[-\w]*(.*)""".toRegex()