About the phase handlers init

Maxim Dounin mdounin at mdounin.ru
Fri Sep 3 19:34:48 UTC 2021


On Fri, Sep 03, 2021 at 12:08:32PM +0800, Jinhua Luo wrote:

> In the function ngx_http_init_phase_handlers, I found two places hard
> to understand.
> a) The n variable is as known as the next phase handler index. In the
> switch case NGX_HTTP_ACCESS_PHASE, it invokes n++, which seems to be
> redundant and wrong, While in switch case NGX_HTTP_POST_ACCESS_PHASE,
> it lacks n++. Think about that if the number of modules registers as
> NGX_HTTP_ACCESS_PHASE is 0, then the next index is 1 more than the
> correct number. Of course, the current codes have at least one
> NGX_HTTP_POST_ACCESS_PHASE module: ngx_http_access_module, but it
> contains the codes to jump to the next phase handler, then the jump
> target is bypass NGX_HTTP_POST_ACCESS_PHASE and to

The NGX_HTTP_POST_ACCESS_PHASE is a special phase which is only 
used when there are modules in the NGX_HTTP_ACCESS_PHASE, and only 
contains a single phase handler, ngx_http_core_post_access_phase(). 
The post-access phase does not need to be present at all when there 
are no modules in the access phase.  Further, when access phase 
checker decides to skip the access phase when access is allowed by 
a handler, and needs to switch to the next phase - it does not 
need to switch to post-access phase, but rather to the phase after 
it.  Hence n++ in the access phase case (and not in the 
post-access phase).

> b) Does the handler runs in reverse order of registration order?
> for (j = cmcf->phases[i].handlers.nelts - 1; j >= 0; j--)

Yes.  In particular, this ensures that addon modules are called 
first, before the built-in modules.

Maxim Dounin

More information about the nginx-devel mailing list