Paul Rütter created FELIX-6873:
----------------------------------

             Summary: HTTP Base: ERROR-dispatch URL-pattern filters are matched 
against the original request URI instead of the error servlet’s path
                 Key: FELIX-6873
                 URL: https://issues.apache.org/jira/browse/FELIX-6873
             Project: Felix
          Issue Type: Bug
          Components: HTTP Service
    Affects Versions: http.base-6.0.2
            Reporter: Paul Rütter


h3. Problem

When a response calls {{sendError()}} and an error servlet is registered for 
that status code, {{ServletResponseWrapper.sendError()}} selects the error 
servlet and then collects the ERROR-dispatch filters with:

{code:java}
errorRegistry.getFilterHandlers(errorResolution, DispatcherType.ERROR, 
request.getRequestURI())
{code}

{{request.getRequestURI()}} is the URI of the *original request* that triggered 
the error. {{FilterRegistry.getFilterHandlers()}} matches URL patterns against 
that URI, and matches servlet names against the selected error servlet 
separately.

As a result, an ERROR filter with a URL pattern only applies if the original 
request matches the pattern, not if the error servlet does.

h3. Example

* Error servlet {{errorPage}}, pattern {{/errors/page}}, {{errorPage=404}}
* ERROR filter with pattern {{/errors/*}}
* A 404 originating at {{/errors/missing}} runs the filter.
* A 404 originating at {{/missing}} does not, although the error servlet at 
{{/errors/page}} is invoked.

This is inconsistent with FORWARD and INCLUDE dispatch in 
{{RequestDispatcherImpl}}, which match filters against the target's path, and 
with servlet containers, which match ERROR filters against the error page 
location.

Servlet-name ERROR filters are not affected.

h3. Expected behaviour

ERROR URL-pattern filters are matched against the path of the selected error 
servlet, consistent with FORWARD/INCLUDE and the Servlet specification. An 
error servlet registered without a pattern is only matched by servlet-name 
filters.

h3. Notes

* Behaviour change: ERROR filters that currently rely on matching the original 
request URI will stop matching. This should be mentioned in the release notes.
* Needs tests for ERROR dispatch with URL-pattern filters: error servlet with 
one pattern, several patterns, and none.
* Bundles that embed HTTP Base (e.g. the Jetty bundles) pick up the fix with 
their next release.
* Reported by hataehoon (GitHub: dpfkdlemtp).



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to