From 090c10b8b6bdfd911f5d55dce5d02e9f7d55425c Mon Sep 17 00:00:00 2001 From: Anna-Karin Salander Date: Tue, 12 Oct 2021 10:32:45 -0700 Subject: [PATCH 1/3] Updates xml error unmarshalling to look at all request id keys when populating error information --- .../bugfix-AWSSDKforJavav2-a6e2ed8.json | 6 ++++++ .../unmarshall/AwsXmlErrorUnmarshaller.java | 13 ++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 .changes/next-release/bugfix-AWSSDKforJavav2-a6e2ed8.json diff --git a/.changes/next-release/bugfix-AWSSDKforJavav2-a6e2ed8.json b/.changes/next-release/bugfix-AWSSDKforJavav2-a6e2ed8.json new file mode 100644 index 000000000000..83206605963c --- /dev/null +++ b/.changes/next-release/bugfix-AWSSDKforJavav2-a6e2ed8.json @@ -0,0 +1,6 @@ +{ + "category": "AWS SDK for Java v2", + "contributor": "", + "type": "bugfix", + "description": "Fixes a bug in XML error unmarshalling where error responses with empty body won't populate the requestId field. Affects Amazon S3 API calls such as Head object" +} diff --git a/core/protocols/aws-query-protocol/src/main/java/software/amazon/awssdk/protocols/query/internal/unmarshall/AwsXmlErrorUnmarshaller.java b/core/protocols/aws-query-protocol/src/main/java/software/amazon/awssdk/protocols/query/internal/unmarshall/AwsXmlErrorUnmarshaller.java index b94d2e3ca48c..aefd4dd026a1 100644 --- a/core/protocols/aws-query-protocol/src/main/java/software/amazon/awssdk/protocols/query/internal/unmarshall/AwsXmlErrorUnmarshaller.java +++ b/core/protocols/aws-query-protocol/src/main/java/software/amazon/awssdk/protocols/query/internal/unmarshall/AwsXmlErrorUnmarshaller.java @@ -19,6 +19,7 @@ import java.time.Duration; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.function.Supplier; import software.amazon.awssdk.annotations.SdkInternalApi; @@ -27,6 +28,7 @@ import software.amazon.awssdk.awscore.exception.AwsServiceException; import software.amazon.awssdk.core.SdkBytes; import software.amazon.awssdk.core.SdkPojo; +import software.amazon.awssdk.core.http.HttpResponseHandler; import software.amazon.awssdk.core.interceptor.ExecutionAttributes; import software.amazon.awssdk.core.interceptor.SdkExecutionAttribute; import software.amazon.awssdk.http.SdkHttpFullResponse; @@ -175,7 +177,16 @@ private String getRequestId(SdkHttpFullResponse response, XmlElement document) { .orElse(document.getElementByName("RequestID")); return requestId != null ? requestId.textContent() : - response.firstMatchingHeader(X_AMZN_REQUEST_ID_HEADER).orElse(null); + matchRequestIdHeaders(response); + } + + private String matchRequestIdHeaders(SdkHttpFullResponse response) { + return HttpResponseHandler.X_AMZN_REQUEST_ID_HEADERS.stream() + .map(h -> response.firstMatchingHeader(h)) + .filter(Optional::isPresent) + .map(Optional::get) + .findFirst() + .orElse(null); } /** From 340b9b24e62afe31b50c3ccd5c1792dee1d42576 Mon Sep 17 00:00:00 2001 From: Dongie Agnir Date: Wed, 13 Oct 2021 11:28:37 -0700 Subject: [PATCH 2/3] Add tests --- .../tests/exception/QueryExceptionTests.java | 13 +++++++++++++ .../tests/exception/RestXmlExceptionTests.java | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/test/protocol-tests/src/test/java/software/amazon/awssdk/protocol/tests/exception/QueryExceptionTests.java b/test/protocol-tests/src/test/java/software/amazon/awssdk/protocol/tests/exception/QueryExceptionTests.java index 1470d492041c..b65247235eda 100644 --- a/test/protocol-tests/src/test/java/software/amazon/awssdk/protocol/tests/exception/QueryExceptionTests.java +++ b/test/protocol-tests/src/test/java/software/amazon/awssdk/protocol/tests/exception/QueryExceptionTests.java @@ -286,6 +286,19 @@ public void requestIdAndExtendedRequestIdInHeader_IsSetOnException() { } } + @Test + public void alternateRequestIdInHeader_IsSetOnException() { + stubFor(post(urlEqualTo(PATH)).willReturn( + aResponse() + .withStatus(404) + .withHeader("x-amz-request-id", "1234"))); + try { + client.allTypes(); + } catch (ProtocolQueryException e) { + assertThat(e.requestId()).isEqualTo("1234"); + } + } + private void callAllTypes() { client.allTypes(AllTypesRequest.builder().build()); } diff --git a/test/protocol-tests/src/test/java/software/amazon/awssdk/protocol/tests/exception/RestXmlExceptionTests.java b/test/protocol-tests/src/test/java/software/amazon/awssdk/protocol/tests/exception/RestXmlExceptionTests.java index 99dc7a2b97a9..6630c3a2b773 100644 --- a/test/protocol-tests/src/test/java/software/amazon/awssdk/protocol/tests/exception/RestXmlExceptionTests.java +++ b/test/protocol-tests/src/test/java/software/amazon/awssdk/protocol/tests/exception/RestXmlExceptionTests.java @@ -216,6 +216,19 @@ public void illegalArgumentException_emptyPathParam() { IllegalArgumentException.class); } + @Test + public void alternateRequestIdInHeader_IsSetOnException() { + stubFor(post(urlEqualTo(ALL_TYPES_PATH)).willReturn( + aResponse() + .withStatus(404) + .withHeader("x-amz-request-id", "1234"))); + try { + client.allTypes(); + } catch (ProtocolRestXmlException e) { + assertThat(e.requestId()).isEqualTo("1234"); + } + } + private void callAllTypes() { client.allTypes(AllTypesRequest.builder().build()); } From 793f9de6bce345371d7f55a2d3879e0d7f737de1 Mon Sep 17 00:00:00 2001 From: Dongie Agnir Date: Wed, 13 Oct 2021 11:58:26 -0700 Subject: [PATCH 3/3] Checkstyle fixes --- .../query/internal/unmarshall/AwsXmlErrorUnmarshaller.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/protocols/aws-query-protocol/src/main/java/software/amazon/awssdk/protocols/query/internal/unmarshall/AwsXmlErrorUnmarshaller.java b/core/protocols/aws-query-protocol/src/main/java/software/amazon/awssdk/protocols/query/internal/unmarshall/AwsXmlErrorUnmarshaller.java index aefd4dd026a1..3827eb831d45 100644 --- a/core/protocols/aws-query-protocol/src/main/java/software/amazon/awssdk/protocols/query/internal/unmarshall/AwsXmlErrorUnmarshaller.java +++ b/core/protocols/aws-query-protocol/src/main/java/software/amazon/awssdk/protocols/query/internal/unmarshall/AwsXmlErrorUnmarshaller.java @@ -19,7 +19,6 @@ import java.time.Duration; import java.util.List; -import java.util.Map; import java.util.Optional; import java.util.function.Supplier; import software.amazon.awssdk.annotations.SdkInternalApi; @@ -41,7 +40,6 @@ */ @SdkInternalApi public final class AwsXmlErrorUnmarshaller { - private static final String X_AMZN_REQUEST_ID_HEADER = "x-amzn-RequestId"; private static final String X_AMZ_ID_2_HEADER = "x-amz-id-2"; private final List exceptions;