diff --git a/spring-core/src/main/java/org/springframework/core/io/buffer/DefaultDataBuffer.java b/spring-core/src/main/java/org/springframework/core/io/buffer/DefaultDataBuffer.java index 16f14a43ada..c9d5e57d4d8 100644 --- a/spring-core/src/main/java/org/springframework/core/io/buffer/DefaultDataBuffer.java +++ b/spring-core/src/main/java/org/springframework/core/io/buffer/DefaultDataBuffer.java @@ -272,10 +272,13 @@ public class DefaultDataBuffer implements DataBuffer { ByteBuffer.allocate(minCapacity)); // Explicit cast for compatibility with covariant return type on JDK 9's ByteBuffer - ((Buffer) oldBuffer).position(this.readPosition); + final int remaining = readableByteCount(); + ((Buffer) oldBuffer).position(this.readPosition).limit(this.writePosition); newBuffer.put(oldBuffer); this.byteBuffer = newBuffer; + this.readPosition = 0; + this.writePosition = remaining; oldBuffer.clear(); } diff --git a/spring-core/src/test/java/org/springframework/core/io/buffer/DataBufferTests.java b/spring-core/src/test/java/org/springframework/core/io/buffer/DataBufferTests.java index 05c68e5d4eb..8f0bbfd487c 100644 --- a/spring-core/src/test/java/org/springframework/core/io/buffer/DataBufferTests.java +++ b/spring-core/src/test/java/org/springframework/core/io/buffer/DataBufferTests.java @@ -20,6 +20,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import org.junit.Test; @@ -266,4 +267,20 @@ public class DataBufferTests extends AbstractDataBufferAllocatingTestCase { } + @Test + public void growDataBuffer() { + DataBuffer buffer = stringBuffer("Hello World!"); + + byte[] bytes = new byte[5]; + buffer.read(bytes); + assertArrayEquals("Hello".getBytes(StandardCharsets.UTF_8), bytes); + + buffer.write("!!".getBytes(StandardCharsets.UTF_8)); + + bytes = new byte[9]; + buffer.read(bytes); + assertArrayEquals(" World!!!".getBytes(StandardCharsets.UTF_8), bytes); + } + + } \ No newline at end of file