Skip to content

Commit f0b1a54

Browse files
committed
replace httpResponse with SdkHttpResponse
1 parent 1a9461a commit f0b1a54

File tree

76 files changed

+696
-742
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

76 files changed

+696
-742
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"category": "AWS SDK for Java v2",
3+
"type": "feature",
4+
"description": "Replacing legacy `HttpResponse` with `SdkHttpFullResponse`."
5+
}

codegen/src/main/resources/templates/json/ModelJsonUnmarshaller.ftl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public class ${shape.shapeName}Unmarshaller implements Unmarshaller<${shape.shap
4343
<#if shape.hasStatusCodeMember >
4444
<#list shape.members as memberModel>
4545
<#if memberModel.http.isStatusCode() >
46-
${shape.variable.variableName}Builder.${memberModel.fluentSetterMethodName}(context.getHttpResponse().getStatusCode());
46+
${shape.variable.variableName}Builder.${memberModel.fluentSetterMethodName}(context.getHttpResponse().statusCode());
4747
</#if>
4848
</#list>
4949
</#if>
@@ -53,7 +53,7 @@ public class ${shape.shapeName}Unmarshaller implements Unmarshaller<${shape.shap
5353
<#if explicitPayloadMember.http.isStreaming>
5454
<#-- Intentionally left blank, streaming handled by SyncResponseHandler -->
5555
<#elseif explicitPayloadMember.variable.variableType == "software.amazon.awssdk.core.SdkBytes">
56-
java.io.InputStream is = context.getHttpResponse().getContent();
56+
java.io.InputStream is = context.getHttpResponse().content().orElse(null);
5757
if(is != null) {
5858
try {
5959
${shape.variable.variableName}Builder.${explicitPayloadMember.fluentSetterMethodName}(software.amazon.awssdk.core.SdkBytes.fromInputStream(is));

codegen/src/main/resources/templates/query/ModelStaxUnmarshaller.ftl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public class ${shape.shapeName}Unmarshaller implements Unmarshaller<${shape.shap
8585
<#if shape.hasStatusCodeMember >
8686
<#list shape.members as memberModel>
8787
<#if memberModel.http.isStatusCode() >
88-
${shape.variable.variableName}.${memberModel.fluentSetterMethodName}(context.getHttpResponse().getStatusCode());
88+
${shape.variable.variableName}.${memberModel.fluentSetterMethodName}(context.getHttpResponse().statusCode());
8989
</#if>
9090

9191
<#if !memberModel.http.location?? || memberModel.http.location != "headers">

core/aws-core/src/main/java/software/amazon/awssdk/awscore/eventstream/EventStreamAsyncResponseTransformer.java

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,14 @@
1515

1616
package software.amazon.awssdk.awscore.eventstream;
1717

18+
import static java.util.Collections.singletonList;
1819
import static software.amazon.awssdk.utils.FunctionalUtils.runAndLogError;
1920

2021
import java.io.ByteArrayInputStream;
2122
import java.nio.ByteBuffer;
23+
import java.util.HashMap;
24+
import java.util.List;
25+
import java.util.Map;
2226
import java.util.concurrent.CompletableFuture;
2327
import java.util.concurrent.atomic.AtomicLong;
2428
import java.util.concurrent.atomic.AtomicReference;
@@ -31,10 +35,11 @@
3135
import software.amazon.awssdk.core.async.AsyncResponseTransformer;
3236
import software.amazon.awssdk.core.async.SdkPublisher;
3337
import software.amazon.awssdk.core.exception.SdkClientException;
34-
import software.amazon.awssdk.core.http.HttpResponse;
3538
import software.amazon.awssdk.core.http.HttpResponseHandler;
3639
import software.amazon.awssdk.core.interceptor.ExecutionAttributes;
3740
import software.amazon.awssdk.core.internal.util.ThrowableUtils;
41+
import software.amazon.awssdk.http.AbortableInputStream;
42+
import software.amazon.awssdk.http.SdkHttpFullResponse;
3843
import software.amazon.awssdk.utils.BinaryUtils;
3944
import software.amazon.eventstream.Message;
4045
import software.amazon.eventstream.MessageDecoder;
@@ -192,15 +197,16 @@ private MessageDecoder createDecoder() {
192197
if (isEvent(m)) {
193198
if (m.getHeaders().get(":event-type").getString().equals("initial-response")) {
194199
eventStreamResponseTransformer.responseReceived(
195-
initialResponseUnmarshaller.handle(adaptMessageToResponse(m),
200+
initialResponseUnmarshaller.handle(adaptMessageToResponse(m, false),
196201
EMPTY_EXECUTION_ATTRIBUTES));
197202
} else {
198203
remainingDemand.decrementAndGet();
199-
subscriberRef.get().onNext(eventUnmarshaller.handle(adaptMessageToResponse(m),
204+
subscriberRef.get().onNext(eventUnmarshaller.handle(adaptMessageToResponse(m, false),
200205
EMPTY_EXECUTION_ATTRIBUTES));
201206
}
202207
} else if (isError(m) || isException(m)) {
203-
Throwable exception = exceptionUnmarshaller.handle(adaptMessageToResponse(m), EMPTY_EXECUTION_ATTRIBUTES);
208+
Throwable exception = exceptionUnmarshaller.handle(adaptMessageToResponse(m, true),
209+
EMPTY_EXECUTION_ATTRIBUTES);
204210
runAndLogError(log, "Error thrown from exceptionOccurred, ignoring.", () -> exceptionOccurred(exception));
205211
}
206212
} catch (Exception e) {
@@ -234,15 +240,26 @@ private boolean isException(Message m) {
234240
}
235241

236242
/**
237-
* Transforms an event stream message into a {@link HttpResponse} so we can reuse our existing generated unmarshallers.
243+
* Transforms an event stream message into a {@link SdkHttpFullResponse} so we can reuse our existing generated unmarshallers.
238244
*
239-
* @param m Message to transform.
245+
* @param message Message to transform.
240246
*/
241-
private HttpResponse adaptMessageToResponse(Message m) {
242-
HttpResponse response = new HttpResponse(null);
243-
response.setContent(new ByteArrayInputStream(m.getPayload()));
244-
m.getHeaders().forEach((k, v) -> response.addHeader(k, v.getString()));
245-
return response;
247+
private SdkHttpFullResponse adaptMessageToResponse(Message message, boolean isException) {
248+
249+
Map<String, List<String>> headers =
250+
message.getHeaders()
251+
.entrySet()
252+
.stream()
253+
.collect(HashMap::new, (m, e) -> m.put(e.getKey(), singletonList(e.getValue().getString())), Map::putAll);
254+
255+
//TODO: fix the hard-coded status code
256+
int statusCode = isException ? 500 : 200;
257+
258+
return SdkHttpFullResponse.builder()
259+
.content(AbortableInputStream.create(new ByteArrayInputStream(message.getPayload())))
260+
.headers(headers)
261+
.statusCode(statusCode)
262+
.build();
246263
}
247264

248265
/**

core/aws-core/src/main/java/software/amazon/awssdk/awscore/eventstream/EventStreamExceptionJsonUnmarshaller.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,9 @@ public static AwsServiceException populateDefaultException(
6363
throw new IllegalStateException("Unexpected exception message type: " + messageType);
6464
}
6565

66-
SdkBytes rawResponse = SdkBytes.fromInputStream(context.getHttpResponse().getContent());
66+
SdkBytes rawResponse =
67+
context.getHttpResponse().content().map(SdkBytes::fromInputStream).orElse(null);
68+
6769
return exceptionBuilderSupplier.get()
6870
.awsErrorDetails(AwsErrorDetails.builder()
6971
.errorMessage(errorMessage)

core/aws-core/src/main/java/software/amazon/awssdk/awscore/exception/AwsErrorDetails.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
import software.amazon.awssdk.annotations.SdkPublicApi;
1919
import software.amazon.awssdk.core.SdkBytes;
20-
import software.amazon.awssdk.core.http.HttpResponse;
20+
import software.amazon.awssdk.http.SdkHttpResponse;
2121

2222
@SdkPublicApi
2323
public class AwsErrorDetails {
@@ -28,7 +28,7 @@ public class AwsErrorDetails {
2828

2929
private final String serviceName;
3030

31-
private final HttpResponse sdkHttpResponse;
31+
private final SdkHttpResponse sdkHttpResponse;
3232

3333
private final SdkBytes rawResponse;
3434

@@ -74,7 +74,7 @@ public SdkBytes rawResponse() {
7474
/**
7575
* Returns a map of HTTP headers associated with the error response.
7676
*/
77-
public HttpResponse sdkHttpResponse() {
77+
public SdkHttpResponse sdkHttpResponse() {
7878
return sdkHttpResponse;
7979
}
8080

@@ -146,19 +146,19 @@ public interface Builder {
146146
String serviceName();
147147

148148
/**
149-
* Specifies the {@link HttpResponse} returned on the error response from the service.
149+
* Specifies the {@link SdkHttpResponse} returned on the error response from the service.
150150
*
151-
* @param HttpResponse The HTTP response from the service.
151+
* @param sdkHttpResponse The HTTP response from the service.
152152
* @return This object for method chaining.
153153
*/
154-
Builder sdkHttpResponse(HttpResponse sdkHttpResponse);
154+
Builder sdkHttpResponse(SdkHttpResponse sdkHttpResponse);
155155

156156
/**
157157
* The HTTP response returned from the service.
158158
*
159-
* @return {@link HttpResponse}.
159+
* @return {@link SdkHttpResponse}.
160160
*/
161-
HttpResponse sdkHttpResponse();
161+
SdkHttpResponse sdkHttpResponse();
162162

163163
/**
164164
* Specifies raw http response from the service.
@@ -188,7 +188,7 @@ protected static final class BuilderImpl implements Builder {
188188
private String errorMessage;
189189
private String errorCode;
190190
private String serviceName;
191-
private HttpResponse sdkHttpResponse;
191+
private SdkHttpResponse sdkHttpResponse;
192192
private SdkBytes rawResponse;
193193

194194
private BuilderImpl() {}
@@ -235,13 +235,13 @@ public String serviceName() {
235235
}
236236

237237
@Override
238-
public Builder sdkHttpResponse(HttpResponse sdkHttpResponse) {
238+
public Builder sdkHttpResponse(SdkHttpResponse sdkHttpResponse) {
239239
this.sdkHttpResponse = sdkHttpResponse;
240240
return this;
241241
}
242242

243243
@Override
244-
public HttpResponse sdkHttpResponse() {
244+
public SdkHttpResponse sdkHttpResponse() {
245245
return sdkHttpResponse;
246246
}
247247

core/aws-core/src/main/java/software/amazon/awssdk/awscore/http/response/AwsJsonErrorResponseHandler.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@
2323
import software.amazon.awssdk.awscore.internal.protocol.json.AwsJsonErrorUnmarshaller;
2424
import software.amazon.awssdk.awscore.internal.protocol.json.ErrorCodeParser;
2525
import software.amazon.awssdk.core.SdkBytes;
26-
import software.amazon.awssdk.core.http.HttpResponse;
2726
import software.amazon.awssdk.core.interceptor.ExecutionAttributes;
2827
import software.amazon.awssdk.core.interceptor.SdkExecutionAttribute;
2928
import software.amazon.awssdk.core.internal.http.JsonErrorResponseHandler;
3029
import software.amazon.awssdk.core.internal.protocol.json.ErrorMessageParser;
3130
import software.amazon.awssdk.core.internal.protocol.json.JsonContent;
31+
import software.amazon.awssdk.http.SdkHttpFullResponse;
3232

3333
/**
3434
* Implementation of HttpResponseHandler that handles a error response from AWS
@@ -58,7 +58,7 @@ public boolean needsConnectionLeftOpen() {
5858
}
5959

6060
@Override
61-
public AwsServiceException handle(HttpResponse response,
61+
public AwsServiceException handle(SdkHttpFullResponse response,
6262
ExecutionAttributes executionAttributes) throws Exception {
6363

6464
JsonContent jsonContent = JsonContent.createJsonContent(response, jsonFactory);
@@ -80,8 +80,8 @@ public AwsServiceException handle(HttpResponse response,
8080
}
8181

8282
exception.awsErrorDetails(errorDetails.build());
83-
exception.statusCode(response.getStatusCode());
84-
exception.requestId(getRequestIdFromHeaders(response.getHeaders()));
83+
exception.statusCode(response.statusCode());
84+
exception.requestId(getRequestIdFromHeaders(response.headers()));
8585

8686
return exception.build();
8787
}

core/aws-core/src/main/java/software/amazon/awssdk/awscore/http/response/DefaultErrorResponseHandler.java

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,12 @@
2828
import software.amazon.awssdk.awscore.exception.AwsErrorDetails;
2929
import software.amazon.awssdk.awscore.exception.AwsServiceException;
3030
import software.amazon.awssdk.core.exception.SdkClientException;
31-
import software.amazon.awssdk.core.http.HttpResponse;
3231
import software.amazon.awssdk.core.http.HttpResponseHandler;
3332
import software.amazon.awssdk.core.interceptor.ExecutionAttributes;
3433
import software.amazon.awssdk.core.interceptor.SdkExecutionAttribute;
35-
import software.amazon.awssdk.core.internal.http.pipeline.stages.ApplyTransactionIdStage;
3634
import software.amazon.awssdk.core.runtime.transform.Unmarshaller;
3735
import software.amazon.awssdk.core.util.xml.XpathUtils;
36+
import software.amazon.awssdk.http.SdkHttpFullResponse;
3837
import software.amazon.awssdk.utils.IoUtils;
3938

4039
/**
@@ -68,7 +67,7 @@ public DefaultErrorResponseHandler(
6867
}
6968

7069
@Override
71-
public AwsServiceException handle(HttpResponse errorResponse,
70+
public AwsServiceException handle(SdkHttpFullResponse errorResponse,
7271
ExecutionAttributes executionAttributes) throws Exception {
7372
AwsServiceException exception = createServiceException(errorResponse);
7473

@@ -85,15 +84,16 @@ public AwsServiceException handle(HttpResponse errorResponse,
8584
.serviceName(executionAttributes.getAttribute(SdkExecutionAttribute.SERVICE_NAME));
8685

8786
if (awsErrorDetails.errorCode() == null) {
88-
awsErrorDetails.errorCode(errorResponse.getStatusCode() + " " + errorResponse.getStatusText());
87+
awsErrorDetails.errorCode(errorResponse.statusCode() + " " + errorResponse.statusText().orElse(null));
8988
}
9089

9190
return exceptionBuilder.awsErrorDetails(awsErrorDetails.build()).build();
9291
}
9392

94-
private AwsServiceException createServiceException(HttpResponse errorResponse) throws Exception {
93+
private AwsServiceException createServiceException(SdkHttpFullResponse errorResponse) throws Exception {
94+
9595
// Try to parse the error response as XML
96-
final Document document = documentFromContent(errorResponse.getContent(), idString(errorResponse));
96+
final Document document = documentFromContent(errorResponse.content().orElse(null), idString(errorResponse));
9797

9898
/*
9999
* We need to select which exception unmarshaller is the correct one to
@@ -106,7 +106,7 @@ private AwsServiceException createServiceException(HttpResponse errorResponse) t
106106
AwsServiceException exception = unmarshaller.unmarshall(document);
107107

108108
if (exception != null) {
109-
return exception.toBuilder().statusCode(errorResponse.getStatusCode()).build();
109+
return exception.toBuilder().statusCode(errorResponse.statusCode()).build();
110110
}
111111
}
112112
return null;
@@ -141,18 +141,13 @@ private Document parseXml(String xml, String idString) throws Exception {
141141
}
142142
}
143143

144-
private String idString(HttpResponse errorResponse) {
144+
private String idString(SdkHttpFullResponse errorResponse) {
145145
StringBuilder idString = new StringBuilder();
146146
try {
147-
errorResponse.getRequest()
148-
.firstMatchingHeader(ApplyTransactionIdStage.HEADER_SDK_TRANSACTION_ID)
149-
.ifPresent(h -> idString.append("Invocation Id:").append(h));
150-
if (errorResponse.getHeaders().containsKey(X_AMZN_REQUEST_ID_HEADER)) {
151-
if (idString.length() > 0) {
152-
idString.append(", ");
153-
}
154-
idString.append("Request Id:").append(errorResponse.getHeaders().get(X_AMZN_REQUEST_ID_HEADER));
155-
}
147+
//TODO: do we need to add invocation Id here? json error repsonse handler doesn't do that
148+
errorResponse.firstMatchingHeader(X_AMZN_REQUEST_ID_HEADER)
149+
.ifPresent(s -> idString.append("Request Id:").append(s));
150+
156151
} catch (NullPointerException npe) {
157152
log.debug("Error getting Request or Invocation ID from response", npe);
158153
}

core/aws-core/src/main/java/software/amazon/awssdk/awscore/http/response/StaxResponseHandler.java

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,12 @@
2929
import software.amazon.awssdk.core.SdkResponseMetadata;
3030
import software.amazon.awssdk.core.SdkStandardLogger;
3131
import software.amazon.awssdk.core.async.AsyncResponseTransformer;
32-
import software.amazon.awssdk.core.http.HttpResponse;
3332
import software.amazon.awssdk.core.http.HttpResponseHandler;
3433
import software.amazon.awssdk.core.interceptor.ExecutionAttributes;
3534
import software.amazon.awssdk.core.runtime.transform.Unmarshaller;
3635
import software.amazon.awssdk.core.sync.ResponseTransformer;
36+
import software.amazon.awssdk.http.AbortableInputStream;
37+
import software.amazon.awssdk.http.SdkHttpFullResponse;
3738
import software.amazon.awssdk.utils.FunctionalUtils.UnsafeFunction;
3839
import software.amazon.awssdk.utils.Logger;
3940
import software.amazon.awssdk.utils.XmlUtils;
@@ -80,20 +81,19 @@ public StaxResponseHandler(Unmarshaller<T, StaxUnmarshallerContext> responseUnma
8081

8182

8283
/**
83-
* @see HttpResponseHandler#handle(HttpResponse, ExecutionAttributes)
84+
* @see HttpResponseHandler#handle(SdkHttpFullResponse, ExecutionAttributes)
8485
*/
8586
@Override
86-
public T handle(HttpResponse response, ExecutionAttributes executionAttributes) throws Exception {
87+
public T handle(SdkHttpFullResponse response, ExecutionAttributes executionAttributes) throws Exception {
8788
SdkStandardLogger.REQUEST_LOGGER.trace(() -> "Parsing service response XML.");
88-
InputStream content = response.getContent();
89-
if (content == null) {
90-
content = new ByteArrayInputStream("<eof/>".getBytes(StandardCharsets.UTF_8));
91-
}
89+
90+
InputStream content = response.content().orElse(
91+
AbortableInputStream.create(new ByteArrayInputStream("<eof/>".getBytes(StandardCharsets.UTF_8))));
9292

9393
XMLEventReader eventReader = XmlUtils.xmlInputFactory().createXMLEventReader(content);
9494

9595
try {
96-
StaxUnmarshallerContext unmarshallerContext = new StaxUnmarshallerContext(eventReader, response.getHeaders());
96+
StaxUnmarshallerContext unmarshallerContext = new StaxUnmarshallerContext(eventReader, response.headers());
9797
unmarshallerContext.registerMetadataExpression("ResponseMetadata/RequestId", 2, SdkResponseMetadata.AWS_REQUEST_ID);
9898
unmarshallerContext.registerMetadataExpression("requestId", 2, SdkResponseMetadata.AWS_REQUEST_ID);
9999
registerAdditionalMetadataExpressions(unmarshallerContext);
@@ -152,10 +152,11 @@ public boolean needsConnectionLeftOpen() {
152152
*/
153153
public static <ResponseT extends SdkResponse> HttpResponseHandler<ResponseT> createStreamingResponseHandler(
154154
Unmarshaller<ResponseT, StaxUnmarshallerContext> unmarshaller) {
155-
UnsafeFunction<HttpResponse, ResponseT> unmarshallFunction = response -> unmarshallStreaming(unmarshaller, response);
155+
UnsafeFunction<SdkHttpFullResponse, ResponseT> unmarshallFunction =
156+
response -> unmarshallStreaming(unmarshaller, response);
156157
return new HttpResponseHandler<ResponseT>() {
157158
@Override
158-
public ResponseT handle(HttpResponse response, ExecutionAttributes executionAttributes) throws Exception {
159+
public ResponseT handle(SdkHttpFullResponse response, ExecutionAttributes executionAttributes) throws Exception {
159160
return unmarshallFunction.apply(response);
160161
}
161162

@@ -177,12 +178,12 @@ public boolean needsConnectionLeftOpen() {
177178
* @throws Exception if error occurs during unmarshalling.
178179
*/
179180
private static <ResponseT extends SdkResponse> ResponseT unmarshallStreaming(Unmarshaller<ResponseT,
180-
StaxUnmarshallerContext> unmarshaller, HttpResponse response) throws Exception {
181+
StaxUnmarshallerContext> unmarshaller, SdkHttpFullResponse response) throws Exception {
181182
// Create a dummy event reader to make unmarshallers happy
182183
XMLEventReader eventReader = XmlUtils.xmlInputFactory().createXMLEventReader(
183184
new ByteArrayInputStream("<eof/>".getBytes(StandardCharsets.UTF_8)));
184185

185-
StaxUnmarshallerContext unmarshallerContext = new StaxUnmarshallerContext(eventReader, response.getHeaders());
186+
StaxUnmarshallerContext unmarshallerContext = new StaxUnmarshallerContext(eventReader, response.headers());
186187
unmarshallerContext.registerMetadataExpression("ResponseMetadata/RequestId", 2, SdkResponseMetadata.AWS_REQUEST_ID);
187188
unmarshallerContext.registerMetadataExpression("requestId", 2, SdkResponseMetadata.AWS_REQUEST_ID);
188189

core/aws-core/src/main/java/software/amazon/awssdk/awscore/internal/client/config/AwsClientOptionValidation.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,5 +46,6 @@ private static void validateClientOptions(SdkClientConfiguration c) {
4646
c.option(AwsClientOption.SERVICE_SIGNING_NAME));
4747
require("overrideConfiguration.advancedOption[ENABLE_DEFAULT_REGION_DETECTION]",
4848
c.option(AwsAdvancedClientOption.ENABLE_DEFAULT_REGION_DETECTION));
49+
4950
}
5051
}

0 commit comments

Comments
 (0)