Skip to content

Commit

Permalink
Introduce toString(Charset) in FastByteArrayOutputStream
Browse files Browse the repository at this point in the history
This commit introduces a toString() overload in
FastByteArrayOutputStream that accepts a Charset in order to mirror the
method that was introduced in ByteArrayOutputStream in JDK 10,
including a special case for when a single buffer is in use internally
to avoid the need to resize.

This commit also updates getContentAsString() in
ContentCachingRequestWrapper to use this new toString(Charset) method.

Closes gh-31737
  • Loading branch information
kilink authored and sbrannen committed Dec 2, 2023
1 parent 0bec812 commit 7cdacf3
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.util.ArrayDeque;
import java.util.Deque;
Expand Down Expand Up @@ -162,9 +163,26 @@ public void close() {
*/
@Override
public String toString() {
return new String(toByteArrayUnsafe());
return toString(Charset.defaultCharset());
}

/**
* Converts the buffer's contents into a string by decoding the bytes using
* the specified {@link java.nio.charset.Charset charset}.
*
* @param charset the {@linkplain java.nio.charset.Charset charset}
* to be used to decode the {@code bytes}
* @return a String decoded from the buffer's contents
*/
public String toString(Charset charset) {
if (size() == 0) {
return "";
}
if (buffers.size() == 1) {
return new String(buffers.getFirst(), 0, index, charset);
}
return new String(toByteArrayUnsafe(), charset);
}

// Custom methods

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,24 @@ void resize() throws Exception {
assertThat(this.os.size()).isEqualTo(sizeBefore);
}

@Test
void stringConversion() throws Exception {
this.os.write(this.helloBytes);
assertThat(this.os.toString()).isEqualTo("Hello World");
assertThat(this.os.toString(StandardCharsets.UTF_8)).isEqualTo("Hello World");

FastByteArrayOutputStream empty = new FastByteArrayOutputStream();
assertThat(empty.toString()).isEqualTo("");
assertThat(empty.toString(StandardCharsets.US_ASCII)).isEqualTo("");

FastByteArrayOutputStream outputStream = new FastByteArrayOutputStream(5);
// Add bytes in multiple writes to ensure we get more than one buffer internally
outputStream.write(this.helloBytes, 0, 5);
outputStream.write(this.helloBytes, 5, 6);
assertThat(outputStream.toString(StandardCharsets.UTF_8)).isEqualTo("Hello World");
assertThat(outputStream.toString()).isEqualTo("Hello World");
}

@Test
void autoGrow() throws IOException {
this.os.resize(1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ public byte[] getContentAsByteArray() {
* @see #getContentAsByteArray()
*/
public String getContentAsString() {
return new String(this.cachedContent.toByteArrayUnsafe(), Charset.forName(getCharacterEncoding()));
return this.cachedContent.toString(Charset.forName(getCharacterEncoding()));
}

/**
Expand Down

0 comments on commit 7cdacf3

Please sign in to comment.