From 2aa0f5a65185391dd9dfd5503bc5434b483c44a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Sautter?= Date: Fri, 10 May 2024 21:21:01 +0200 Subject: [PATCH] [java] read selenium manager output as UTF-8 #13653 --- .../openqa/selenium/io/CircularOutputStream.java | 10 +++++++--- .../openqa/selenium/manager/SeleniumManager.java | 3 ++- .../org/openqa/selenium/os/ExternalProcess.java | 14 +++++++++++++- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/java/src/org/openqa/selenium/io/CircularOutputStream.java b/java/src/org/openqa/selenium/io/CircularOutputStream.java index 6bf9284baa725..fa492a5b63922 100644 --- a/java/src/org/openqa/selenium/io/CircularOutputStream.java +++ b/java/src/org/openqa/selenium/io/CircularOutputStream.java @@ -85,19 +85,23 @@ public void close() { } @Override - public synchronized String toString() { + public String toString() { + return toString(Charset.defaultCharset()); + } + + public synchronized String toString(Charset encoding) { int size = filled ? buffer.length : end; byte[] toReturn = new byte[size]; // Handle the partially filled array as a special case if (!filled) { System.arraycopy(buffer, 0, toReturn, 0, end); - return new String(toReturn, Charset.defaultCharset()); + return new String(toReturn, encoding); } int n = buffer.length - end; System.arraycopy(buffer, end, toReturn, 0, n); System.arraycopy(buffer, 0, toReturn, n, end); - return new String(toReturn, Charset.defaultCharset()); + return new String(toReturn, encoding); } } diff --git a/java/src/org/openqa/selenium/manager/SeleniumManager.java b/java/src/org/openqa/selenium/manager/SeleniumManager.java index 04daa88acb256..1723b7c769cfc 100644 --- a/java/src/org/openqa/selenium/manager/SeleniumManager.java +++ b/java/src/org/openqa/selenium/manager/SeleniumManager.java @@ -23,6 +23,7 @@ import java.io.IOException; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -141,7 +142,7 @@ private static Result runCommand(Path binary, List arguments) { process.shutdown(); } code = process.exitValue(); - output = process.getOutput(); + output = process.getOutput(StandardCharsets.UTF_8); } catch (Exception e) { throw new WebDriverException("Failed to run command: " + arguments, e); } diff --git a/java/src/org/openqa/selenium/os/ExternalProcess.java b/java/src/org/openqa/selenium/os/ExternalProcess.java index 2f6e53f591fc3..b9c05f441a347 100644 --- a/java/src/org/openqa/selenium/os/ExternalProcess.java +++ b/java/src/org/openqa/selenium/os/ExternalProcess.java @@ -24,6 +24,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.io.UncheckedIOException; +import java.nio.charset.Charset; import java.time.Duration; import java.util.ArrayList; import java.util.Collections; @@ -254,7 +255,18 @@ public ExternalProcess(Process process, CircularOutputStream outputStream, Threa * @return stdout and stderr as String in Charset.defaultCharset() encoding */ public String getOutput() { - return outputStream.toString(); + return getOutput(Charset.defaultCharset()); + } + + /** + * The last N bytes of the combined stdout and stderr as String, the value of N is set while + * building the OsProcess. + * + * @param encoding the encoding to decode the stream + * @return stdout and stderr as String in the given encoding + */ + public String getOutput(Charset encoding) { + return outputStream.toString(encoding); } public boolean isAlive() {