diff --git a/.changes/next-release/bugfix-AmazonS3-77f8946.json b/.changes/next-release/bugfix-AmazonS3-77f8946.json new file mode 100644 index 000000000000..fb3f85ea8ba8 --- /dev/null +++ b/.changes/next-release/bugfix-AmazonS3-77f8946.json @@ -0,0 +1,6 @@ +{ + "type": "bugfix", + "category": "Amazon S3", + "contributor": "", + "description": "Add `Expect: 100-continue` header for `UploadPartRequest` so that a upload part request can fail faster if there is a server error." +} diff --git a/services/s3/src/main/java/software/amazon/awssdk/services/s3/internal/handlers/PutObjectInterceptor.java b/services/s3/src/main/java/software/amazon/awssdk/services/s3/internal/handlers/StreamingRequestInterceptor.java similarity index 85% rename from services/s3/src/main/java/software/amazon/awssdk/services/s3/internal/handlers/PutObjectInterceptor.java rename to services/s3/src/main/java/software/amazon/awssdk/services/s3/internal/handlers/StreamingRequestInterceptor.java index 92859b96dea9..82a47cee6f3b 100644 --- a/services/s3/src/main/java/software/amazon/awssdk/services/s3/internal/handlers/PutObjectInterceptor.java +++ b/services/s3/src/main/java/software/amazon/awssdk/services/s3/internal/handlers/StreamingRequestInterceptor.java @@ -21,17 +21,18 @@ import software.amazon.awssdk.core.interceptor.ExecutionInterceptor; import software.amazon.awssdk.http.SdkHttpRequest; import software.amazon.awssdk.services.s3.model.PutObjectRequest; +import software.amazon.awssdk.services.s3.model.UploadPartRequest; /** * Interceptor to add an 'Expect: 100-continue' header to the HTTP Request if it represents a PUT Object request. */ @SdkInternalApi //TODO: This should be generalized for all streaming requests -public final class PutObjectInterceptor implements ExecutionInterceptor { +public final class StreamingRequestInterceptor implements ExecutionInterceptor { @Override public SdkHttpRequest modifyHttpRequest(Context.ModifyHttpRequest context, ExecutionAttributes executionAttributes) { - if (context.request() instanceof PutObjectRequest) { + if (context.request() instanceof PutObjectRequest || context.request() instanceof UploadPartRequest) { return context.httpRequest().toBuilder().putHeader("Expect", "100-continue").build(); } return context.httpRequest(); diff --git a/services/s3/src/main/resources/codegen-resources/customization.config b/services/s3/src/main/resources/codegen-resources/customization.config index 1a1efb76c5f4..71f5a2aef642 100644 --- a/services/s3/src/main/resources/codegen-resources/customization.config +++ b/services/s3/src/main/resources/codegen-resources/customization.config @@ -237,7 +237,7 @@ "asyncClientDecorator": "software.amazon.awssdk.services.s3.internal.client.S3AsyncClientDecorator", "useGlobalEndpoint": true, "interceptors": [ - "software.amazon.awssdk.services.s3.internal.handlers.PutObjectInterceptor", + "software.amazon.awssdk.services.s3.internal.handlers.StreamingRequestInterceptor", "software.amazon.awssdk.services.s3.internal.handlers.CreateBucketInterceptor", "software.amazon.awssdk.services.s3.internal.handlers.CreateMultipartUploadRequestInterceptor", "software.amazon.awssdk.services.s3.internal.handlers.EnableChunkedEncodingInterceptor", diff --git a/services/s3/src/test/java/software/amazon/awssdk/services/s3/internal/handlers/PutObjectInterceptorTest.java b/services/s3/src/test/java/software/amazon/awssdk/services/s3/internal/handlers/StreamingRequestInterceptorTest.java similarity index 74% rename from services/s3/src/test/java/software/amazon/awssdk/services/s3/internal/handlers/PutObjectInterceptorTest.java rename to services/s3/src/test/java/software/amazon/awssdk/services/s3/internal/handlers/StreamingRequestInterceptorTest.java index 08dce580bc95..3a8e9537147f 100644 --- a/services/s3/src/test/java/software/amazon/awssdk/services/s3/internal/handlers/PutObjectInterceptorTest.java +++ b/services/s3/src/test/java/software/amazon/awssdk/services/s3/internal/handlers/StreamingRequestInterceptorTest.java @@ -23,9 +23,10 @@ import software.amazon.awssdk.http.SdkHttpRequest; import software.amazon.awssdk.services.s3.model.GetObjectRequest; import software.amazon.awssdk.services.s3.model.PutObjectRequest; +import software.amazon.awssdk.services.s3.model.UploadPartRequest; -public class PutObjectInterceptorTest { - private final PutObjectInterceptor interceptor = new PutObjectInterceptor(); +public class StreamingRequestInterceptorTest { + private final StreamingRequestInterceptor interceptor = new StreamingRequestInterceptor(); @Test public void modifyHttpRequest_setsExpect100Continue_whenSdkRequestIsPutObject() { @@ -36,6 +37,16 @@ public void modifyHttpRequest_setsExpect100Continue_whenSdkRequestIsPutObject() assertThat(modifiedRequest.firstMatchingHeader("Expect")).hasValue("100-continue"); } + @Test + public void modifyHttpRequest_setsExpect100Continue_whenSdkRequestIsUploadPart() { + + final SdkHttpRequest modifiedRequest = + interceptor.modifyHttpRequest(modifyHttpRequestContext(UploadPartRequest.builder().build()), + new ExecutionAttributes()); + + assertThat(modifiedRequest.firstMatchingHeader("Expect")).hasValue("100-continue"); + } + @Test public void modifyHttpRequest_doesNotSetExpect_whenSdkRequestIsNotPutObject() {