diff --git a/java/src/org/openqa/selenium/remote/http/jdk/JdkHttpClient.java b/java/src/org/openqa/selenium/remote/http/jdk/JdkHttpClient.java index d83c2f48af8ea..2567ef133dc70 100644 --- a/java/src/org/openqa/selenium/remote/http/jdk/JdkHttpClient.java +++ b/java/src/org/openqa/selenium/remote/http/jdk/JdkHttpClient.java @@ -201,7 +201,7 @@ public void close() { } private URI getWebSocketUri(HttpRequest request) { - URI uri = messages.createRequest(request).uri(); + URI uri = messages.getRawURI(request); if ("http".equalsIgnoreCase(uri.getScheme())) { try { uri = new URI("ws", uri.getUserInfo(), uri.getHost(), uri.getPort(), uri.getPath(), uri.getQuery(), uri.getFragment()); 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 7dbba59dd802f..48c8139043d2c 100644 --- a/java/src/org/openqa/selenium/remote/http/jdk/JdkHttpMessages.java +++ b/java/src/org/openqa/selenium/remote/http/jdk/JdkHttpMessages.java @@ -19,11 +19,14 @@ import org.openqa.selenium.remote.http.AddSeleniumUserAgent; import org.openqa.selenium.remote.http.ClientConfig; +import org.openqa.selenium.remote.http.Contents; +import org.openqa.selenium.remote.http.HttpMethod; import org.openqa.selenium.remote.http.HttpRequest; import org.openqa.selenium.remote.http.HttpResponse; import java.io.InputStream; import java.net.URI; +import java.net.URL; import java.net.URLEncoder; import java.net.http.HttpRequest.BodyPublishers; import java.util.Objects; @@ -68,11 +71,12 @@ public java.net.http.HttpRequest createRequest(HttpRequest req) { break; case POST: - builder = builder.POST(BodyPublishers.ofInputStream(req.getContent())); - break; + // Copy the content into a byte array to avoid reading the content inputstream multiple times. + builder = builder.POST(BodyPublishers.ofByteArray(Contents.bytes(req.getContent()))); + break; case PUT: - builder = builder.PUT(BodyPublishers.ofInputStream(req.getContent())); + builder = builder.PUT(BodyPublishers.ofByteArray(Contents.bytes(req.getContent()))); break; default: @@ -80,6 +84,11 @@ public java.net.http.HttpRequest createRequest(HttpRequest req) { } for (String name : req.getHeaderNames()) { + // Avoid explicitly setting content-length + // This prevents the IllegalArgumentException that states 'restricted header name: "Content-Length"' + if (name.equals("Content-Length")) { + continue; + } for (String value : req.getHeaders(name)) { builder = builder.header(name, value); } @@ -106,6 +115,11 @@ private String getRawUrl(URI baseUrl, String uri) { return rawUrl; } + public URI getRawURI(HttpRequest req) { + String rawUrl = getRawUrl(config.baseUri(), req.getUri()); + return URI.create(rawUrl); + } + public HttpResponse createResponse(java.net.http.HttpResponse response) { HttpResponse res = new HttpResponse(); res.setStatus(response.statusCode());