[java] remove let's guess URI encoding
diff --git a/java/src/org/openqa/selenium/remote/http/jdk/JdkHttpMessages.java b/java/src/org/openqa/selenium/remote/http/jdk/JdkHttpMessages.java index a5dc539..d0c3afa 100644 --- a/java/src/org/openqa/selenium/remote/http/jdk/JdkHttpMessages.java +++ b/java/src/org/openqa/selenium/remote/http/jdk/JdkHttpMessages.java
@@ -17,7 +17,6 @@ package org.openqa.selenium.remote.http.jdk; -import static java.nio.charset.StandardCharsets.UTF_8; import static org.openqa.selenium.remote.http.HttpHeader.UserAgent; import com.google.common.net.MediaType; @@ -43,8 +42,6 @@ class JdkHttpMessages { private final ClientConfig config; private static final List<String> IGNORE_HEADERS = List.of("content-length", "connection", "host"); - private static final String ALLOWED_IN_URI = "-._~!$&'()*+,;=:@/?%"; - private static final char[] HEX_DIGITS = "0123456789ABCDEF".toCharArray(); public JdkHttpMessages(ClientConfig config) { this.config = Objects.requireNonNull(config, "Client config"); @@ -138,52 +135,17 @@ public URI getRawUri(HttpRequest req) { throw new IllegalStateException( "Unable to resolve relative URI " + uri + ": base URI is not set in ClientConfig"); } - String path = quoteIllegalCharacters(uri); String base = baseUrl.toString(); if (base.endsWith("/")) { - rawUrl = base.substring(0, base.length() - 1) + path; + rawUrl = base.substring(0, base.length() - 1) + uri; } else { - rawUrl = base + path; + rawUrl = base + uri; } } return URI.create(rawUrl); } - /** - * The URI of a request may hold characters that {@link URI} refuses, most commonly a space in the - * name of a file to download from Grid. This happens because the server receiving the request - * decodes the path ("%20" becomes a literal space), and the decoded value is kept in the {@link - * HttpRequest} that is handed over to this client for proxying. Quote every character that is not - * allowed in a URI, and leave all the others untouched, so that URIs which were valid before are - * sent exactly as they were. - */ - private static String quoteIllegalCharacters(String uri) { - StringBuilder quoted = new StringBuilder(uri.length()); - for (int i = 0; i < uri.length(); ) { - int codePoint = uri.codePointAt(i); - i += Character.charCount(codePoint); - if (isAllowedInUri(codePoint)) { - quoted.appendCodePoint(codePoint); - continue; - } - for (byte b : new String(Character.toChars(codePoint)).getBytes(UTF_8)) { - quoted.append('%').append(HEX_DIGITS[(b >> 4) & 0xf]).append(HEX_DIGITS[b & 0xf]); - } - } - return quoted.toString(); - } - - private static boolean isAllowedInUri(int codePoint) { - if (codePoint >= 128) { - return false; - } - return (codePoint >= 'a' && codePoint <= 'z') - || (codePoint >= 'A' && codePoint <= 'Z') - || (codePoint >= '0' && codePoint <= '9') - || ALLOWED_IN_URI.indexOf(codePoint) >= 0; - } - public HttpResponse createResponse(java.net.http.HttpResponse<InputStream> response) { HttpResponse res = new HttpResponse(); res.setStatus(response.statusCode());
diff --git a/java/test/org/openqa/selenium/remote/internal/HttpClientTestBase.java b/java/test/org/openqa/selenium/remote/internal/HttpClientTestBase.java index 91a266e..a452d32 100644 --- a/java/test/org/openqa/selenium/remote/internal/HttpClientTestBase.java +++ b/java/test/org/openqa/selenium/remote/internal/HttpClientTestBase.java
@@ -320,37 +320,6 @@ public void shouldStopRequestOnCancel() throws InterruptedException { } } - @Test - void shouldSendRequestWithPathThatNeedsQuoting() { - // A proxied request holds the decoded path of the original request, which may contain - // characters that are not allowed in a URI, e.g. spaces in the name of a file downloaded - // from Grid. The client must quote them, and the server must decode them back. - String path = - "/session/772f83578930be5dce8f626ecf8ea935/se/files/attestation pour l'employeur.pdf"; - - HttpResponse response = - executeWithinServer( - new HttpRequest(GET, path), - req -> new HttpResponse().setContent(Contents.utf8String(req.getUri()))); - - assertThat(response.contentAsString()).isEqualTo(path); - } - - @Test - void shouldSendRequestWithPathThatNeedsQuotingForNonAsciiCharacters() { - // Same scenario as above, but for a file name that also holds non-ASCII characters, - // including one outside the Basic Multilingual Plane (a surrogate pair), to exercise the - // UTF-8 percent-encoding of a multi-byte code point rather than just a single ASCII byte. - String path = "/session/772f83578930be5dce8f626ecf8ea935/se/files/файл tähtedega 😀.pdf"; - - HttpResponse response = - executeWithinServer( - new HttpRequest(GET, path), - req -> new HttpResponse().setContent(Contents.utf8String(req.getUri()))); - - assertThat(response.contentAsString()).isEqualTo(path); - } - private HttpResponse getResponseWithHeaders(final Multimap<String, String> headers) { return executeWithinServer( new HttpRequest(GET, "/foo"),