use of com.amazonaws.transform.JsonUnmarshallerContext 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);
}
}
}
}
use of com.amazonaws.transform.JsonUnmarshallerContext in project aws-sdk-android by aws-amplify.
the class JsonResponseHandlerTest method testHandleWithNoCRC32.
@Test
public void testHandleWithNoCRC32() throws Exception {
ByteArrayInputStream bais = new ByteArrayInputStream("{\"key\" :\"Content\"}".getBytes(StringUtils.UTF8));
HttpResponse response = new HttpResponse.Builder().statusText("testResponse").statusCode(200).header("testKey", "testValue").content(bais).build();
Unmarshaller<String, JsonUnmarshallerContext> unmarshaller = new Unmarshaller<String, JsonUnmarshallerContext>() {
@Override
public String unmarshall(JsonUnmarshallerContext in) throws Exception {
in.getReader().beginObject();
in.getReader().nextName();
return in.getReader().nextString();
}
};
JsonResponseHandler<String> toTest = new JsonResponseHandler<String>(unmarshaller);
AmazonWebServiceResponse<String> awsResponse = toTest.handle(response);
assertEquals(awsResponse.getResult(), "Content");
}
use of com.amazonaws.transform.JsonUnmarshallerContext in project aws-sdk-android by aws-amplify.
the class JsonResponseHandlerTest method testHandleNeedsConnectionLeftOpen.
@Test
public void testHandleNeedsConnectionLeftOpen() throws Exception {
ByteArrayInputStream bais = new ByteArrayInputStream("{\"key\" :\"Content\"}".getBytes(StringUtils.UTF8));
CRC32 crc32 = new CRC32();
crc32.update("{\"key\" :\"Content\"}".getBytes(StringUtils.UTF8));
HttpResponse response = new HttpResponse.Builder().statusText("testResponse").statusCode(200).header("testKey", "testValue").content(bais).build();
final List<InputStream> capture = new ArrayList<InputStream>();
Unmarshaller<String, JsonUnmarshallerContext> unmarshaller = new Unmarshaller<String, JsonUnmarshallerContext>() {
@Override
public String unmarshall(JsonUnmarshallerContext in) throws Exception {
capture.add(in.getHttpResponse().getContent());
return "OpenConnection";
}
};
JsonResponseHandler<String> toTest = new JsonResponseHandler<String>(unmarshaller);
toTest.needsConnectionLeftOpen = true;
assertTrue(toTest.needsConnectionLeftOpen());
AmazonWebServiceResponse<String> awsResponse = toTest.handle(response);
assertEquals(awsResponse.getResult(), "OpenConnection");
assertSame(capture.get(0), bais);
}
use of com.amazonaws.transform.JsonUnmarshallerContext in project aws-sdk-android by aws-amplify.
the class JsonResponseHandlerTest method testHandleWithCRC32.
@Test
public void testHandleWithCRC32() throws Exception {
ByteArrayInputStream bais = new ByteArrayInputStream("{\"key\" :\"Content\"}".getBytes(StringUtils.UTF8));
CRC32 crc32 = new CRC32();
crc32.update("{\"key\" :\"Content\"}".getBytes(StringUtils.UTF8));
HttpResponse response = new HttpResponse.Builder().statusText("testResponse").statusCode(200).header("testKey", "testValue").header("x-amz-crc32", String.valueOf(crc32.getValue())).content(bais).build();
Unmarshaller<String, JsonUnmarshallerContext> unmarshaller = new Unmarshaller<String, JsonUnmarshallerContext>() {
@Override
public String unmarshall(JsonUnmarshallerContext in) throws Exception {
in.getReader().beginObject();
in.getReader().nextName();
return in.getReader().nextString();
}
};
JsonResponseHandler<String> toTest = new JsonResponseHandler<String>(unmarshaller);
// Is a no-op. just adding for code coverage of the no-op
toTest.registerAdditionalMetadataExpressions(null);
AmazonWebServiceResponse<String> awsResponse = toTest.handle(response);
assertEquals(awsResponse.getResult(), "Content");
}
use of com.amazonaws.transform.JsonUnmarshallerContext in project aws-sdk-android by aws-amplify.
the class JsonUnmarshallerTest method setupUnmarshaller.
private JsonUnmarshallerContext setupUnmarshaller(String snippet) throws Exception {
AwsJsonReader jsonReader = JsonUtils.getJsonReader(new StringReader(snippet));
JsonUnmarshallerContext unmarshallerContext = new JsonUnmarshallerContext(jsonReader);
return unmarshallerContext;
}
Aggregations