From 8af955ce201482b49e1cc4a8b163902b70779bce Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 4 Aug 2025 18:18:39 -0400 Subject: [PATCH] Adds an extra layer on the url normalization cache to avoid recomputing failed attempts before. --- .../relay/normalizer/RelayUrlNormalizer.kt | 30 +++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/relay/normalizer/RelayUrlNormalizer.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/relay/normalizer/RelayUrlNormalizer.kt index 11b8c67b3..8a74e2cde 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/relay/normalizer/RelayUrlNormalizer.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/relay/normalizer/RelayUrlNormalizer.kt @@ -24,9 +24,18 @@ import android.util.Log import androidx.collection.LruCache import kotlinx.coroutines.CancellationException import org.czeal.rfc3986.URIReference +import java.lang.IllegalArgumentException import kotlin.contracts.ExperimentalContracts -val normalizedUrls = LruCache(5000) +sealed interface NormalizationResult { + class Sucess( + val url: NormalizedRelayUrl, + ) : NormalizationResult + + object Error : NormalizationResult +} + +val normalizedUrls = LruCache(5000) class RelayUrlNormalizer { companion object { @@ -141,12 +150,17 @@ class RelayUrlNormalizer { } fun normalize(url: String): NormalizedRelayUrl { - normalizedUrls[url]?.let { return it } + normalizedUrls[url]?.let { + return when (it) { + is NormalizationResult.Sucess -> it.url + else -> throw IllegalArgumentException("Invalid Url: $url") + } + } return try { val fixed = fix(url) ?: return NormalizedRelayUrl(url) val normalized = norm(fixed) - normalizedUrls.put(url, normalized) + normalizedUrls.put(url, NormalizationResult.Sucess(normalized)) normalized } catch (e: Exception) { NormalizedRelayUrl(url) @@ -155,16 +169,22 @@ class RelayUrlNormalizer { fun normalizeOrNull(url: String): NormalizedRelayUrl? { if (url.isEmpty()) return null - normalizedUrls[url]?.let { return it } + normalizedUrls[url]?.let { + return when (it) { + is NormalizationResult.Sucess -> it.url + else -> null + } + } return try { val fixed = fix(url) if (fixed != null) { val normalized = norm(fixed) - normalizedUrls.put(url, normalized) + normalizedUrls.put(url, NormalizationResult.Sucess(normalized)) return normalized } else { Log.w("NormalizedRelayUrl", "Rejected Error $url") + normalizedUrls.put(url, NormalizationResult.Error) null } } catch (e: Exception) {