use of com.amazonaws.util.CRC32ChecksumCalculatingInputStream in project aws-sdk-android by aws-amplify.
the class JsonResponseHandler method handle.
/**
* @see com.amazonaws.http.HttpResponseHandler#handle(com.amazonaws.http.HttpResponse)
*/
@Override
public AmazonWebServiceResponse<T> handle(HttpResponse response) throws Exception {
log.trace("Parsing service response JSON");
final String crc32Checksum = response.getHeaders().get("x-amz-crc32");
// Get the raw content input stream to calculate the crc32 checksum on
// gzipped data.
InputStream content = response.getRawContent();
if (content == null) {
// An empty input stream to avoid NPE
content = new ByteArrayInputStream("{}".getBytes(StringUtils.UTF8));
}
log.debug("CRC32Checksum = " + crc32Checksum);
log.debug("content encoding = " + response.getHeaders().get("Content-Encoding"));
boolean isGzipEncoded = "gzip".equals(response.getHeaders().get("Content-Encoding"));
CRC32ChecksumCalculatingInputStream checksumCalculatingInputStream = null;
// encoded, no checksum) is already handled: we'll just operate on the raw content stream.
if (crc32Checksum != null) {
checksumCalculatingInputStream = new CRC32ChecksumCalculatingInputStream(content);
content = checksumCalculatingInputStream;
}
if (isGzipEncoded) {
content = new GZIPInputStream(content);
}
final AwsJsonReader jsonReader = JsonUtils.getJsonReader(new InputStreamReader(content, StringUtils.UTF8));
try {
final AmazonWebServiceResponse<T> awsResponse = new AmazonWebServiceResponse<T>();
final JsonUnmarshallerContext unmarshallerContext = new JsonUnmarshallerContext(jsonReader, response);
final T result = responseUnmarshaller.unmarshall(unmarshallerContext);
if (checksumCalculatingInputStream != null) {
final long serverSideCRC = Long.parseLong(crc32Checksum);
final long clientSideCRC = checksumCalculatingInputStream.getCRC32Checksum();
if (clientSideCRC != serverSideCRC) {
throw new CRC32MismatchException("Client calculated crc32 checksum didn't match that calculated by server side");
}
}
awsResponse.setResult(result);
final Map<String, String> metadata = new HashMap<String, String>();
metadata.put(ResponseMetadata.AWS_REQUEST_ID, response.getHeaders().get("x-amzn-RequestId"));
awsResponse.setResponseMetadata(new ResponseMetadata(metadata));
log.trace("Done parsing service response");
return awsResponse;
} finally {
if (!needsConnectionLeftOpen) {
try {
jsonReader.close();
} catch (final IOException e) {
log.warn("Error closing json parser", e);
}
}
}
}
Aggregations