diff --git a/.changes/next-release/bugfix-AWSSDKforJavav2-17f90b1.json b/.changes/next-release/bugfix-AWSSDKforJavav2-17f90b1.json new file mode 100644 index 000000000000..9a11883290b9 --- /dev/null +++ b/.changes/next-release/bugfix-AWSSDKforJavav2-17f90b1.json @@ -0,0 +1,6 @@ +{ + "type": "bugfix", + "category": "AWS SDK for Java v2", + "contributor": "", + "description": "Fixed AsyncRequestBody.fromByteBuffers() and related methods to properly complete when called with no buffers" +} \ No newline at end of file diff --git a/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/async/ByteBuffersAsyncRequestBody.java b/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/async/ByteBuffersAsyncRequestBody.java index a4ee21fe0238..c19ab8e245f8 100644 --- a/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/async/ByteBuffersAsyncRequestBody.java +++ b/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/async/ByteBuffersAsyncRequestBody.java @@ -86,6 +86,10 @@ public void request(long n) { if (n > 0) { int i = index.getAndIncrement(); + if (buffers.length == 0 && completed.compareAndSet(false, true)) { + s.onComplete(); + } + if (i >= buffers.length) { return; } diff --git a/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/async/ByteBuffersAsyncRequestBodyTest.java b/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/async/ByteBuffersAsyncRequestBodyTest.java index 7c0a43f10e51..e1035dc25b0c 100644 --- a/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/async/ByteBuffersAsyncRequestBodyTest.java +++ b/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/async/ByteBuffersAsyncRequestBodyTest.java @@ -81,6 +81,16 @@ public void subscriberIsMarkedAsCompleted() { assertEquals(1, subscriber.publishedResults.size()); } + @Test + public void subscriberIsMarkedAsCompletedWhenNoBufferIsGiven() { + AsyncRequestBody requestBody = ByteBuffersAsyncRequestBody.of(); + TestSubscriber subscriber = new TestSubscriber(); + + requestBody.subscribe(subscriber); + subscriber.request(1); + assertTrue(subscriber.onCompleteCalled); + } + @Test public void subscriberIsMarkedAsCompletedWhenARequestIsMadeForMoreBuffersThanAreAvailable() { AsyncRequestBody requestBody = ByteBuffersAsyncRequestBody.from("Hello World!".getBytes(StandardCharsets.UTF_8));