in function/java11/src/main/java/com/amazon/s3objectlambda/request/GetObjectHandler.java [35:75]
public void handleRequest(S3ObjectLambdaEvent event, Context context) throws Exception {
var userRequest = event.getUserRequest();
var objectResponse = new ObjectResponse(S3_CLIENT, event);
// Validate user request and return error if invalid
var validationOutput = validateUserRequest(userRequest);
if (validationOutput.isPresent()) {
writeValidationFailedErrorResponse(validationOutput.get(), objectResponse);
return;
}
// Read the original object from Amazon S3
var presignedResponse = getS3ObjectResponse(event, userRequest);
// Errors in the Amazon S3 response should be forwarded to the caller without invoking transformObject.
if (presignedResponse.statusCode() >= 400) {
objectResponse.writeS3GetObjectErrorResponse(presignedResponse);
return;
}
var transformedObject = transformObjectResponse(presignedResponse.body().readAllBytes());
if (transformedObject.getHasError()) {
objectResponse.writeErrorResponse(transformedObject);
return;
}
/*
The most reliable way to handle Range or partNumber requests is to retrieve the full object from S3,
transform the object, and then apply the requested Range or partNumber parameters to the transformed object.
https://docs.aws.amazon.com/AmazonS3/latest/userguide/olap-writing-lambda.html#range-get-olap
Handle range or partNumber if present in the request
*/
var transformedObjectWithRange = applyRangeOrPartNumber(
transformedObject.getObjectResponse(),
userRequest);
if (transformedObjectWithRange.getHasError()) {
objectResponse.writeErrorResponse(transformedObjectWithRange);
return;
}
objectResponse.writeObjectResponse(presignedResponse, transformedObjectWithRange.getObjectResponse());
}