On Tue, Jun 28, 2011 at 7:47 AM, Brian E. Lozier <
brian@massassi.com> wrote:
> Issue #561 (
https://github.com/sukria/Dancer/issues/561 ) is really
> killing me and due to the design of Dancer I can't find a simple way
> around it. The crux of the issue is that in Dancer::Factory::Hooks
> all the hooks get executed and their return values aren't checked.
> The hooks are initially compiled in Dancer::Hook and they are compiled
> wrapped in an eval such that if an exception occurs the hook returns a
> Dancer::halt which in turns wraps a Dancer::Response object that wraps
> an error render. Unfortunately nothing is ever done with this error
> render and I don't see a standard way to actually "halt" processing.
> If an exception occurs in a hook we should never ignore it and
> continue processing the rest of the page! We should die immediately
> and print an error message to the screen. The Dancer::halt method
> just returns a Dancer::Response object, it doesn't actually stop
> processing.
>
> As it works now, the returned Dancer::Response object is (almost)
> completely ignored. In fact the status code gets persisted to the
> actual Dancer::Response that is served (500) but the page renders
> normally otherwise.
>
> We are so deep in the call stack when hooks are executed that it's
> impossible to have any meaningful "return" value (unless someone goes
> in to every place "execute_hooks" is called and actually checks for
> errors -- in this case it would have to check for Dancer::Response
> objects).
>
> Is there a method somewhere that really halts instead of just
> returning a Dancer::Response object? Is there an accepted way to
> short-circuit the rest of the request handling?