Error handling from filter modules

Maxim Dounin mdounin at mdounin.ru
Mon Oct 19 16:59:40 UTC 2015


Hello!

On Fri, Oct 16, 2015 at 06:15:30PM +0100, Steven Hartland wrote:

> On 16/10/2015 13:20, Maxim Dounin wrote:
> >Hello!
> >
> >On Fri, Oct 16, 2015 at 02:36:13AM +0100, Steven Hartland wrote:
> >
> >>I'm making changes to a filter module and when it detected an error it
> >>returned NGX_ERROR however the response generated to the client isn't
> >>the expected 500 internal server error I would have expected given said
> >>return.
> >>
> >>So the question is do filters have to manually call
> >>ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); or is it
> >>expected that the upper layers should actually do the right thing and
> >>ensure the client doesn't get a bad response generated from the current
> >>state of r with no indication an error occurred?
> >In filters, it's already to late to return anything in case of
> >errors.  In body filters, it's way too late - the response was
> >already partially sent.  And in header filters there is a chance that
> >other filters allocated something response-specific, and an
> >attempt to return a different response will break things.  So,
> >when you return NGX_ERROR from a filter, the connection is just
> >closed.
> There are a few core filters which seem to contradict this;
> 
> range does:
> return ngx_http_range_not_satisfiable(r, ctx);
> 
> while image does:
> return ngx_http_filter_finalize_request(r,
> &ngx_http_image_filter_module,
> NGX_HTTP_UNSUPPORTED_MEDIA_TYPE);

There is no contradiction here.  These are special cases which use 
ngx_http_filter_finalize_request(), as outlined later in the same 
message.

> The range filter is the one I was looking at, picking back up the work you
> gave feedback on a while back with regards allow partial content responses
> to be used to satisfy range requests.
> 
> During testing for failures I triggered the NGX_ERROR case here:
> https://github.com/nginx/nginx/blob/master/src/http/modules/ngx_http_range_filter_module.c#L233
> 
> When I triggered this case client recieved an broken 200 response, where as
> if I did finalise the request I could deliver a 500 response, so was
> wondering if this would be correct in this situation?

When the NGX_ERROR case is triggered, no response is returned, the 
connection is just closed.  As this expected to happen if and only 
if we weren't able to allocate memory, this is believed to be 
perfectly correct behaviour.  Trying to do anything else is very 
unlikely to succeed, but likely to result in additional problems.

-- 
Maxim Dounin
http://nginx.org/



More information about the nginx-devel mailing list