reverse proxy + caching seems to break range requests
mdounin at mdounin.ru
Tue Apr 6 02:56:18 MSD 2010
On Tue, Apr 06, 2010 at 02:13:09AM +0530, Vinay Y S wrote:
> On Mon, Apr 5, 2010 at 2:46 AM, Maxim Dounin <mdounin at mdounin.ru> wrote:
> > Hello!
> > On Sun, Apr 04, 2010 at 11:23:32PM +0530, Vinay Y S wrote:
> > > Hi,
> > > I've configured nginx to run as a http reverse proxy with caching turned
> > on
> > > for a location. The backend server supports range headers and responds
> > > correctly with 206 partial content response. This is needed to support
> > > pause/resume functionality in the browsers and download managers and also
> > to
> > > support download accelerator clients.
> > >
> > > But with nginx reverse proxy with caching enabled, it seems to not work.
> > > nginx returns full response even when range header is present. Is this a
> > > known issue?
> > > Please help fix this.
> > nginx removes Range header (as well as several other headers)
> > before passing request to upstream to make sure full response will
> > be cached and other requests for the same uri will be served
> > correctly.
> > It's fine for it send full request to the upstream so that it can cache
> the full response. Actually range requests and 206 responses work correctly
> when caching is not enabled. So, even when caching is enabled, it can still
> respond correctly to the client by obeying the range header, isn't it? Is
> this not implemented consciously for some reason?
Arbitrary range request can't be satisfied from stream, only from
file. During first request we have no file yet, so stream is
passed as is (and this should break anything as client should be
prepared to get full response in reply to range request per RFC
We may try to do some preliminary analysis of requested range and
obey it if we can though. This is likely to cover almost all
request (the only exception is multipart range requests, and I've
seen only Acrobat Reader sending them in wild). But this isn't
[yet] done, and will likely require some non-trivial changes to
range filter logic.
More information about the nginx