Search in sources :

Example 1 with IXServletHandler

use of com.helger.xservlet.handler.IXServletHandler in project ph-web by phax.

the class AbstractXServlet method _invokeHandler.

private void _invokeHandler(@Nonnull final HttpServletRequest aHttpRequest, @Nonnull final HttpServletResponse aHttpResponse, @Nonnull final EHttpVersion eHttpVersion, @Nonnull final EHttpMethod eHttpMethod, @Nonnull final IRequestWebScope aRequestScope) throws ServletException, IOException {
    // HTTP version and method are valid
    m_aCounterRequestsAccepted.increment();
    // Find the handler for the HTTP method
    // Important: must be done inside this method to handle "HEAD" requests
    // properly!
    final IXServletHandler aServletHandler = m_aHandlerRegistry.getHandler(eHttpMethod);
    if (aServletHandler == null) {
        // HTTP method is not supported by this servlet!
        m_aCounterHttpMethodUnhandled.increment(eHttpMethod.getName());
        aHttpResponse.setHeader(CHttpHeader.ALLOW, m_aHandlerRegistry.getAllowedHttpMethodsString());
        if (eHttpVersion.is10())
            aHttpResponse.sendError(CHttp.HTTP_BAD_REQUEST);
        else
            aHttpResponse.sendError(CHttp.HTTP_METHOD_NOT_ALLOWED);
        return;
    }
    // HTTP method is supported by this servlet implementation
    final ICommonsList<IXServletHighLevelFilter> aEffectiveFilters = new CommonsArrayList<>(2 + m_aFilterHighLevelList.size());
    // Add new instance all the time!
    aEffectiveFilters.add(new XServletFilterTimer(this));
    // Add new instance all the time!
    aEffectiveFilters.add(new XServletFilterTrackRequest());
    aEffectiveFilters.addAll(m_aFilterHighLevelList);
    try {
        // High level filters before
        for (final IXServletHighLevelFilter aFilter : aEffectiveFilters) aFilter.beforeRequest(aRequestScope);
        // This may indirectly call "_internalService" again (e.g. for HEAD
        // requests, which calls GET internally)
        aServletHandler.onRequest(aHttpRequest, aHttpResponse, eHttpVersion, eHttpMethod, aRequestScope);
        // Handled and no exception
        m_aCounterRequestsHandled.increment();
        m_aCounterRequestsPerVersionHandled.increment(eHttpVersion.getName());
        m_aCounterRequestsPerMethodHandled.increment(eHttpMethod.getName());
    } catch (final ForcedRedirectException ex) {
        // Handle Post-Redirect-Get here
        m_aCounterRequestsPRG.increment();
        // Remember the content
        ForcedRedirectManager.getInstance().createForcedRedirect(ex);
        // And set the redirect
        if (eHttpVersion.is10()) {
            // For HTTP 1.0 send 302
            aHttpResponse.setStatus(CHttp.HTTP_MOVED_TEMPORARY);
        } else {
            // For HTTP 1.1 send 303
            aHttpResponse.setStatus(CHttp.HTTP_SEE_OTHER);
        }
        // Set the location header
        String sTargetURL = ex.getRedirectTargetURL().getAsStringWithEncodedParameters();
        if (ServletSettings.isEncodeURLs())
            sTargetURL = aHttpResponse.encodeRedirectURL(sTargetURL);
        if (LOGGER.isDebugEnabled())
            LOGGER.debug("Sending redirect to '" + sTargetURL + "'");
        aHttpResponse.addHeader(CHttpHeader.LOCATION, sTargetURL);
    } catch (final Exception ex) {
        m_aCounterRequestsWithException.increment();
        // Invoke exception handler
        if (m_aExceptionHandler.forEachBreakable(x -> x.onException(aRequestScope, ex)).isContinue()) {
            // No handler handled it - propagate
            throw ex;
        }
    // One exception handled did it - no need to propagate
    } finally {
        // High level filters after
        for (final IXServletHighLevelFilter aFilter : aEffectiveFilters) try {
            aFilter.afterRequest(aRequestScope);
        } catch (final Exception ex) {
            if (LOGGER.isErrorEnabled())
                LOGGER.error("Exception in high-level filter afterRequest of " + aFilter + " - caught and ignored", ex);
        }
    }
}
Also used : IXServletHighLevelFilter(com.helger.xservlet.filter.IXServletHighLevelFilter) XServletFilterTrackRequest(com.helger.xservlet.filter.XServletFilterTrackRequest) IXServletHandler(com.helger.xservlet.handler.IXServletHandler) XServletFilterTimer(com.helger.xservlet.filter.XServletFilterTimer) ForcedRedirectException(com.helger.xservlet.forcedredirect.ForcedRedirectException) CommonsArrayList(com.helger.commons.collection.impl.CommonsArrayList) ServletException(javax.servlet.ServletException) ForcedRedirectException(com.helger.xservlet.forcedredirect.ForcedRedirectException) IOException(java.io.IOException)

Aggregations

CommonsArrayList (com.helger.commons.collection.impl.CommonsArrayList)1 IXServletHighLevelFilter (com.helger.xservlet.filter.IXServletHighLevelFilter)1 XServletFilterTimer (com.helger.xservlet.filter.XServletFilterTimer)1 XServletFilterTrackRequest (com.helger.xservlet.filter.XServletFilterTrackRequest)1 ForcedRedirectException (com.helger.xservlet.forcedredirect.ForcedRedirectException)1 IXServletHandler (com.helger.xservlet.handler.IXServletHandler)1 IOException (java.io.IOException)1 ServletException (javax.servlet.ServletException)1