<div dir="ltr">Hello!<div><br></div><div>In my case, the backend returns x-accel-expires with 304 responses every time.</div><div></div><div><br></div><div>nginx calculates valid_sec by "ngx_http_upstream_process_accel_expires" for any revalidate or HIT responses, thus to get the wrong valid_sec value in header_filter/log hook handler.</div><div>This patch has no impact to every response results, and to be able to get TRUE valid_sec value in the hook handlers.<br></div><div><br></div><div>---</div><div>TAKADA Sokichi</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Jun 22, 2020 at 7:37 PM Maxim Dounin <<a href="mailto:mdounin@mdounin.ru" target="_blank">mdounin@mdounin.ru</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello!<br>
<br>
On Mon, Jun 22, 2020 at 05:09:16PM +0900, Sokichi Takada wrote:<br>
<br>
> > The cache validity time as obtained from cached responses is used<br>
> > while processing 304 responses during cache revalidation, so the<br>
> > suggested change looks wrong to me.<br>
> <br>
> When processing 304 responses during cache revalidation,<br>
> ngx_http_upstream_process_accel_expires is called twice.<br>
> <br>
> 1st time, in "ngx_http_upstream_process_header" function.<br>
> src/http/ngx_http_upstream.c: 2387         rc = u->process_header(r);<br>
> #  process_header = ngx_http_upstream_process_accel_expires<br>
> <br>
> This calculates the exact valid_sec value by x-accel-expires of upstream's<br>
> response,  It doesn't use a value of the cache data.<br>
> Also, the r->cached is 0 at this time.<br>
> <br>
> 2nd time, in "ngx_http_upstream_process_header" -><br>
> "ngx_http_upstream_test_next" -> "ngx_http_upstream_cache_send" function.<br>
> src/http/ngx_http_upstream.c: 2423         if<br>
> (ngx_http_upstream_test_next(r, u) == NGX_OK)    -><br>
> src/http/ngx_http_upstream.c: 2535         rc =<br>
> ngx_http_upstream_cache_send(r, u);                  -><br>
> src/http/ngx_http_upstream.c: 1073     rc = u->process_header(r);<br>
> <br>
> This calculates unnecessary valid_sec value by x-accel-expires of the cache<br>
> data.<br>
> Also, this calculation can skip by this patch since the r->cached is 1 at<br>
> this time.<br>
> <br>
> Please look into ngx_http_upstream_test_next.<br>
> It keeps the valid_sec value of 1st time into "valid" variable at "2523<br>
>     valid = r->cache->valid_sec;".<br>
> After that, it "calls ngx_http_upstream_cache_send", then updates cache<br>
> data with the "valid" variable at "2560             r->cache->valid_sec =<br>
> valid;".<br>
<br>
Backend is not required to return cache control headers along with <br>
the 304 response.  If it doesn't - nginx uses the headers returned <br>
in the cached response.<br>
<br>
-- <br>
Maxim Dounin<br>
<a href="http://mdounin.ru/" rel="noreferrer" target="_blank">http://mdounin.ru/</a><br>
_______________________________________________<br>
nginx-devel mailing list<br>
<a href="mailto:nginx-devel@nginx.org" target="_blank">nginx-devel@nginx.org</a><br>
<a href="http://mailman.nginx.org/mailman/listinfo/nginx-devel" rel="noreferrer" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx-devel</a><br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr"><div dir="ltr"><div>-------------------------------------</div><div>Sokichi TAKADA <<a href="mailto:takada@jocdn.co.jp" target="_blank">takada@jocdn.co.jp</a>></div><div>JOCDN Inc.</div></div></div>