request body filter

Maxim Dounin mdounin at
Tue Aug 10 13:19:29 UTC 2021


On Mon, Aug 09, 2021 at 11:48:35AM -0700, Dk Jack wrote:

> Hi,
> In my module, I am inspecting the request body. My body filter init code is
> shown below:
> int
> module_body_filter_init(ngx_conf_t *cf)
> {
>   ngx_http_next_body_filter = ngx_http_top_request_body_filter;
>   ngx_http_top_request_body_filter = nginx_module_inspect_body_filter;
>   return NGX_OK;
> }
> Even though I have the above initialization, I do not want to inspect the
> body for all requests. I figured the body filter would be invoked in the
> content phase. Hence, I registered a handler in the NGX_HTTP_ACCESS_PHASE
> to create my module context and set the flag to inspect the request body.
> This works in some cases but is inconsistent. It looks like my
> inspect_body_filter function is getting called before my access handler
> function in some cases. I've now moved my handler to POST_READ_PHASE to get
> consistent results. Is this the correct way to solve this problem? Are
> there any other ways to accomplish this or are there any pitfalls to this
> approach. Any help is appreciated. Thanks.

Request body filters are called when the request body reading 
happens.  This can happen at any phase, especially when using 
other 3rd party modules, and it is generally incorrect to assume 
that some phase handler is called before reading the request body.  

Note well that module contexts are cleared on internal 
redirections, and this might also be a problem for your approach.

A better approach would be to depend on the location configuration 
instead.  And do appropriate checks in the request body filter 
itself if some run-time logic is needed.

Maxim Dounin

More information about the nginx-devel mailing list