Java源码示例:software.amazon.awssdk.http.SdkHttpResponse
示例1
private HashMap<String, Object> extractHttpResponseParameters(SdkHttpResponse httpResponse) {
HashMap<String, Object> parameters = new HashMap<>();
HashMap<String, Object> responseData = new HashMap<>();
responseData.put(EntityDataKeys.HTTP.STATUS_CODE_KEY, httpResponse.statusCode());
try {
if (httpResponse.headers().containsKey(EntityHeaderKeys.HTTP.CONTENT_LENGTH_HEADER)) {
responseData.put(EntityDataKeys.HTTP.CONTENT_LENGTH_KEY, Long.parseLong(
httpResponse.headers().get(EntityHeaderKeys.HTTP.CONTENT_LENGTH_HEADER).get(0))
);
}
} catch (NumberFormatException e) {
logger.warn("Unable to parse Content-Length header.", e);
}
parameters.put(EntityDataKeys.HTTP.RESPONSE_KEY, responseData);
return parameters;
}
示例2
private void parseRetryHeaderTest(String expected, String header) {
SdkHttpRequest request = SdkHttpRequest.builder()
.method(SdkHttpMethod.POST)
.uri(URI.create("https://ec2.us-east-1.amazonaws.com"))
.appendHeader("amz-sdk-retry", header)
.build();
SdkHttpResponse response = SdkHttpResponse.builder()
.statusCode(200)
.build();
TestContext context = new TestContext(request, response);
execute(context, createAttributes("EC2", "DescribeInstances"), millis(30));
Assertions.assertEquals(1, registry.timers().count());
Timer t = registry.timers().findFirst().orElse(null);
Assertions.assertNotNull(t);
Assertions.assertEquals(1, t.count());
Assertions.assertEquals(millis(30), t.totalTime());
Assertions.assertEquals(expected, get(t.id(), "ipc.attempt"));
}
示例3
@Override
public boolean isClockSkewException() {
if (super.isClockSkewException()) {
return true;
}
if (awsErrorDetails == null) {
return false;
}
if (AwsErrorCode.isDefiniteClockSkewErrorCode(awsErrorDetails.errorCode())) {
return true;
}
SdkHttpResponse sdkHttpResponse = awsErrorDetails.sdkHttpResponse();
if (clockSkew == null || sdkHttpResponse == null) {
return false;
}
boolean isPossibleClockSkewError = AwsErrorCode.isPossibleClockSkewErrorCode(awsErrorDetails.errorCode()) ||
AwsStatusCode.isPossibleClockSkewStatusCode(statusCode());
return isPossibleClockSkewError && ClockSkew.isClockSkewed(Instant.now().minus(clockSkew),
ClockSkew.getServerTime(sdkHttpResponse).orElse(null));
}
示例4
/**
* S3 currently returns content-range in two possible headers: Content-Range or x-amz-content-range based on the x-amz-te
* in the request. This will check the x-amz-content-range if the modeled header (Content-Range) wasn't populated.
*/
private SdkResponse fixContentRange(SdkResponse sdkResponse, SdkHttpResponse httpResponse) {
// Use the modeled content range header, if the service returned it.
GetObjectResponse getObjectResponse = (GetObjectResponse) sdkResponse;
if (getObjectResponse.contentRange() != null) {
return getObjectResponse;
}
// If the service didn't use the modeled content range header, check the x-amz-content-range header.
Optional<String> xAmzContentRange = httpResponse.firstMatchingHeader("x-amz-content-range");
if (!xAmzContentRange.isPresent()) {
return getObjectResponse;
}
return getObjectResponse.copy(r -> r.contentRange(xAmzContentRange.get()));
}
示例5
/**
* @return A mocked result for the ListObjects operation.
*/
public static HttpExecuteResponse mockListObjectsResponse() throws UnsupportedEncodingException {
return HttpExecuteResponse.builder().response(SdkHttpResponse.builder().statusCode(200).build()).responseBody(
AbortableInputStream.create(new StringInputStream(
"<ListBucketResult xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\">\n" +
" <Name>example-bucket</Name>\n" +
" <Prefix>photos/2006/</Prefix>\n" +
" <Marker></Marker>\n" +
" <MaxKeys>1000</MaxKeys>\n" +
" <Delimiter>/</Delimiter>\n" +
" <IsTruncated>false</IsTruncated>\n" +
"\n" +
" <CommonPrefixes>\n" +
" <Prefix>photos/2006/February/</Prefix>\n" +
" </CommonPrefixes>\n" +
" <CommonPrefixes>\n" +
" <Prefix>photos/2006/January/</Prefix>\n" +
" </CommonPrefixes>\n" +
"</ListBucketResult>")))
.build();
}
示例6
@Test
public void afterUnmarshalling_putObjectRequest_with_SSE_shouldNotValidateChecksum() {
SdkHttpResponse sdkHttpResponse = getSdkHttpResponseWithChecksumHeader();
PutObjectResponse response = PutObjectResponse.builder()
.eTag(INVALID_CHECKSUM)
.build();
PutObjectRequest putObjectRequest = PutObjectRequest.builder().build();
SdkHttpRequest sdkHttpRequest = SdkHttpFullRequest.builder()
.putHeader(SERVER_SIDE_ENCRYPTION_HEADER, AWS_KMS.toString())
.putHeader("x-amz-server-side-encryption-aws-kms-key-id", ENABLE_MD5_CHECKSUM_HEADER_VALUE)
.uri(URI.create("http://localhost:8080"))
.method(SdkHttpMethod.PUT)
.build();
Context.AfterUnmarshalling afterUnmarshallingContext =
InterceptorTestUtils.afterUnmarshallingContext(putObjectRequest, sdkHttpRequest, response, sdkHttpResponse);
interceptor.afterUnmarshalling(afterUnmarshallingContext, getExecutionAttributesWithChecksum());
}
示例7
@Test
public void awsFailure() {
SdkHttpRequest request = SdkHttpRequest.builder()
.method(SdkHttpMethod.POST)
.uri(URI.create("https://ec2.us-east-1.amazonaws.com"))
.build();
SdkHttpResponse response = SdkHttpResponse.builder()
.statusCode(403)
.build();
Throwable error = AwsServiceException.builder()
.awsErrorDetails(AwsErrorDetails.builder()
.errorCode("AccessDenied")
.errorMessage("credentials have expired")
.build())
.build();
TestContext context = new TestContext(request, response, error);
execute(context, createAttributes("EC2", "DescribeInstances"), millis(30));
Assertions.assertEquals(1, registry.timers().count());
Timer t = registry.timers().findFirst().orElse(null);
Assertions.assertNotNull(t);
Assertions.assertEquals(1, t.count());
Assertions.assertEquals(millis(30), t.totalTime());
Assertions.assertEquals("403", get(t.id(), "http.status"));
Assertions.assertEquals("AccessDenied", get(t.id(), "ipc.status.detail"));
}
示例8
@Test
public void afterUnmarshalling_putObjectRequest_shouldValidateChecksum() {
SdkHttpResponse sdkHttpResponse = getSdkHttpResponseWithChecksumHeader();
PutObjectResponse response = PutObjectResponse.builder()
.eTag(VALID_CHECKSUM)
.build();
PutObjectRequest putObjectRequest = PutObjectRequest.builder()
.build();
SdkHttpRequest sdkHttpRequest = SdkHttpFullRequest.builder()
.uri(URI.create("http://localhost:8080"))
.method(SdkHttpMethod.PUT)
.build();
Context.AfterUnmarshalling afterUnmarshallingContext =
InterceptorTestUtils.afterUnmarshallingContext(putObjectRequest, sdkHttpRequest, response, sdkHttpResponse);
interceptor.afterUnmarshalling(afterUnmarshallingContext, getExecutionAttributesWithChecksum());
}
示例9
@Test
public void afterUnmarshalling_putObjectRequest_with_SSE_shouldNotValidateChecksum() {
SdkHttpResponse sdkHttpResponse = getSdkHttpResponseWithChecksumHeader();
PutObjectResponse response = PutObjectResponse.builder()
.eTag(INVALID_CHECKSUM)
.build();
PutObjectRequest putObjectRequest = PutObjectRequest.builder().build();
SdkHttpRequest sdkHttpRequest = SdkHttpFullRequest.builder()
.putHeader(SERVER_SIDE_ENCRYPTION_HEADER, AWS_KMS.toString())
.putHeader("x-amz-server-side-encryption-aws-kms-key-id", ENABLE_MD5_CHECKSUM_HEADER_VALUE)
.uri(URI.create("http://localhost:8080"))
.method(SdkHttpMethod.PUT)
.build();
Context.AfterUnmarshalling afterUnmarshallingContext =
InterceptorTestUtils.afterUnmarshallingContext(putObjectRequest, sdkHttpRequest, response, sdkHttpResponse);
interceptor.afterUnmarshalling(afterUnmarshallingContext, getExecutionAttributesWithChecksum());
}
示例10
private AwsServiceException exception(int clientSideTimeOffset, String errorCode, int statusCode, String serverDate) {
SdkHttpResponse httpResponse =
SdkHttpFullResponse.builder()
.statusCode(statusCode)
.applyMutation(r -> {
if (serverDate != null) {
r.putHeader("Date", serverDate);
}
})
.build();
AwsErrorDetails errorDetails =
AwsErrorDetails.builder()
.errorCode(errorCode)
.sdkHttpResponse(httpResponse)
.build();
return AwsServiceException.builder()
.clockSkew(Duration.ofSeconds(clientSideTimeOffset))
.awsErrorDetails(errorDetails)
.statusCode(statusCode)
.build();
}
示例11
@Test
public void successfulExecutionCallsResponseHandler() throws Exception {
SdkResponse expected = VoidSdkResponse.builder().build();
Map<String, List<String>> headers = new HashMap<>();
headers.put("foo", Arrays.asList("bar"));
// Given
expectRetrievalFromMocks();
when(httpClientCall.call()).thenReturn(HttpExecuteResponse.builder()
.response(SdkHttpResponse.builder()
.statusCode(200)
.headers(headers)
.build())
.build()); // Successful HTTP call
when(responseHandler.handle(any(), any())).thenReturn(expected); // Response handler call
// When
SdkResponse actual = syncClientHandler.execute(clientExecutionParams());
// Then
verifyNoMoreInteractions(errorResponseHandler); // No error handler calls
assertThat(actual.sdkHttpResponse().statusCode()).isEqualTo(200);
assertThat(actual.sdkHttpResponse().headers()).isEqualTo(headers);
}
示例12
public InterceptorContext modifyHttpResponse(InterceptorContext context,
ExecutionAttributes executionAttributes) {
InterceptorContext result = context;
for (int i = interceptors.size() - 1; i >= 0; i--) {
SdkHttpResponse interceptorResult =
interceptors.get(i).modifyHttpResponse(result, executionAttributes);
validateInterceptorResult(result.httpResponse(), interceptorResult, interceptors.get(i), "modifyHttpResponse");
InputStream response = interceptors.get(i).modifyHttpResponseContent(result, executionAttributes).orElse(null);
result = result.toBuilder().httpResponse(interceptorResult).responseBody(response).build();
}
return result;
}
示例13
@Test
public void badRequest() {
final AmazonWebServicesClientProxy proxy = new AmazonWebServicesClientProxy(mock(LoggerProxy.class), MOCK,
() -> Duration.ofMinutes(2).toMillis() // just
// keep
// going
);
final Model model = new Model();
model.setRepoName("NewRepo");
final StdCallbackContext context = new StdCallbackContext();
final SdkHttpResponse sdkHttpResponse = mock(SdkHttpResponse.class);
when(sdkHttpResponse.statusCode()).thenReturn(400);
final ProgressEvent<Model,
StdCallbackContext> result = proxy
.initiate("client:createRespository", proxy.newProxy(() -> mock(ServiceClient.class)), model, context)
.translateToServiceRequest(m -> new CreateRequest.Builder().repoName(m.getRepoName()).build())
.makeServiceCall((r, c) -> {
throw new BadRequestException(mock(AwsServiceException.Builder.class)) {
private static final long serialVersionUID = 1L;
@Override
public AwsErrorDetails awsErrorDetails() {
return AwsErrorDetails.builder().errorCode("BadRequest").errorMessage("Bad Parameter in request")
.sdkHttpResponse(sdkHttpResponse).build();
}
};
}).done(o -> ProgressEvent.success(model, context));
assertThat(result.getStatus()).isEqualTo(OperationStatus.FAILED);
assertThat(result.getMessage()).contains("BadRequest");
}
示例14
@Test
public void accessDenied() {
final AmazonWebServicesClientProxy proxy = new AmazonWebServicesClientProxy(mock(LoggerProxy.class), MOCK,
() -> Duration.ofMinutes(2).toMillis() // just
// keep
// going
);
final Model model = new Model();
model.setRepoName("NewRepo");
final StdCallbackContext context = new StdCallbackContext();
final SdkHttpResponse sdkHttpResponse = mock(SdkHttpResponse.class);
when(sdkHttpResponse.statusCode()).thenReturn(401);
ProgressEvent<Model,
StdCallbackContext> result = proxy
.initiate("client:createRespository", proxy.newProxy(() -> mock(ServiceClient.class)), model, context)
.translateToServiceRequest(m -> new CreateRequest.Builder().repoName(m.getRepoName()).build())
.makeServiceCall((r, c) -> {
throw new AccessDenied(AwsServiceException.builder()) {
private static final long serialVersionUID = 1L;
@Override
public AwsErrorDetails awsErrorDetails() {
return AwsErrorDetails.builder().errorCode("AccessDenied: 401").errorMessage("Token Invalid")
.sdkHttpResponse(sdkHttpResponse).build();
}
};
}).done(o -> ProgressEvent.success(model, context));
assertThat(result.getStatus()).isEqualTo(OperationStatus.FAILED);
assertThat(result.getMessage()).contains("AccessDenied");
}
示例15
@Override
public GetTopicAttributesResponse getTopicAttributes(
GetTopicAttributesRequest topicAttributesRequest) {
GetTopicAttributesResponse response = Mockito.mock(GetTopicAttributesResponse.class);
SdkHttpResponse metadata = Mockito.mock(SdkHttpResponse.class);
Mockito.when(metadata.statusCode()).thenReturn(200);
Mockito.when(response.sdkHttpResponse()).thenReturn(metadata);
return response;
}
示例16
@Override
public void afterTransmission(Context.AfterTransmission context, ExecutionAttributes attrs) {
SdkHttpResponse response = context.httpResponse();
IpcLogEntry logEntry = attrs.getAttribute(LOG_ENTRY)
.markEnd()
.withHttpStatus(response.statusCode());
attrs.putAttribute(STATUS_IS_SET, true);
response.headers().forEach((k, vs) -> vs.forEach(v -> logEntry.addResponseHeader(k, v)));
}
示例17
private String extractRequestIdFromHttp(SdkHttpResponse httpResponse) {
Map<String, List<String>> headers = httpResponse.headers();
Set<String> headerKeys = headers.keySet();
String requestIdKey = headerKeys
.stream()
.filter(key -> REQUEST_ID_KEYS.contains(key.toLowerCase()))
.findFirst()
.orElse(null);
return requestIdKey != null ? headers.get(requestIdKey).get(0) : null;
}
示例18
@Override
public GetTopicAttributesResponse getTopicAttributes(
GetTopicAttributesRequest topicAttributesRequest) {
GetTopicAttributesResponse response = Mockito.mock(GetTopicAttributesResponse.class);
SdkHttpResponse metadata = Mockito.mock(SdkHttpResponse.class);
Mockito.when(metadata.statusCode()).thenReturn(200);
Mockito.when(response.sdkHttpResponse()).thenReturn(metadata);
return response;
}
示例19
public DownloadFailedException(SdkResponse response) {
SdkHttpResponse httpResponse = response.sdkHttpResponse();
if (httpResponse != null) {
this.statusCode = httpResponse.statusCode();
this.statusText = httpResponse.statusText();
} else {
this.statusCode = HttpStatus.INTERNAL_SERVER_ERROR.value();
this.statusText = Optional.of("UNKNOWN");
}
}
示例20
HttpClientResponse(
@Nullable SdkHttpRequest request,
@Nullable SdkHttpResponse response,
@Nullable Throwable error
) {
if (response == null && error == null) {
throw new NullPointerException("response == null && error == null");
}
this.request = request;
this.response = response;
this.error = error;
}
示例21
private SdkHttpClient mockSdkHttpClient(SdkHttpResponse response, String body) throws Exception {
ExecutableHttpRequest abortableCallable = Mockito.mock(ExecutableHttpRequest.class);
SdkHttpClient mockClient = Mockito.mock(SdkHttpClient.class);
Mockito.when(mockClient.prepareRequest(Mockito.any())).thenReturn(abortableCallable);
Mockito.when(abortableCallable.call()).thenReturn(HttpExecuteResponse.builder()
.response(response)
.responseBody(AbortableInputStream.create(
new ByteArrayInputStream(body.getBytes(StandardCharsets.UTF_8))
))
.build()
);
return mockClient;
}
示例22
private SdkAsyncHttpClient mockSdkAsyncHttpClient(SdkHttpResponse response) {
SdkAsyncHttpClient mockClient = Mockito.mock(SdkAsyncHttpClient.class);
Mockito.when(mockClient.execute(Mockito.any(AsyncExecuteRequest.class)))
.thenAnswer((Answer<CompletableFuture<Void>>) invocationOnMock -> {
AsyncExecuteRequest request = invocationOnMock.getArgument(0);
SdkAsyncHttpResponseHandler handler = request.responseHandler();
handler.onHeaders(response);
handler.onStream(new EmptyPublisher<>());
return CompletableFuture.completedFuture(null);
});
return mockClient;
}
示例23
private SdkHttpResponse generateLambdaInvokeResponse(int statusCode) {
return SdkHttpResponse.builder()
.statusCode(statusCode)
.putHeader("x-amz-request-id", "1111-2222-3333-4444")
.putHeader("x-amz-id-2", "extended")
.putHeader("Content-Length", "2")
.putHeader("X-Amz-Function-Error", "Failure")
.build();
}
示例24
private static SdkHttpResponse convert(ResponseHeaders headers) {
SdkHttpResponse.Builder builder =
SdkHttpResponse.builder()
.statusCode(headers.status().code())
.statusText(headers.status().reasonPhrase());
fillHeaders(headers, builder);
return builder.build();
}
示例25
private void verifyHttpMetadata(SubscribeToShardResponse response) {
SdkHttpResponse sdkHttpResponse = response.sdkHttpResponse();
assertThat(sdkHttpResponse).isNotNull();
assertThat(sdkHttpResponse.isSuccessful()).isTrue();
assertThat(sdkHttpResponse.headers()).isNotEmpty();
assertThat(response.responseMetadata()).isNotNull();
assertThat(response.responseMetadata().extendedRequestId()).isNotEqualTo("UNKNOWN");
assertThat(response.responseMetadata().requestId()).isNotEqualTo("UNKNOWN");
}
示例26
@Test
public void responseChecksumIsValid_serverSideCustomerEncryption_false() {
SdkHttpResponse response = SdkHttpResponse.builder()
.putHeader(SERVER_SIDE_CUSTOMER_ENCRYPTION_HEADER, "test")
.build();
assertThat(responseChecksumIsValid(response)).isFalse();
}
示例27
@Test
public void responseChecksumIsValid_serverSideEncryption_false() {
SdkHttpResponse response = SdkHttpResponse.builder()
.putHeader(SERVER_SIDE_ENCRYPTION_HEADER, AWS_KMS.toString())
.build();
assertThat(responseChecksumIsValid(response)).isFalse();
}
示例28
@Before
public void setup() throws Exception {
when(sdkHttpClient.prepareRequest(any())).thenReturn(abortableCallable);
httpClient = HttpTestUtils.testClientBuilder().httpClient(sdkHttpClient)
.apiCallTimeout(Duration.ofMillis(1000))
.build();
when(abortableCallable.call()).thenReturn(HttpExecuteResponse.builder().response(SdkHttpResponse.builder()
.statusCode(200)
.build())
.build());
}
示例29
/**
* Returns the recommended clock adjustment that should be used for future requests (in seconds). The result has the same
* semantics of {@link HttpClientDependencies#timeOffset()}. Positive values imply the client clock is "fast" and negative
* values imply the client clock is "slow".
*/
public Integer getAdjustmentInSeconds(SdkHttpResponse response) {
Instant now = Instant.now();
Instant serverTime = ClockSkew.getServerTime(response).orElse(null);
Duration skew = ClockSkew.getClockSkew(now, serverTime);
try {
return Math.toIntExact(skew.getSeconds());
} catch (ArithmeticException e) {
log.warn(() -> "The clock skew between the client and server was too large to be compensated for (" + now +
" versus " + serverTime + ").");
return 0;
}
}
示例30
@Test
public void modifyAsyncHttpResponseContent_getObjectRequest_responseDoesNotContainChecksum_shouldNotModify() {
ExecutionAttributes executionAttributes = getExecutionAttributesWithChecksumDisabled();
SdkHttpResponse sdkHttpResponse = SdkHttpResponse.builder()
.putHeader(CONTENT_LENGTH_HEADER, "100")
.build();
Context.ModifyHttpResponse modifyHttpResponse =
InterceptorTestUtils.modifyHttpResponse(GetObjectRequest.builder().build(), sdkHttpResponse);
Optional<Publisher<ByteBuffer>> publisher = interceptor.modifyAsyncHttpResponseContent(modifyHttpResponse,
executionAttributes);
assertThat(publisher).isEqualTo(modifyHttpResponse.responsePublisher());
}