private int statusCode(SdkHttpFullResponse response, Optional<ExceptionMetadata> modeledExceptionMetadata) { if (response.statusCode() != 0) { return response.statusCode(); } return modeledExceptionMetadata.filter(m -> m.httpStatusCode() != null) .map(ExceptionMetadata::httpStatusCode) .orElse(500); }
private int statusCode(SdkHttpFullResponse response, Optional<ExceptionMetadata> modeledExceptionMetadata) { if (response.statusCode() != 0) { return response.statusCode(); } return modeledExceptionMetadata.filter(m -> m.httpStatusCode() != null) .map(ExceptionMetadata::httpStatusCode) .orElse(500); }
/** * Handles a successful response from a service call by unmarshalling the results using the * specified response handler. * * @return The contents of the response, unmarshalled using the specified response handler. * @throws IOException If any problems were encountered reading the response contents from * the HTTP method object. */ private OutputT handleSuccessResponse(SdkHttpFullResponse httpResponse, RequestExecutionContext context) throws IOException, InterruptedException { try { SdkStandardLogger.REQUEST_LOGGER.debug(() -> "Received successful response: " + httpResponse.statusCode()); return successResponseHandler.handle(httpResponse, context.executionAttributes()); } catch (IOException | InterruptedException | RetryableException e) { throw e; } catch (Exception e) { if (e instanceof SdkException && ((SdkException) e).retryable()) { throw (SdkException) e; } String errorMessage = "Unable to unmarshall response (" + e.getMessage() + "). Response Code: " + httpResponse.statusCode() + ", Response Text: " + httpResponse.statusText().orElse(null); throw SdkClientException.builder().message(errorMessage).cause(e).build(); } }
/** * Responsible for handling an error response, including unmarshalling the error response * into the most specific exception type possible, and throwing the exception. * * @throws IOException If any problems are encountering reading the error response. */ private SdkException handleErrorResponse(SdkHttpFullResponse httpResponse, RequestExecutionContext context) throws IOException, InterruptedException { try { SdkException exception = errorResponseHandler.handle(httpResponse, context.executionAttributes()); exception.fillInStackTrace(); SdkStandardLogger.REQUEST_LOGGER.debug(() -> "Received error response: " + exception); return exception; } catch (InterruptedException | IOException e) { throw e; } catch (Exception e) { String errorMessage = String.format("Unable to unmarshall error response (%s). " + "Response Code: %d, Response Text: %s", e.getMessage(), httpResponse.statusCode(), httpResponse.statusText().orElse("null")); throw SdkClientException.builder().message(errorMessage).cause(e).build(); } }
@Override public AwsServiceException handle(SdkHttpFullResponse response, ExecutionAttributes executionAttributes) { Pair<XmlElement, SdkBytes> xmlAndBytes = parseXml(response); XmlElement document = xmlAndBytes.left(); Optional<XmlElement> errorRoot = errorRootExtractor.apply(document); String errorCode = getErrorCode(errorRoot); AwsServiceException.Builder builder = errorRoot .map(e -> invokeSafely(() -> unmarshallFromErrorCode(response, e, errorCode))) .orElseGet(this::defaultException); AwsErrorDetails awsErrorDetails = AwsErrorDetails.builder() .errorCode(errorCode) .errorMessage(builder.message()) .rawResponse(xmlAndBytes.right()) .sdkHttpResponse(response) .serviceName(executionAttributes.getAttribute(AwsExecutionAttribute.SERVICE_NAME)) .build(); builder.requestId(getRequestId(response, document)) .statusCode(response.statusCode()) .awsErrorDetails(awsErrorDetails); return builder.build(); }
@Override public AwsServiceException handle(SdkHttpFullResponse response, ExecutionAttributes executionAttributes) { Pair<XmlElement, SdkBytes> xmlAndBytes = parseXml(response); XmlElement document = xmlAndBytes.left(); Optional<XmlElement> errorRoot = errorRootExtractor.apply(document); String errorCode = getErrorCode(errorRoot); AwsServiceException.Builder builder = errorRoot .map(e -> invokeSafely(() -> unmarshallFromErrorCode(response, e, errorCode))) .orElseGet(this::defaultException); AwsErrorDetails awsErrorDetails = AwsErrorDetails.builder() .errorCode(errorCode) .errorMessage(builder.message()) .rawResponse(xmlAndBytes.right()) .sdkHttpResponse(response) .serviceName(executionAttributes.getAttribute(AwsExecutionAttribute.SERVICE_NAME)) .build(); builder.requestId(getRequestId(response, document)) .statusCode(response.statusCode()) .awsErrorDetails(awsErrorDetails); return builder.build(); }
.retriesAttempted(retriesAttempted) .executionAttributes(context.executionAttributes()) .httpStatusCode(httpResponse == null ? null : httpResponse.statusCode()) .build();
private static XmlUnmarshallerRegistry createUnmarshallerRegistry() { return XmlUnmarshallerRegistry .builder() .statusCodeUnmarshaller(MarshallingType.INTEGER, (context, content, field) -> context.response().statusCode()) .headerUnmarshaller(MarshallingType.STRING, HeaderUnmarshaller.STRING) .headerUnmarshaller(MarshallingType.INTEGER, HeaderUnmarshaller.INTEGER) .headerUnmarshaller(MarshallingType.LONG, HeaderUnmarshaller.LONG) .headerUnmarshaller(MarshallingType.DOUBLE, HeaderUnmarshaller.DOUBLE) .headerUnmarshaller(MarshallingType.BOOLEAN, HeaderUnmarshaller.BOOLEAN) .headerUnmarshaller(MarshallingType.INSTANT, HeaderUnmarshaller.INSTANT) .headerUnmarshaller(MarshallingType.FLOAT, HeaderUnmarshaller.FLOAT) .headerUnmarshaller(MarshallingType.MAP, HeaderUnmarshaller.MAP) .payloadUnmarshaller(MarshallingType.STRING, XmlPayloadUnmarshaller.STRING) .payloadUnmarshaller(MarshallingType.INTEGER, XmlPayloadUnmarshaller.INTEGER) .payloadUnmarshaller(MarshallingType.LONG, XmlPayloadUnmarshaller.LONG) .payloadUnmarshaller(MarshallingType.FLOAT, XmlPayloadUnmarshaller.FLOAT) .payloadUnmarshaller(MarshallingType.DOUBLE, XmlPayloadUnmarshaller.DOUBLE) .payloadUnmarshaller(MarshallingType.BIG_DECIMAL, XmlPayloadUnmarshaller.BIG_DECIMAL) .payloadUnmarshaller(MarshallingType.BOOLEAN, XmlPayloadUnmarshaller.BOOLEAN) .payloadUnmarshaller(MarshallingType.INSTANT, XmlPayloadUnmarshaller.INSTANT) .payloadUnmarshaller(MarshallingType.SDK_BYTES, XmlPayloadUnmarshaller.SDK_BYTES) .payloadUnmarshaller(MarshallingType.SDK_POJO, XmlPayloadUnmarshaller::unmarshallSdkPojo) .payloadUnmarshaller(MarshallingType.LIST, XmlPayloadUnmarshaller::unmarshallList) .payloadUnmarshaller(MarshallingType.MAP, XmlPayloadUnmarshaller::unmarshallMap) .build(); }
private static XmlUnmarshallerRegistry createUnmarshallerRegistry() { return XmlUnmarshallerRegistry .builder() .statusCodeUnmarshaller(MarshallingType.INTEGER, (context, content, field) -> context.response().statusCode()) .headerUnmarshaller(MarshallingType.STRING, HeaderUnmarshaller.STRING) .headerUnmarshaller(MarshallingType.INTEGER, HeaderUnmarshaller.INTEGER) .headerUnmarshaller(MarshallingType.LONG, HeaderUnmarshaller.LONG) .headerUnmarshaller(MarshallingType.DOUBLE, HeaderUnmarshaller.DOUBLE) .headerUnmarshaller(MarshallingType.BOOLEAN, HeaderUnmarshaller.BOOLEAN) .headerUnmarshaller(MarshallingType.INSTANT, HeaderUnmarshaller.INSTANT) .headerUnmarshaller(MarshallingType.FLOAT, HeaderUnmarshaller.FLOAT) .headerUnmarshaller(MarshallingType.MAP, HeaderUnmarshaller.MAP) .payloadUnmarshaller(MarshallingType.STRING, XmlPayloadUnmarshaller.STRING) .payloadUnmarshaller(MarshallingType.INTEGER, XmlPayloadUnmarshaller.INTEGER) .payloadUnmarshaller(MarshallingType.LONG, XmlPayloadUnmarshaller.LONG) .payloadUnmarshaller(MarshallingType.FLOAT, XmlPayloadUnmarshaller.FLOAT) .payloadUnmarshaller(MarshallingType.DOUBLE, XmlPayloadUnmarshaller.DOUBLE) .payloadUnmarshaller(MarshallingType.BIG_DECIMAL, XmlPayloadUnmarshaller.BIG_DECIMAL) .payloadUnmarshaller(MarshallingType.BOOLEAN, XmlPayloadUnmarshaller.BOOLEAN) .payloadUnmarshaller(MarshallingType.INSTANT, XmlPayloadUnmarshaller.INSTANT) .payloadUnmarshaller(MarshallingType.SDK_BYTES, XmlPayloadUnmarshaller.SDK_BYTES) .payloadUnmarshaller(MarshallingType.SDK_POJO, XmlPayloadUnmarshaller::unmarshallSdkPojo) .payloadUnmarshaller(MarshallingType.LIST, XmlPayloadUnmarshaller::unmarshallList) .payloadUnmarshaller(MarshallingType.MAP, XmlPayloadUnmarshaller::unmarshallMap) .build(); }
private static JsonUnmarshallerRegistry createUnmarshallerRegistry( StringToValueConverter.StringToValue<Instant> instantStringToValue) { return JsonUnmarshallerRegistry .builder() .statusCodeUnmarshaller(MarshallingType.INTEGER, (context, json, f) -> context.response().statusCode()) .headerUnmarshaller(MarshallingType.STRING, HeaderUnmarshaller.STRING) .headerUnmarshaller(MarshallingType.INTEGER, HeaderUnmarshaller.INTEGER) .headerUnmarshaller(MarshallingType.LONG, HeaderUnmarshaller.LONG) .headerUnmarshaller(MarshallingType.DOUBLE, HeaderUnmarshaller.DOUBLE) .headerUnmarshaller(MarshallingType.BOOLEAN, HeaderUnmarshaller.BOOLEAN) .headerUnmarshaller(MarshallingType.INSTANT, HeaderUnmarshaller.createInstantHeaderUnmarshaller(instantStringToValue)) .headerUnmarshaller(MarshallingType.FLOAT, HeaderUnmarshaller.FLOAT) .payloadUnmarshaller(MarshallingType.STRING, new SimpleTypeJsonUnmarshaller<>(StringToValueConverter.TO_STRING)) .payloadUnmarshaller(MarshallingType.INTEGER, new SimpleTypeJsonUnmarshaller<>(StringToValueConverter.TO_INTEGER)) .payloadUnmarshaller(MarshallingType.LONG, new SimpleTypeJsonUnmarshaller<>(StringToValueConverter.TO_LONG)) .payloadUnmarshaller(MarshallingType.FLOAT, new SimpleTypeJsonUnmarshaller<>(StringToValueConverter.TO_FLOAT)) .payloadUnmarshaller(MarshallingType.DOUBLE, new SimpleTypeJsonUnmarshaller<>(StringToValueConverter.TO_DOUBLE)) .payloadUnmarshaller(MarshallingType.BIG_DECIMAL, new SimpleTypeJsonUnmarshaller<>( StringToValueConverter.TO_BIG_DECIMAL)) .payloadUnmarshaller(MarshallingType.BOOLEAN, new SimpleTypeJsonUnmarshaller<>(StringToValueConverter.TO_BOOLEAN)) .payloadUnmarshaller(MarshallingType.SDK_BYTES, JsonProtocolUnmarshaller::unmarshallSdkBytes) .payloadUnmarshaller(MarshallingType.INSTANT, new SimpleTypeJsonUnmarshaller<>(instantStringToValue)) .payloadUnmarshaller(MarshallingType.SDK_POJO, JsonProtocolUnmarshaller::unmarshallStructured) .payloadUnmarshaller(MarshallingType.LIST, JsonProtocolUnmarshaller::unmarshallList) .payloadUnmarshaller(MarshallingType.MAP, JsonProtocolUnmarshaller::unmarshallMap) .build(); }
private static JsonUnmarshallerRegistry createUnmarshallerRegistry( StringToValueConverter.StringToValue<Instant> instantStringToValue) { return JsonUnmarshallerRegistry .builder() .statusCodeUnmarshaller(MarshallingType.INTEGER, (context, json, f) -> context.response().statusCode()) .headerUnmarshaller(MarshallingType.STRING, HeaderUnmarshaller.STRING) .headerUnmarshaller(MarshallingType.INTEGER, HeaderUnmarshaller.INTEGER) .headerUnmarshaller(MarshallingType.LONG, HeaderUnmarshaller.LONG) .headerUnmarshaller(MarshallingType.DOUBLE, HeaderUnmarshaller.DOUBLE) .headerUnmarshaller(MarshallingType.BOOLEAN, HeaderUnmarshaller.BOOLEAN) .headerUnmarshaller(MarshallingType.INSTANT, HeaderUnmarshaller.createInstantHeaderUnmarshaller(instantStringToValue)) .headerUnmarshaller(MarshallingType.FLOAT, HeaderUnmarshaller.FLOAT) .payloadUnmarshaller(MarshallingType.STRING, new SimpleTypeJsonUnmarshaller<>(StringToValueConverter.TO_STRING)) .payloadUnmarshaller(MarshallingType.INTEGER, new SimpleTypeJsonUnmarshaller<>(StringToValueConverter.TO_INTEGER)) .payloadUnmarshaller(MarshallingType.LONG, new SimpleTypeJsonUnmarshaller<>(StringToValueConverter.TO_LONG)) .payloadUnmarshaller(MarshallingType.FLOAT, new SimpleTypeJsonUnmarshaller<>(StringToValueConverter.TO_FLOAT)) .payloadUnmarshaller(MarshallingType.DOUBLE, new SimpleTypeJsonUnmarshaller<>(StringToValueConverter.TO_DOUBLE)) .payloadUnmarshaller(MarshallingType.BIG_DECIMAL, new SimpleTypeJsonUnmarshaller<>( StringToValueConverter.TO_BIG_DECIMAL)) .payloadUnmarshaller(MarshallingType.BOOLEAN, new SimpleTypeJsonUnmarshaller<>(StringToValueConverter.TO_BOOLEAN)) .payloadUnmarshaller(MarshallingType.SDK_BYTES, JsonProtocolUnmarshaller::unmarshallSdkBytes) .payloadUnmarshaller(MarshallingType.INSTANT, new SimpleTypeJsonUnmarshaller<>(instantStringToValue)) .payloadUnmarshaller(MarshallingType.SDK_POJO, JsonProtocolUnmarshaller::unmarshallStructured) .payloadUnmarshaller(MarshallingType.LIST, JsonProtocolUnmarshaller::unmarshallList) .payloadUnmarshaller(MarshallingType.MAP, JsonProtocolUnmarshaller::unmarshallMap) .build(); }