aws / aws/aws-sdk-java-v2

S3AsyncClient not compatible with AwsS3V4Signer

Offen
#3,283 4 Kommentare 2 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
bug p2
Vorherrschende Sprache
Java
Sterne
2.6k
Forks
1k
Ø Merge
2 T. 9 Std.
Gemergte PRs (30 T.)
51

Beschreibung

### Describe the bug

When using S3AsyncClient with AwsS3V4Signer the request is not getting properly signed and results in an exception.

### Expected Behavior

The request should be signed and sent.

### Current Behavior

The request is not signed but the content-length is updated. An exception is thrown because the content length does not match what is sent.

```
at software.amazon.awssdk.core.exception.SdkClientException$BuilderImpl.build(SdkClientException.java:102) ~[sdk-core-2.17.219.jar:na]
at software.amazon.awssdk.core.exception.SdkClientException.create(SdkClientException.java:47) ~[sdk-core-2.17.219.jar:na]
at software.amazon.awssdk.core.internal.http.pipeline.stages.utils.RetryableStageHelper.setLastException(RetryableStageHelper.java:211) ~[sdk-core-2.17.219.jar:na]
at software.amazon.awssdk.core.internal.http.pipeline.stages.utils.RetryableStageHelper.setLastException(RetryableStageHelper.java:207) ~[sdk-core-2.17.219.jar:na]
at software.amazon.awssdk.core.internal.http.pipeline.stages.AsyncRetryableStage$RetryingExecutor.maybeRetryExecute(AsyncRetryableStage.java:179) ~[sdk-core-2.17.219.jar:na]
at software.amazon.awssdk.core.internal.http.pipeline.stages.AsyncRetryableStage$RetryingExecutor.lambda$attemptExecute$1(AsyncRetryableStage.java:159) ~[sdk-core-2.17.219.jar:na]
at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859) ~[na:na]
at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:837) ~[na:na]
at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506) ~[na:na]
at java.base/java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2088) ~[na:na]
at software.amazon.awssdk.utils.CompletableFutureUtils.lambda$forwardExceptionTo$0(CompletableFutureUtils.java:76) ~[utils-2.17.219.jar:na]
at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859) ~[na:na]
at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:837) ~[na:na]
at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506) ~[na:na]
at java.base/java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2088) ~[na:na]
at software.amazon.awssdk.core.internal.http.pipeline.stages.MakeAsyncHttpRequestStage.lambda$null$0(MakeAsyncHttpRequestStage.java:103) ~[sdk-core-2.17.219.jar:na]
at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859) ~[na:na]
at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:837) ~[na:na]
at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506) ~[na:na]
at java.base/java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2088) ~[na:na]
at software.amazon.awssdk.core.internal.http.pipeline.stages.MakeAsyncHttpRequestStage.lambda$executeHttpRequest$3(MakeAsyncHttpRequestStage.java:165) ~[sdk-core-2.17.219.jar:na]
at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859) ~[na:na]
at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:837) ~[na:na]
at java.base/java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:478) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
Caused by: java.lang.IllegalStateException: Request content was only 4 bytes, but the specified content-length was 176 bytes.
at software.amazon.awssdk.http.nio.netty.internal.NettyRequestExecutor$StreamedRequest$1.onComplete(NettyRequestExecutor.java:480) ~[netty-nio-client-2.17.219.jar:na]
at software.amazon.awssdk.core.internal.async.ByteArrayAsyncRequestBody$1.request(ByteArrayAsyncRequestBody.java:78) ~[sdk-core-2.17.219.jar:na]
at software.amazon.awssdk.http.nio.netty.internal.nrs.HandlerSubscriber.maybeRequestMore(HandlerSubscriber.java:303) ~[netty-nio-client-2.17.219.jar:na]
at software.amazon.awssdk.http.nio.netty.internal.nrs.HandlerSubscriber.maybeStart(HandlerSubscriber.java:238) ~[netty-nio-client-2.17.219.jar:na]
at software.amazon.awssdk.http.nio.netty.internal.nrs.HandlerSubscriber.provideSubscription(HandlerSubscriber.java:225) ~[netty-nio-client-2.17.219.jar:na]
at software.amazon.awssdk.http.nio.netty.internal.nrs.HandlerSubscriber.access$000(HandlerSubscriber.java:41) ~[netty-nio-client-2.17.219.jar:na]
at software.amazon.awssdk.http.nio.netty.internal.nrs.HandlerSubscriber$1.run(HandlerSubscriber.java:213) ~[netty-nio-client-2.17.219.jar:na]
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174) ~[netty-common-4.1.78.Final.jar:4.1.78.Final]
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167) ~[netty-common-4.1.78.Final.jar:4.1.78.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470) ~[netty-common-4.1.78.Final.jar:4.1.78.Final]
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500) ~[netty-transport-4.1.78.Final.jar:4.1.78.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) ~[netty-common-4.1.78.Final.jar:4.1.78.Final]
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.78.Final.jar:4.1.78.Final]
at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
```
### Reproduction Steps

Create a Client like such.

```java
final S3AsyncClient s3Client = S3AsyncClient.builder()
.serviceConfiguration(S3Configuration.builder().chunkedEncodingEnabled(true).build())
.endpointOverride(new URI(url)).region(Region.US_EAST_1).overrideConfiguration(
ClientOverrideConfiguration.builder()
.putAdvancedOption(SdkAdvancedClientOption.SIGNER, AwsS3V4Signer.create())
.executionAttributes(ExecutionAttributes.builder()
.put(S3SignerExecutionAttribute.ENABLE_PAYLOAD_SIGNING, true).build()).build()).build();
```

Try to Put Object

```java
s3Client.putObject(request -> request.bucket(bucket).key("TEST-KEY").build(), AsyncRequestBody.fromString("test")).get();
```

### Possible Solution

Create an AsyncAwsS3V4Signer class

### Additional Information/Context

_No response_

### AWS Java SDK version used

2.17.219

### JDK version used

17.0.3

### Operating System and version

Windows 7

Beitragsleitfaden

Beitragsleitfaden öffnen

Rechercherichtung

Beginne bei den im Reproduktionsbeispiel gezeigten Einstiegspunkten des S3AsyncClient-Builders und von AwsS3V4Signer und verfolge dann den asynchronen Pfad der Anfrage-Signierung bis zur Content-Length-Ausnahme von NettyRequestExecutor. Reproduziere den PutObject-Aufruf mit aktivierter Payload-Signierung und aktivierter Chunked Encoding; fertig ist es, wenn die Anfrage signiert und erfolgreich gesendet wird und ihre deklarierte Content-Length mit den übertragenen Bytes übereinstimmt.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
aws, java
Bereich
api, backend, security
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.