Search in sources :

Example 1 with RequestData

use of org.apache.sling.engine.impl.request.RequestData in project sling by apache.

the class SlingRequestProcessorImpl method doProcessRequest.

/**
     * This method is directly called by the Sling main servlet.
     */
public void doProcessRequest(final HttpServletRequest servletRequest, final HttpServletResponse servletResponse, final ResourceResolver resourceResolver) throws IOException {
    // setting the Sling request and response
    final RequestData requestData = new RequestData(this, servletRequest, servletResponse);
    final SlingHttpServletRequest request = requestData.getSlingRequest();
    final SlingHttpServletResponse response = requestData.getSlingResponse();
    // record the request for the web console display
    RequestHistoryConsolePlugin.recordRequest(request);
    try {
        final ServletResolver sr = this.servletResolver;
        // check that we have all required services
        if (resourceResolver == null) {
            throw new UnavailableException("ResourceResolver");
        } else if (sr == null) {
            throw new UnavailableException("ServletResolver");
        }
        // initialize the request data - resolve resource and servlet
        Resource resource = requestData.initResource(resourceResolver);
        requestData.initServlet(resource, sr);
        FilterHandle[] filters = filterManager.getFilters(FilterChainType.REQUEST);
        if (filters != null) {
            FilterChain processor = new RequestSlingFilterChain(this, filters);
            request.getRequestProgressTracker().log("Applying " + FilterChainType.REQUEST + "filters");
            processor.doFilter(request, response);
        } else {
            // no filters, directly call resource level filters and servlet
            processComponent(request, response, FilterChainType.COMPONENT);
        }
    } catch (final SlingHttpServletResponseImpl.WriterAlreadyClosedException wace) {
        log.error("Writer has already been closed.", wace);
    } catch (ResourceNotFoundException rnfe) {
        // send this exception as a 404 status
        log.info("service: Resource {} not found", rnfe.getResource());
        handleError(HttpServletResponse.SC_NOT_FOUND, rnfe.getMessage(), request, response);
    } catch (final SlingException se) {
        // we assume, that this is the name of the causing servlet
        if (requestData.getActiveServletName() != null) {
            request.setAttribute(ERROR_SERVLET_NAME, requestData.getActiveServletName());
        }
        // send this exception as is (albeit unwrapping and wrapped
        // exception.
        Throwable t = se;
        while (t instanceof SlingException && t.getCause() != null) {
            t = t.getCause();
        }
        log.error("service: Uncaught SlingException", t);
        handleError(t, request, response);
    } catch (AccessControlException ace) {
        // SLING-319 if anything goes wrong, send 403/FORBIDDEN
        log.info("service: Authenticated user {} does not have enough rights to executed requested action", request.getRemoteUser());
        handleError(HttpServletResponse.SC_FORBIDDEN, null, request, response);
    } catch (UnavailableException ue) {
        // exception is thrown before the SlingHttpServletRequest/Response
        // is properly set up due to missing dependencies. In this case
        // we must not use the Sling error handling infrastructure but
        // just return a 503 status response handled by the servlet
        // container environment
        final int status = HttpServletResponse.SC_SERVICE_UNAVAILABLE;
        final String errorMessage = ue.getMessage() + " service missing, cannot service requests";
        log.error("{} , sending status {}", errorMessage, status);
        servletResponse.sendError(status, errorMessage);
    } catch (IOException ioe) {
        // forward IOException up the call chain to properly handle it
        throw ioe;
    } catch (Throwable t) {
        // we assume, that this is the name of the causing servlet
        if (requestData.getActiveServletName() != null) {
            request.setAttribute(ERROR_SERVLET_NAME, requestData.getActiveServletName());
        }
        log.error("service: Uncaught Throwable", t);
        handleError(t, request, response);
    } finally {
        if (mbean != null) {
            mbean.addRequestData(requestData);
        }
    }
}
Also used : SlingHttpServletResponse(org.apache.sling.api.SlingHttpServletResponse) FilterHandle(org.apache.sling.engine.impl.filter.FilterHandle) RequestSlingFilterChain(org.apache.sling.engine.impl.filter.RequestSlingFilterChain) SlingComponentFilterChain(org.apache.sling.engine.impl.filter.SlingComponentFilterChain) FilterChain(javax.servlet.FilterChain) AbstractSlingFilterChain(org.apache.sling.engine.impl.filter.AbstractSlingFilterChain) UnavailableException(javax.servlet.UnavailableException) Resource(org.apache.sling.api.resource.Resource) AccessControlException(java.security.AccessControlException) IOException(java.io.IOException) SlingHttpServletRequest(org.apache.sling.api.SlingHttpServletRequest) RequestSlingFilterChain(org.apache.sling.engine.impl.filter.RequestSlingFilterChain) ServletResolver(org.apache.sling.api.servlets.ServletResolver) RequestData(org.apache.sling.engine.impl.request.RequestData) SlingException(org.apache.sling.api.SlingException) ResourceNotFoundException(org.apache.sling.api.resource.ResourceNotFoundException)

