use of com.enonic.xp.exception.ThrottlingException in project xp by enonic.
the class ImageHandlerWorker method execute.
@Override
public PortalResponse execute() throws Exception {
final Media content = getImage(this.contentId);
final String contentName = content.getName().toString();
final boolean contentNameEquals = contentName.equals(this.name);
if (!(contentNameEquals || contentName.equals(Files.getNameWithoutExtension(this.name)))) {
throw WebException.notFound(String.format("Image [%s] not found for content [%s]", this.name, this.contentId));
}
final Attachment attachment = content.getMediaAttachment();
if (attachment == null) {
throw WebException.notFound(String.format("Attachment [%s] not found", content.getName()));
}
final BinaryReference binaryReference = attachment.getBinaryReference();
final ByteSource binary = this.contentService.getBinary(this.contentId, binaryReference);
if (binary == null) {
throw WebException.notFound(String.format("Binary [%s] not found for content [%s]", binaryReference, this.contentId));
}
if (request.getMethod() == HttpMethod.OPTIONS) {
// it will be handled by default OPTIONS handler in BaseWebHandler
return PortalResponse.create().status(HttpStatus.METHOD_NOT_ALLOWED).build();
}
final String attachmentMimeType = attachment.getMimeType();
final PortalResponse.Builder portalResponse = PortalResponse.create();
if ("svgz".equals(attachment.getExtension())) {
portalResponse.contentType(MediaType.SVG_UTF_8.withoutParameters());
portalResponse.header("Content-Encoding", "gzip");
portalResponse.body(binary);
} else if (attachmentMimeType.equals("image/svg+xml") || attachmentMimeType.equals("image/gif")) {
portalResponse.contentType(MediaType.parse(attachmentMimeType));
portalResponse.body(binary);
} else {
final ImageOrientation imageOrientation = Objects.requireNonNullElseGet(content.getOrientation(), () -> Objects.requireNonNullElse(mediaInfoService.getImageOrientation(binary), ImageOrientation.TopLeft));
final MediaType mimeType = contentNameEquals ? MediaType.parse(attachmentMimeType) : MediaTypes.instance().fromFile(this.name);
portalResponse.contentType(mimeType);
try {
final ReadImageParams readImageParams = ReadImageParams.newImageParams().contentId(this.contentId).binaryReference(binaryReference).cropping(content.getCropping()).scaleParams(this.scaleParams).focalPoint(content.getFocalPoint()).filterParam(this.filterParam).backgroundColor(getBackgroundColor()).mimeType(mimeType.toString()).quality(getImageQuality()).orientation(imageOrientation).build();
portalResponse.body(this.imageService.readImage(readImageParams));
} catch (IllegalArgumentException e) {
throw new WebException(HttpStatus.BAD_REQUEST, "Invalid parameters", e);
} catch (ThrottlingException e) {
throw new WebException(HttpStatus.TOO_MANY_REQUESTS, "Try again later", e);
}
}
if (!nullToEmpty(this.fingerprint).isBlank()) {
final boolean isPublic = content.getPermissions().isAllowedFor(RoleKeys.EVERYONE, Permission.READ) && ContentConstants.BRANCH_MASTER.equals(request.getBranch());
final String cacheControlHeaderConfig = isPublic ? publicCacheControlHeaderConfig : privateCacheControlHeaderConfig;
if (!nullToEmpty(cacheControlHeaderConfig).isBlank() && this.fingerprint.equals(resolveHash(content))) {
portalResponse.header(HttpHeaders.CACHE_CONTROL, cacheControlHeaderConfig);
}
}
final Trace trace = Tracer.current();
if (trace != null) {
trace.put("contentPath", content.getPath());
trace.put("type", "image");
}
return portalResponse.build();
}
Aggregations