diff --git a/jetty-core/jetty-http2/jetty-http2-client-transport/src/main/java/org/eclipse/jetty/http2/client/transport/internal/HttpReceiverOverHTTP2.java b/jetty-core/jetty-http2/jetty-http2-client-transport/src/main/java/org/eclipse/jetty/http2/client/transport/internal/HttpReceiverOverHTTP2.java index 7429fcfebaf..9854c07d4b0 100644 --- a/jetty-core/jetty-http2/jetty-http2-client-transport/src/main/java/org/eclipse/jetty/http2/client/transport/internal/HttpReceiverOverHTTP2.java +++ b/jetty-core/jetty-http2/jetty-http2-client-transport/src/main/java/org/eclipse/jetty/http2/client/transport/internal/HttpReceiverOverHTTP2.java @@ -14,6 +14,7 @@ package org.eclipse.jetty.http2.client.transport.internal; import java.io.IOException; +import java.nio.ByteBuffer; import java.util.List; import java.util.function.BiFunction; @@ -80,14 +81,21 @@ public Content.Chunk read(boolean fillInterestIfNeeded) return null; } DataFrame frame = data.frame(); - boolean terminal = !frame.getData().hasRemaining() && frame.isEndStream(); - if (terminal) + ByteBuffer buffer = frame.getData(); + if (!buffer.hasRemaining()) { data.release(); - responseSuccess(getHttpExchange(), null); - return Content.Chunk.EOF; + if (frame.isEndStream()) + { + responseSuccess(getHttpExchange(), null); + return Content.Chunk.EOF; + } + else + { + return Content.Chunk.EMPTY; + } } - return Content.Chunk.from(frame.getData(), terminal, data); + return Content.Chunk.from(buffer, frame.isEndStream(), data); } @Override diff --git a/jetty-core/jetty-http3/jetty-http3-client-transport/src/main/java/org/eclipse/jetty/http3/client/transport/internal/HttpReceiverOverHTTP3.java b/jetty-core/jetty-http3/jetty-http3-client-transport/src/main/java/org/eclipse/jetty/http3/client/transport/internal/HttpReceiverOverHTTP3.java index 73ef229d93e..b53c90d3838 100644 --- a/jetty-core/jetty-http3/jetty-http3-client-transport/src/main/java/org/eclipse/jetty/http3/client/transport/internal/HttpReceiverOverHTTP3.java +++ b/jetty-core/jetty-http3/jetty-http3-client-transport/src/main/java/org/eclipse/jetty/http3/client/transport/internal/HttpReceiverOverHTTP3.java @@ -64,14 +64,20 @@ public Content.Chunk read(boolean fillInterestIfNeeded) return null; } ByteBuffer byteBuffer = data.getByteBuffer(); - boolean terminal = !byteBuffer.hasRemaining() && data.isLast(); - if (terminal) + if (!byteBuffer.hasRemaining()) { data.release(); - responseSuccess(getHttpExchange(), null); - return Content.Chunk.EOF; + if (data.isLast()) + { + responseSuccess(getHttpExchange(), null); + return Content.Chunk.EOF; + } + else + { + return Content.Chunk.EMPTY; + } } - return Content.Chunk.from(byteBuffer, terminal, data); + return Content.Chunk.from(byteBuffer, data.isLast(), data); } @Override diff --git a/jetty-core/jetty-io/src/main/java/org/eclipse/jetty/io/content/ByteBufferContentSource.java b/jetty-core/jetty-io/src/main/java/org/eclipse/jetty/io/content/ByteBufferContentSource.java index 4686d9799ac..4cf897f85fb 100644 --- a/jetty-core/jetty-io/src/main/java/org/eclipse/jetty/io/content/ByteBufferContentSource.java +++ b/jetty-core/jetty-io/src/main/java/org/eclipse/jetty/io/content/ByteBufferContentSource.java @@ -78,8 +78,9 @@ public Content.Chunk read() if (last) terminated = Content.Chunk.EOF; } - boolean terminal = !buffer.hasRemaining() && last; - return terminal ? Content.Chunk.EOF : Content.Chunk.from(buffer, last); + if (!buffer.hasRemaining()) + return last ? Content.Chunk.EOF : Content.Chunk.EMPTY; + return Content.Chunk.from(buffer, last); } @Override diff --git a/jetty-core/jetty-io/src/main/java/org/eclipse/jetty/io/content/ChunksContentSource.java b/jetty-core/jetty-io/src/main/java/org/eclipse/jetty/io/content/ChunksContentSource.java index 87660be1a3a..4880e54cabf 100644 --- a/jetty-core/jetty-io/src/main/java/org/eclipse/jetty/io/content/ChunksContentSource.java +++ b/jetty-core/jetty-io/src/main/java/org/eclipse/jetty/io/content/ChunksContentSource.java @@ -73,13 +73,7 @@ public Content.Chunk read() if (last) terminated = Content.Chunk.EOF; } - boolean terminal = !chunk.getByteBuffer().hasRemaining() && chunk.isLast(); - if (terminal) - { - chunk.release(); - return Content.Chunk.EOF; - } - return Content.Chunk.from(chunk.getByteBuffer().slice(), chunk.isLast(), chunk); + return chunk.slice(); } @Override