use of org.apache.sling.api.SlingHttpServletResponse in project sling by apache.
the class SlingRequestProcessorImpl method handleError.
// ---------- Error Handling with Filters
void handleError(final int status, final String message, final SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException {
// wrap the response ensuring getWriter will fall back to wrapping
// the response output stream if reset does not reset this
response = new ErrorResponseWrapper(response);
FilterHandle[] filters = filterManager.getFilters(FilterChainType.ERROR);
if (filters != null && filters.length > 0) {
FilterChain processor = new AbstractSlingFilterChain(filters) {
@Override
protected void render(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException {
errorHandler.handleError(status, message, request, response);
}
};
request.getRequestProgressTracker().log("Applying " + FilterChainType.ERROR + " filters");
try {
processor.doFilter(request, response);
} catch (ServletException se) {
throw new SlingServletException(se);
}
} else {
errorHandler.handleError(status, message, request, response);
}
}
use of org.apache.sling.api.SlingHttpServletResponse in project sling by apache.
the class SlingRequestProcessorImpl method handleError.
// just rethrow the exception as explained in the class comment
private void handleError(final Throwable throwable, final SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException {
// wrap the response ensuring getWriter will fall back to wrapping
// the response output stream if reset does not reset this
response = new ErrorResponseWrapper(response);
FilterHandle[] filters = filterManager.getFilters(FilterChainType.ERROR);
if (filters != null && filters.length > 0) {
FilterChain processor = new AbstractSlingFilterChain(filters) {
@Override
protected void render(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException {
errorHandler.handleError(throwable, request, response);
}
};
request.getRequestProgressTracker().log("Applying " + FilterChainType.ERROR + " filters");
try {
processor.doFilter(request, response);
} catch (ServletException se) {
throw new SlingServletException(se);
}
} else {
errorHandler.handleError(throwable, request, response);
}
}
use of org.apache.sling.api.SlingHttpServletResponse in project sling by apache.
the class SlingRequestProcessorImpl method dispatchRequest.
// ---------- Generic Content Request processor ----------------------------
/**
* Dispatches the request on behalf of the
* {@link org.apache.sling.engine.impl.request.SlingRequestDispatcher}.
*/
public void dispatchRequest(ServletRequest request, ServletResponse response, Resource resource, RequestPathInfo resolvedURL, boolean include) throws IOException, ServletException {
// we need a SlingHttpServletRequest/SlingHttpServletResponse tupel
// to continue
SlingHttpServletRequest cRequest = RequestData.toSlingHttpServletRequest(request);
SlingHttpServletResponse cResponse = RequestData.toSlingHttpServletResponse(response);
// get the request data (and btw check the correct type)
final RequestData requestData = RequestData.getRequestData(cRequest);
final ContentData oldContentData = requestData.getContentData();
final ContentData contentData = requestData.setContent(resource, resolvedURL);
try {
// resolve the servlet
Servlet servlet = servletResolver.resolveServlet(cRequest);
contentData.setServlet(servlet);
FilterChainType type = include ? FilterChainType.INCLUDE : FilterChainType.FORWARD;
processComponent(cRequest, cResponse, type);
} finally {
requestData.resetContent(oldContentData);
}
}
use of org.apache.sling.api.SlingHttpServletResponse in project sling by apache.
the class AbstractSlingFilterChain method doFilter.
public void doFilter(ServletRequest request, ServletResponse response) throws ServletException, IOException {
final int filterIdx = ++this.current;
final long start = System.currentTimeMillis();
// the previous filter may have wrapped non-Sling request and response
// wrappers (e.g. WebCastellum does this), so we have to make
// sure the request and response are Sling types again
SlingHttpServletRequest slingRequest = toSlingRequest(request);
SlingHttpServletResponse slingResponse = toSlingResponse(response);
try {
if (this.current < this.filters.length) {
// continue filtering with the next filter
FilterHandle filter = this.filters[this.current];
if (filter.select(slingRequest)) {
trackFilter(slingRequest, filter);
filter.getFilter().doFilter(slingRequest, slingResponse, this);
} else {
if (this.current == this.filters.length - 1) {
this.render(slingRequest, slingResponse);
} else {
doFilter(slingRequest, slingResponse);
}
}
} else {
this.render(slingRequest, slingResponse);
}
} finally {
times[filterIdx] = System.currentTimeMillis() - start;
if (filterIdx == 0) {
consolidateFilterTimings(slingRequest);
}
}
}
use of org.apache.sling.api.SlingHttpServletResponse in project sling by apache.
the class RequestData method toSlingHttpServletResponse.
/**
* @param response
* @throws IllegalArgumentException if <code>response</code> is not a
* <code>HttpServletResponse</code> of if
* <code>response</code> is not backed by
* <code>SlingHttpServletResponseImpl</code>.
*/
public static SlingHttpServletResponse toSlingHttpServletResponse(ServletResponse response) {
// unwrap to SlingHttpServletResponse
SlingHttpServletResponse cResponse = unwrap(response);
// check type of response, don't care actually for the response itself
RequestData.unwrap(cResponse);
// are done
if (cResponse == response) {
return cResponse;
}
// ensure the response is a HTTP response
if (!(response instanceof HttpServletResponse)) {
throw new IllegalArgumentException("Response is not an HTTP response");
}
// and unwrapped component response
return new SlingServletResponseAdapter(cResponse, (HttpServletResponse) response);
}
Aggregations