/** * Create the default {@link AwsResponseMetadata}. */ private AwsResponseMetadata generateResponseMetadata(SdkHttpResponse response) { Map<String, String> metadata = new HashMap<>(); metadata.put(AWS_REQUEST_ID, response.firstMatchingHeader(X_AMZN_REQUEST_ID_HEADER).orElse(null)); response.headers().forEach((key, value) -> metadata.put(key, value.get(0))); return DefaultAwsResponseMetadata.create(metadata); } }
private static SdkHttpFullResponse toFullResponse(SdkHttpResponse response) { SdkHttpFullResponse.Builder builder = SdkHttpFullResponse.builder() .statusCode(response.statusCode()) .headers(response.headers()); response.statusText().ifPresent(builder::statusText); return builder.build(); } }
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; }
/** * If we get back any 2xx status code, then we know we should treat the service call as successful. */ default boolean isSuccessful() { return HttpStatusFamily.of(statusCode()) == HttpStatusFamily.SUCCESSFUL; }
private void validateResponse(HttpExecuteResponse response, int returnCode, SdkHttpMethod method) throws IOException { RequestMethod requestMethod = RequestMethod.fromString(method.name()); RequestPatternBuilder patternBuilder = RequestPatternBuilder.newRequestPattern(requestMethod, urlMatching("/")) .withHeader("Host", containing("localhost")) .withHeader("User-Agent", equalTo("hello-world!")); if (method == SdkHttpMethod.HEAD) { patternBuilder.withRequestBody(equalTo("")); } else { patternBuilder.withRequestBody(equalTo("Body")); } verify(1, patternBuilder); if (method == SdkHttpMethod.HEAD) { assertThat(response.responseBody()).isEmpty(); } else { assertThat(IoUtils.toUtf8String(response.responseBody().orElse(null))).isEqualTo("hello"); } assertThat(response.httpResponse().firstMatchingHeader("Some-Header")).contains("With Value"); assertThat(response.httpResponse().statusCode()).isEqualTo(returnCode); mockServer.resetMappings(); }
@Override public void onResponse(SdkResponse response) { if (response != null && response.sdkHttpResponse() != null) { this.requestId = response.sdkHttpResponse() .firstMatchingHeader(X_AMZN_REQUEST_ID_HEADER) .orElse(null); this.extendedRequestId = response.sdkHttpResponse() .firstMatchingHeader(X_AMZ_ID_2_HEADER) .orElse(null); } }
private String extractExtendedRequestIdFromHttp(SdkHttpResponse httpResponse) { Map<String, List<String>> headers = httpResponse.headers(); return headers.containsKey(EntityHeaderKeys.AWS.EXTENDED_REQUEST_ID_HEADER) ? headers.get(EntityHeaderKeys.AWS.EXTENDED_REQUEST_ID_HEADER).get(0) : null; }
/** * Creates and initializes an HttpResponse object suitable to be passed to an HTTP response * handler object. * * @return The new, initialized HttpResponse object ready to be passed to an HTTP response handler object. * @throws IOException If there were any problems getting any response information from the * HttpClient method object. */ private HttpExecuteResponse createResponse(org.apache.http.HttpResponse apacheHttpResponse, HttpRequestBase apacheRequest) throws IOException { SdkHttpResponse response = SdkHttpResponse.builder() .statusCode(apacheHttpResponse.getStatusLine().getStatusCode()) .statusText(apacheHttpResponse.getStatusLine().getReasonPhrase()) .headers(transformHeaders(apacheHttpResponse)) .build(); AbortableInputStream responseBody = apacheHttpResponse.getEntity() != null ? toAbortableInputStream(apacheHttpResponse, apacheRequest) : null; return HttpExecuteResponse.builder().response(response).responseBody(responseBody).build(); }
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; }
/** * If we get back any 2xx status code, then we know we should treat the service call as successful. */ default boolean isSuccessful() { return HttpStatusFamily.of(statusCode()) == HttpStatusFamily.SUCCESSFUL; }
@Override public Optional<InputStream> modifyHttpResponseContent(Context.ModifyHttpResponse context, ExecutionAttributes executionAttributes) { if (getObjectChecksumEnabledPerResponse(context.request(), context.httpResponse()) && context.responseBody().isPresent()) { SdkChecksum checksum = new Md5Checksum(); long contentLength = context.httpResponse() .firstMatchingHeader(CONTENT_LENGTH_HEADER) .map(Long::parseLong) .orElse(0L); if (contentLength > 0) { return Optional.of(new ChecksumValidatingInputStream(context.responseBody().get(), checksum, contentLength)); } } return context.responseBody(); }
private String extractExtendedRequestIdFromHttp(SdkHttpResponse httpResponse) { Map<String, List<String>> headers = httpResponse.headers(); return headers.containsKey(EntityHeaderKeys.AWS.EXTENDED_REQUEST_ID_HEADER) ? headers.get(EntityHeaderKeys.AWS.EXTENDED_REQUEST_ID_HEADER).get(0) : null; }
@Override public HttpExecuteResponse call() throws IOException { connection.connect(); request.contentStreamProvider().ifPresent(provider -> invokeSafely(() -> IoUtils.copy(provider.newStream(), connection.getOutputStream()))); int responseCode = connection.getResponseCode(); boolean isErrorResponse = HttpStatusFamily.of(responseCode).isOneOf(CLIENT_ERROR, SERVER_ERROR); InputStream content = !isErrorResponse ? connection.getInputStream() : connection.getErrorStream(); AbortableInputStream responseBody = content != null ? AbortableInputStream.create(content) : null; return HttpExecuteResponse.builder() .response(SdkHttpResponse.builder() .statusCode(responseCode) .statusText(connection.getResponseMessage()) // TODO: Don't ignore abort? .headers(extractHeaders(connection)) .build()) .responseBody(responseBody) .build(); }
/** * Create the default {@link AwsResponseMetadata}. This might be wrapped by a service * specific metadata object to provide modeled access to additional metadata. (See S3 and Kinesis). */ private AwsResponseMetadata generateResponseMetadata(SdkHttpResponse response, Map<String, String> metadata) { if (!metadata.containsKey(AWS_REQUEST_ID)) { metadata.put(AWS_REQUEST_ID, response.firstMatchingHeader(X_AMZN_REQUEST_ID_HEADER).orElse(null)); } response.headers().forEach((key, value) -> metadata.put(key, value.get(0))); return DefaultAwsResponseMetadata.create(metadata); }
public FeatureState retrieveFeatureStateFromS3(final Feature feature) { final GetObjectRequest getRequest = GetObjectRequest.builder() .bucket(togglzProperties.getS3().getBucketName()) .key(keyForFeature(feature)) .build(); try (final ResponseInputStream<GetObjectResponse> responseStream = s3Client.getObject(getRequest)) { if (responseStream != null) { final FeatureStateStorageWrapper wrapper = objectMapper.reader() .forType(FeatureStateStorageWrapper.class) .readValue(responseStream); return FeatureStateStorageWrapper.featureStateForWrapper(feature, wrapper); } } catch (final S3Exception ae) { if (ERR_NO_SUCH_KEY.equals(ae.awsErrorDetails().errorCode()) || ae.awsErrorDetails().sdkHttpResponse().statusCode() == 404) { return null; } throw ae; } catch (final IOException e) { throw new RuntimeException("Failed to get the feature state", e); } return null; }
@Override public Optional<Publisher<ByteBuffer>> modifyAsyncHttpResponseContent(Context.ModifyHttpResponse context, ExecutionAttributes executionAttributes) { if (getObjectChecksumEnabledPerResponse(context.request(), context.httpResponse()) && context.responsePublisher().isPresent()) { long contentLength = context.httpResponse() .firstMatchingHeader(CONTENT_LENGTH_HEADER) .map(Long::parseLong) .orElse(0L); SdkChecksum checksum = new Md5Checksum(); executionAttributes.putAttribute(CHECKSUM, checksum); if (contentLength > 0) { return Optional.of(new ChecksumValidatingPublisher(context.responsePublisher().get(), checksum, contentLength)); } } return context.responsePublisher(); }
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; }
private HttpExecuteResponse errorResponse(String protocol) { return HttpExecuteResponse.builder() .response(SdkHttpResponse.builder() .statusCode(500) .build()) .responseBody(generateContent(protocol)) .build(); }
/** * Create the default {@link AwsResponseMetadata}. This might be wrapped by a service * specific metadata object to provide modeled access to additional metadata. (See S3 and Kinesis). */ private AwsResponseMetadata generateResponseMetadata(SdkHttpResponse response) { Map<String, String> metadata = new HashMap<>(); metadata.put(AWS_REQUEST_ID, response.firstMatchingHeader(X_AMZN_REQUEST_ID_HEADER).orElse(null)); response.headers().forEach((key, value) -> metadata.put(key, value.get(0))); return DefaultAwsResponseMetadata.create(metadata); }
} catch (AwsServiceException awsServiceException) { if (holdLockOnServiceUnavailable && awsServiceException.awsErrorDetails().sdkHttpResponse().statusCode() == HttpStatusCode.SERVICE_UNAVAILABLE) {