use of com.enonic.xp.portal.PortalResponse 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();
}
use of com.enonic.xp.portal.PortalResponse in project xp by enonic.
the class ComponentHandlerWorker method execute.
@Override
public PortalResponse execute() throws Exception {
final ContentResolverResult resolvedContent = contentResolver.resolve(this.request);
final Content content = resolvedContent.getContentOrElseThrow();
final Site site = resolvedContent.getNearestSiteOrElseThrow();
Page page = content.getPage();
final PageResolverResult resolvedPage = pageResolver.resolve(request.getMode(), content, site);
Component component = null;
if (content.getType().isFragment()) {
// fragment content, try resolving component path in Layout fragment
final Component fragmentComponent = page.getFragment();
if (this.componentPath.isEmpty()) {
component = fragmentComponent;
} else if (fragmentComponent instanceof LayoutComponent) {
component = ((LayoutComponent) fragmentComponent).getComponent(this.componentPath);
}
}
final Page effectivePage;
if (component == null) {
effectivePage = inlineFragments(resolvedPage.getEffectivePage(), this.componentPath);
component = effectivePage.getRegions().getComponent(this.componentPath);
} else {
effectivePage = resolvedPage.getEffectivePage();
}
if (component == null) {
throw WebException.notFound(String.format("Page component for [%s] not found", this.componentPath));
}
final Content effectiveContent = Content.create(content).page(effectivePage).build();
final DescriptorKey controller = resolvedPage.getController();
this.request.setSite(site);
this.request.setContent(effectiveContent);
this.request.setComponent(component);
this.request.setApplicationKey(controller != null ? controller.getApplicationKey() : null);
final Trace trace = Tracer.current();
if (trace != null) {
trace.put("componentPath", component.getPath());
trace.put("type", component.getType().toString());
}
final PortalResponse response = rendererDelegate.render(component, this.request);
return this.postProcessor.processResponseInstructions(this.request, response);
}
use of com.enonic.xp.portal.PortalResponse in project xp by enonic.
the class ServiceHandlerWorker method execute.
@Override
public PortalResponse execute() throws Exception {
// Retrieves the ServiceDescriptor
final DescriptorKey descriptorKey = DescriptorKey.from(applicationKey, name);
final ServiceDescriptor serviceDescriptor = serviceDescriptorService.getByKey(descriptorKey);
if (serviceDescriptor == null) {
throw WebException.notFound(String.format("Service [%s] not found", descriptorKey));
}
// Checks if the access to ServiceDescriptor is allowed
final PrincipalKeys principals = ContextAccessor.current().getAuthInfo().getPrincipals();
if (!serviceDescriptor.isAccessAllowed(principals)) {
throw WebException.forbidden(String.format("You don't have permission to access [%s]", descriptorKey));
}
final ContentResolverResult resolvedContent = contentResolver.resolve(request);
final Site site = resolvedContent.getNearestSite();
// Checks if the application is set on the current site
if (site != null) {
final PropertyTree siteConfig = site.getSiteConfig(applicationKey);
if (siteConfig == null) {
throw WebException.forbidden(String.format("Service [%s] forbidden for this site", descriptorKey));
}
}
// Checks if the application is set on the current application
final ApplicationKey baseApplicationKey = getBaseApplicationKey();
if (baseApplicationKey != null && !baseApplicationKey.equals(applicationKey)) {
throw WebException.forbidden(String.format("Service [%s] forbidden for this application", descriptorKey));
}
// Prepares the request
this.request.setApplicationKey(applicationKey);
this.request.setContent(resolvedContent.getContent());
this.request.setSite(site);
// Executes the service
final ControllerScript controllerScript = getScript();
final PortalResponse portalResponse = controllerScript.execute(this.request);
final WebSocketConfig webSocketConfig = portalResponse.getWebSocket();
final WebSocketContext webSocketContext = this.request.getWebSocketContext();
if ((webSocketContext != null) && (webSocketConfig != null)) {
final WebSocketEndpoint webSocketEndpoint = newWebSocketEndpoint(webSocketConfig);
webSocketContext.apply(webSocketEndpoint);
}
return portalResponse;
}
use of com.enonic.xp.portal.PortalResponse in project xp by enonic.
the class IdProviderControllerServiceImpl method execute.
@Override
public PortalResponse execute(final IdProviderControllerExecutionParams params) throws IOException {
final IdProviderKey idProviderKey = retrieveIdProviderKey(params);
final IdProvider idProvider = retrieveIdProvider(idProviderKey);
final IdProviderDescriptor idProviderDescriptor = retrieveIdProviderDescriptor(idProvider);
if (idProviderDescriptor != null) {
final IdProviderControllerScript idProviderControllerScript = idProviderControllerScriptFactory.fromScript(idProviderDescriptor.getResourceKey());
final String functionName = params.getFunctionName();
if (idProviderControllerScript.hasMethod(functionName)) {
PortalRequest portalRequest = params.getPortalRequest();
if (portalRequest == null) {
portalRequest = new PortalRequestAdapter().adapt(params.getServletRequest());
}
portalRequest.setApplicationKey(idProviderDescriptor.getKey());
portalRequest.setIdProvider(idProvider);
final PortalResponse portalResponse = idProviderControllerScript.execute(functionName, portalRequest);
if (portalResponse != null) {
final HttpServletResponse response = params.getResponse();
if (response != null) {
responseSerializationService.serialize(portalRequest, portalResponse, response);
}
}
return portalResponse;
}
}
return null;
}
use of com.enonic.xp.portal.PortalResponse in project xp by enonic.
the class PostProcessingRenderer method render.
@Override
public PortalResponse render(final R component, final PortalRequest portalRequest) {
PortalResponse portalResponse = doRender(component, portalRequest);
portalResponse = this.postProcessor.processResponseInstructions(portalRequest, portalResponse);
portalResponse = executeResponseProcessors(portalRequest, portalResponse);
portalResponse = this.postProcessor.processResponseContributions(portalRequest, portalResponse);
return portalResponse;
}
Aggregations