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 <hucon...@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/
_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel

Reply via email to