From ed40d149f6f9a9eba0aa8cfcd831f89e6b1b969e Mon Sep 17 00:00:00 2001 From: Vladyslav Aviedov Date: Sun, 23 Jun 2024 15:24:05 -0400 Subject: [PATCH] improve uri parsing --- .../org/javacs/kt/externalsources/KlsURI.kt | 2 +- .../src/main/kotlin/org/javacs/kt/util/URIs.kt | 16 +++++++++++++++- .../src/test/kotlin/org/javacs/kt/URIsTest.kt | 18 ++++++++++++++---- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/server/src/main/kotlin/org/javacs/kt/externalsources/KlsURI.kt b/server/src/main/kotlin/org/javacs/kt/externalsources/KlsURI.kt index 9368fc6e7..0e9ab9a3d 100644 --- a/server/src/main/kotlin/org/javacs/kt/externalsources/KlsURI.kt +++ b/server/src/main/kotlin/org/javacs/kt/externalsources/KlsURI.kt @@ -14,7 +14,7 @@ import java.nio.file.Paths import java.util.zip.ZipFile fun URI.toKlsURI(): KlsURI? = when (scheme) { - "kls" -> KlsURI(URI("kls:${schemeSpecificPart.replace(" ", "%20")}")) + "kls" -> KlsURI(URI("kls:${schemeSpecificPart}")) "file" -> KlsURI(URI("kls:$this")) else -> null } diff --git a/shared/src/main/kotlin/org/javacs/kt/util/URIs.kt b/shared/src/main/kotlin/org/javacs/kt/util/URIs.kt index 2a0aac6ae..6935baa79 100644 --- a/shared/src/main/kotlin/org/javacs/kt/util/URIs.kt +++ b/shared/src/main/kotlin/org/javacs/kt/util/URIs.kt @@ -1,6 +1,7 @@ package org.javacs.kt.util import java.net.URI +import java.net.URLEncoder import java.net.URLDecoder import java.nio.charset.StandardCharsets import java.nio.file.Path @@ -12,7 +13,20 @@ import java.nio.file.Paths * (including VSCode) invalidly percent-encode colons. */ fun parseURI(uri: String): URI = - URI.create(runCatching { URLDecoder.decode(uri, StandardCharsets.UTF_8.toString()).replace(" ", "%20") }.getOrDefault(uri)) + URI.create(runCatching { + // val decoded = URLDecoder.decode(uri, StandardCharsets.UTF_8) + + // Don't encode the protocol + val protocol = uri.substring(0, uri.indexOf('/')) + val path = uri.substringAfter('/') + + val parts = path.split("/") + val encodedParts = parts.map { URLEncoder.encode(it, StandardCharsets.UTF_8) } + val encoded = protocol + '/' + encodedParts.joinToString(separator = "/") + + // URLEncoder uses '+' instead of '%20' fpr spaces + encoded.replace("+", "%20") + }.getOrDefault(uri)) val URI.filePath: Path? get() = runCatching { Paths.get(this) }.getOrNull() diff --git a/shared/src/test/kotlin/org/javacs/kt/URIsTest.kt b/shared/src/test/kotlin/org/javacs/kt/URIsTest.kt index 804596d9e..49ef13058 100644 --- a/shared/src/test/kotlin/org/javacs/kt/URIsTest.kt +++ b/shared/src/test/kotlin/org/javacs/kt/URIsTest.kt @@ -19,13 +19,23 @@ class URIsTest { ) assertEquals( - URI.create("file:/home/ws%201"), - parseURI("file:///home/ws%201") + URI.create("/home/ws%2B1"), + parseURI("/home/ws+1") ) assertEquals( - URI.create("file:/home/ws%201"), - parseURI("file%3A%2F%2F%2Fhome%2Fws%201") + URI.create("file:/home/ws%2B1"), + parseURI("file:///home/ws+1") ) + + // assertEquals( + // URI.create("file:/home/ws%201"), + // parseURI("file:///home/ws%201") + // ) + + // assertEquals( + // URI.create("file:/home/ws%201"), + // parseURI("file%3A%2F%2F%2Fhome%2Fws%201") + // ) } }