Example 2 with RequestData

use of org.apache.sling.engine.impl.request.RequestData in project sling by apache.

the class AbstractSlingFilterChain method trackFilter.

// ---------- internal helper
private void trackFilter(ServletRequest request, FilterHandle filter) {
    RequestData data = RequestData.getRequestData(request);
    if (data != null) {
        RequestProgressTracker tracker = data.getRequestProgressTracker();
        tracker.log("Calling filter: {0}", filter.getFilter().getClass().getName());
    }
    filter.track();
}
Also used : RequestData(org.apache.sling.engine.impl.request.RequestData) RequestProgressTracker(org.apache.sling.api.request.RequestProgressTracker)

Example 3 with RequestData

use of org.apache.sling.engine.impl.request.RequestData in project sling by apache.

the class AbstractSlingFilterChain method consolidateFilterTimings.

private void consolidateFilterTimings(ServletRequest request) {
    if (filters != null) {
        RequestData data = RequestData.getRequestData(request);
        RequestProgressTracker tracker = (data != null) ? data.getRequestProgressTracker() : null;
        for (int i = filters.length - 1; i > 0; i--) {
            filters[i].trackTime(times[i] - times[i + 1]);
            if (tracker != null) {
                tracker.log("Filter timing: filter={0}, inner={1}, total={2}, outer={3}", filters[i].getFilter().getClass().getName(), times[i + 1], times[i], (times[i] - times[i + 1]));
            }
        }
    }
}
Also used : RequestData(org.apache.sling.engine.impl.request.RequestData) RequestProgressTracker(org.apache.sling.api.request.RequestProgressTracker)

Example 4 with RequestData

use of org.apache.sling.engine.impl.request.RequestData in project sling by apache.

the class RequestProcessorMBeanImpl method addRequestData.

void addRequestData(final RequestData data) {
    // remains to be seen
    for (; ; ) {
        Data oldVal = dataRef.get();
        Data newVal = new Data(oldVal, data);
        boolean success = dataRef.compareAndSet(oldVal, newVal);
        if (success) {
            break;
        }
    }
}
Also used : RequestData(org.apache.sling.engine.impl.request.RequestData)

Example 5 with RequestData

use of org.apache.sling.engine.impl.request.RequestData in project sling by apache.

the class SlingHttpServletRequestImplTest method getUserPrincipal_test2.

@Test
public void getUserPrincipal_test2() {
    final HttpServletRequest servletRequest = context.mock(HttpServletRequest.class);
    context.checking(new Expectations() {

        {
            one(servletRequest).getServletPath();
            will(returnValue("/path"));
            allowing(servletRequest).getPathInfo();
            will(returnValue("/path"));
            allowing(servletRequest).getRemoteUser();
            will(returnValue(null));
        }
    });
    final RequestData requestData = context.mock(RequestData.class, "requestData");
    final ResourceResolver resourceResolver = context.mock(ResourceResolver.class);
    context.checking(new Expectations() {

        {
            allowing(requestData).getResourceResolver();
            will(returnValue(resourceResolver));
            allowing(resourceResolver).adaptTo(Principal.class);
            will(returnValue(null));
        }
    });
    slingHttpServletRequestImpl = new SlingHttpServletRequestImpl(requestData, servletRequest);
    Assert.assertNull(slingHttpServletRequestImpl.getUserPrincipal());
}
Also used : HttpServletRequest(javax.servlet.http.HttpServletRequest) Expectations(org.jmock.Expectations) RequestData(org.apache.sling.engine.impl.request.RequestData) ResourceResolver(org.apache.sling.api.resource.ResourceResolver) Principal(java.security.Principal) Test(org.junit.Test)

Aggregations

RequestData (org.apache.sling.engine.impl.request.RequestData)9 Expectations (org.jmock.Expectations)4 Test (org.junit.Test)4 Principal (java.security.Principal)3 HttpServletRequest (javax.servlet.http.HttpServletRequest)3 ResourceResolver (org.apache.sling.api.resource.ResourceResolver)3 SlingHttpServletRequest (org.apache.sling.api.SlingHttpServletRequest)2 SlingHttpServletResponse (org.apache.sling.api.SlingHttpServletResponse)2 RequestProgressTracker (org.apache.sling.api.request.RequestProgressTracker)2 IOException (java.io.IOException)1 AccessControlException (java.security.AccessControlException)1 Random (java.util.Random)1 FilterChain (javax.servlet.FilterChain)1 Servlet (javax.servlet.Servlet)1 UnavailableException (javax.servlet.UnavailableException)1 SummaryStatistics (org.apache.commons.math.stat.descriptive.SummaryStatistics)1 SlingException (org.apache.sling.api.SlingException)1 Resource (org.apache.sling.api.resource.Resource)1 ResourceNotFoundException (org.apache.sling.api.resource.ResourceNotFoundException)1 ServletResolver (org.apache.sling.api.servlets.ServletResolver)1