httpd-modules-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Fred Clift <f...@clift.org>
Subject very late hook, and which handler handled my request - partially answered questions
Date Thu, 26 Apr 2012 22:53:57 GMT
So I can answer some of my own questions.

1) to hook really really late, but not REALLY_LAST, it appears that you can
do what test/mod_dialup.c in the source distribution does:

#ifndef APR_HOOK_ALMOST_LAST
#define APR_HOOK_ALMOST_LAST (APR_HOOK_REALLY_LAST - 1)
#endif

static void
dialup_register_hooks(apr_pool_t *p)
{
    ap_hook_handler(dialup_handler, NULL, NULL, APR_HOOK_ALMOST_LAST);
}


looking at the macro defs in srclib/apr-util/include/apr_hooks.h it is
clear what is going on.

    /* Hook orderings */
/** run this hook first, before ANYTHING */
#define APR_HOOK_REALLY_FIRST   (-10)
/** run this hook first */
#define APR_HOOK_FIRST          0
/** run this hook somewhere */
#define APR_HOOK_MIDDLE         10
/** run this hook after every other hook which is defined*/
#define APR_HOOK_LAST           20
/** run this hook last, after EVERYTHING */
#define APR_HOOK_REALLY_LAST    30


combining that definition with the mod_dialup code and documentation it is
clear that all the module hooks are sorted by this value and the higher the
number, the later.

This isn't really supported :)  but it appears to work.  By the time I get
to my ALMOST_LAST handler  I'm pretty sure that nothing else is going to
handle this request and that the default_handler hooked with REALLY_LAST is
just about to be called.


Also, apparently after the request is handled, r->handler is defined to be
the handler that handled the request, or NULL if default_handler did it.  I
gather this by the code for %R printing code in the logging code:

from mod_log_config.c

static const char *log_handler(request_rec *r, char *a)
{
    return ap_escape_logitem(r->pool, r->handler);
}



So, I THINK that answers my questions.  I'm only 90% sure on my guesses as
to what r->handler will be set to by the time the logging handlers are
called - is this canonical?  I mean, is this defined behavior or just
accidental?  Since mod_log_config seems to depend on it, I'm guessing it is
a reliable thing.



I'm happy to have any of you tell me I'm wrong - if you happen to know any
better.

Fred Clift

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message