Before I give that workaround a try, a couple existential questions...
- Should the *response-code* handler also set the *errorCode* as well in
the servlet request context so it triggers the doErrorDispatch() action?
- Or should there be another built-in handler called "send-error" or
similar that does this.
Ex:
path( /secret.json ) -> send-error ( 404 )
path( /admin/ ) -> send-error( 503 )
I'm sort of questioning what the usefulness is of the *response-code*
handler however (at least in the context of the predicate language) if it's
default behavior is NOT to trigger the error code and therefore the error
page.
Thanks!
~Brad
*Developer Advocate*
*Ortus Solutions, Corp *
E-mail: brad(a)coldbox.org
ColdBox Platform:
On Thu, Jul 2, 2020 at 7:01 PM Stuart Douglas <sdouglas(a)redhat.com> wrote:
Hmm, this is because the servlet status code is only triggered by a
sendError method, not by just setting the code.
You probably need to write a custom one that looks like this (plus the
relevant predicate languge bits):
public class SendErrorHandler implements HttpHandler {
private final int code;
public SendErrorHandler(int code) {
this.code = code;
}
@Override
public void handleRequest(HttpServerExchange exchange) throws
Exception {
ServletRequestContext src =
exchange.getAttachment(ServletRequestContext.ATTACHMENT_KEY);
((HttpServletResponse)src.getServletResponse()).sendError(code);
}
}
Stuart
On Fri, 3 Jul 2020 at 09:40, Brad Wood <bdw429s(a)gmail.com> wrote:
> Thanks for the reply Stuart. I've tried this with no success, but
> perhaps I'm doing it wrong.
>
> List<PredicatedHandler> ph =
> PredicatedHandlersParser.parse(predicatesLines, _classLoader);
> servletBuilder.addOuterHandlerChainWrapper(next ->
> Handlers.predicates(ph,next));
>
> When the response-code handler fires, I still get no response body.
>
> On a related note, when I move the predicates into an outer handler chain
> wrapper, my default response listener also doesn't fire at all.
>
> On an unrelated train of thought, I've been trying to see if I can get
> the default response listener to automatically dispatch the correct error
> page, but that hasn't been going well either. If I don't use the outer
> handler chain idea, but try to capture the empty response in a default
> response listener, I can return a static message using the Sender class
>
> Sender sender = exchange.getResponseSender();
> sender.send(errorHTMLString);
>
> But if I try to run something this in my default response listener to
> invoke my error pages
>
> ServletRequestContext src =
> exchange.getAttachment(ServletRequestContext.ATTACHMENT_KEY);
> HttpServletResponseImpl response = src.getOriginalResponse();
> response.doErrorDispatch( exchange.getStatusCode(),
> exchange.getReasonPhrase() );
>
> Then it's as though nothing happens and I still get an empty response.
>
> Thanks!
>
> ~Brad
>
> *Developer Advocate*
> *Ortus Solutions, Corp *
>
> E-mail: brad(a)coldbox.org
> ColdBox Platform:
http://www.coldbox.org
> Blog:
http://www.codersrevolution.com
>
>
>
> On Thu, Jul 2, 2020 at 6:17 PM Stuart Douglas <sdouglas(a)redhat.com>
> wrote:
>
>> The predicate languages are executed before the Servler handlers, so
>> they won't be handled by Servlet error pages.
>>
>> If you are setting this all up programmatically you could use
>> io.undertow.servlet.api.DeploymentInfo#addOuterHandlerChainWrapper to setup
>> the predicate handler after the initial servlet one, which should mean that
>> the servlet error handling will handle the response code.
>>
>> Stuart
>>
>> On Fri, 3 Jul 2020 at 08:25, Brad Wood <bdw429s(a)gmail.com> wrote:
>>
>>> When I configure an error page similar to this:
>>>
>>> servletBuilder.addErrorPage( new ErrorPage( "404.html", 404));
>>>
>>> This works great when I hit a path in my browser that doesn't exist.
>>> The contents of the *404.html* file is served with a response code of
>>> *404*.
>>>
>>> However, if I also use the predicate language to define something like:
>>>
>>> path(/box.json)->response-code(404)
>>>
>>> and then I hit *localhost/box.json* in my browser, I get a *404*
>>> status code but with no response body.
>>>
>>> - The docs say the response-code handler ends the exchange, but
>>> should it still respect the error pages?
>>> - How can I modify my use of Undertow to respect the error pages
>>> when using the response-code handler?
>>> - I've seen in the docs the ability to have a
>>> *addDefaultResponseListener()* but I'm not sure if it is the
>>> correct solution for this, nor how I would access the error page
>>> configuration dynamically as to not need to duplicate my work.
>>>
>>> Thanks!
>>>
>>> ~Brad
>>>
>>> *Developer Advocate*
>>> *Ortus Solutions, Corp *
>>>
>>> E-mail: brad(a)coldbox.org
>>> ColdBox Platform:
http://www.coldbox.org
>>> Blog:
http://www.codersrevolution.com
>>>
>>> _______________________________________________
>>> undertow-dev mailing list
>>> undertow-dev(a)lists.jboss.org
>>>
https://lists.jboss.org/mailman/listinfo/undertow-dev
>>
>>