Proxy_cache partial response?

will nginx cache partial response when upstream prematutely close
connection?

In our production environment, we found the following scenario requires
one
to manually clear proxy cache:

  1. nginx asks upstrean for some large file, e.g., 5000KB

  2. upstream send response, it flushes response header which (at least)
    contains content-length

  3. Network is completely broken when 200KB was received by nginx. In
    about
    the same time, upstream closed connection by sending a FIN

  4. nginx cache the partial response and use it to serve subsequent
    requests
    until expiration.

  5. Browser request this large file then indefinitely hangs because
    content-length indicates there were more to come but actually nginx has
    nothing to send.

lei yang

Hi,

will nginx cache partial response when upstream prematutely close
connection?

Sadly, yes.

Best regards,
Piotr S. < [email protected] >

Hi, my colleague found this interesting comment in nginx’s source code:

        if (p->upstream_done) {
            ngx_http_file_cache_update(r, u->pipe->temp_file);

        } else if (p->upstream_eof) {
  •           /* TODO: check length & update cache */*
    
             ngx_http_file_cache_update(r, u->pipe->temp_file);
    
         } else if (p->upstream_error) {
             ngx_http_file_cache_free(r->cache, u->pipe->temp_file);
         }
    

next time shall I ask a question, I’d better to do this first: *grep -ri
'TODO: ’ **