[patch] Http image_filter: return 405 when method is HEAD andbodyis empty.
Maxim Dounin
mdounin at mdounin.ru
Tue Jun 20 17:38:27 UTC 2017
Hello!
On Wed, Jun 21, 2017 at 12:28:23AM +0800, 胡聪 (hucc) wrote:
> Hi,
>
> On Tuesday, Jun 20, 2017 11:53 PM +0300, Maxim Dounin wrote:
>
> >> >On Tue, Jun 20, 2017 at 12:56:15AM +0800, 胡聪 (hucc) wrote:
> >> >
> >> >> Returning 415 does not conform to the HTTP protocol when image and proxy_pass
> >> >> configured in same location.
> >> >>
> >> >> # HG changeset patch
> >> >> # User hucongcong <hucong.c at foxmail.com>
> >> >> # Date 1497890354 -28800
> >> >> # Tue Jun 20 00:39:14 2017 +0800
> >> >> # Node ID af3a94de6a6549dec5e1205514eda1893313a14c
> >> >> # Parent d1816a2696de8c2faa1cd913a151e5f62a8620f3
> >> >> Http image_filter: return 405 when method is HEAD and body is empty.
> >> >>
> >> >> diff -r d1816a2696de -r af3a94de6a65 src/http/modules/ngx_http_image_filter_module.c
> >> >> --- a/src/http/modules/ngx_http_image_filter_module.c Fri Jun 16 18:15:58 2017 +0300
> >> >> +++ b/src/http/modules/ngx_http_image_filter_module.c Tue Jun 20 00:39:14 2017 +0800
> >> >> @@ -330,6 +330,12 @@ ngx_http_image_body_filter(ngx_http_requ
> >> >> }
> >> >> }
> >> >>
> >> >> + if (r->method & NGX_HTTP_HEAD) {
> >> >> + return ngx_http_filter_finalize_request(r,
> >> >> + &ngx_http_image_filter_module,
> >> >> + NGX_HTTP_NOT_ALLOWED);
> >> >> + }
> >> >> +
> >> >> return ngx_http_filter_finalize_request(r,
> >> >> &ngx_http_image_filter_module,
> >> >> NGX_HTTP_UNSUPPORTED_MEDIA_TYPE);
> >> >
> >> >Please clarify why you think that the current code is wrong. I
> >> >don't see any problems with returning 415 to HEAD requests as long
> >> >we are going to return 415 to GETs.
> >>
> >> Ok, the problem is that nginx will return 200 to GET request and
> >> 415 to HEAD request.
> >>
> >> The configuration looks like:
> >> #proxy_method GET;#not configured
> >> location / {
> >> image resize 180 360;
> >> #...
> >> proxy_pass http://test_upstream$uri;
> >> }
> >
> >Ok, so the problem appears when using proxy_pass without
> >additional configuration, image_filter, and a HEAD request.
> >
> >Unfortunately, the suggested change will also break the correct
> >behaviour in other cases, for example, when serving static files.
> >Using "proxy_method GET;" might be a better option.
>
> Thanks for the reply. Which behaviour will be breaked? Is the following change right?
When the response is read from a static file, not proxied, and/or
proxied with "proxy_method GET;", an empty response means exacly
that: an empty response, and returning 415 is perfectly correct.
The ngx_buf_size() test will limit the incorrect behaviour to
indeed empty responses (previous version of your patch affected
all non-image responses), but it won't eliminate incorrect behaviour
for empty responses.
The root cause of the problem is that in the configuration you've
provided proxy don't know about image filter, and uses the HEAD
method in the request to upstream filter despite the fact image
filter needs a body to return proper response. This doesn't look
like something easy to fix, as proper fix implies some knowledge
to be passed between image filter and proxy.
Most trivial solution, as suggested above, would be to use
"proxy_method GET" explicitly in the configuration. It might be
actually a good enough solution, as image filter is a special
module and it requires proper configuration anyway.
--
Maxim Dounin
http://nginx.org/
More information about the nginx-devel
mailing list