[PATCH] Upstream: add $upstream_cache_age variable

Piotr Sikora piotr at cloudflare.com
Fri Oct 3 17:24:29 UTC 2014


# HG changeset patch
# User Piotr Sikora <piotr at cloudflare.com>
# Date 1412356980 25200
#      Fri Oct 03 10:23:00 2014 -0700
# Node ID f343adae412afce435a18384b0aad052405a393b
# Parent  6bbad2e732458bf53771e80c63a654b3d7f61963
Upstream: add $upstream_cache_age variable.

This variable represents the amount of time that passed since the response
was fetched (or successfully revalidated) from the upstream server.

Signed-off-by: Piotr Sikora <piotr at cloudflare.com>

diff -r 6bbad2e73245 -r f343adae412a src/http/ngx_http_upstream.c
--- a/src/http/ngx_http_upstream.c	Wed Aug 27 20:51:01 2014 +0400
+++ b/src/http/ngx_http_upstream.c	Fri Oct 03 10:23:00 2014 -0700
@@ -21,6 +21,8 @@ static ngx_int_t ngx_http_upstream_cache
     ngx_http_variable_value_t *v, uintptr_t data);
 static ngx_int_t ngx_http_upstream_cache_etag(ngx_http_request_t *r,
     ngx_http_variable_value_t *v, uintptr_t data);
+static ngx_int_t ngx_http_upstream_cache_age(ngx_http_request_t *r,
+    ngx_http_variable_value_t *v, uintptr_t data);
 #endif
 
 static void ngx_http_upstream_init_request(ngx_http_request_t *r);
@@ -373,6 +375,10 @@ static ngx_http_variable_t  ngx_http_ups
       ngx_http_upstream_cache_etag, 0,
       NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },
 
+    { ngx_string("upstream_cache_age"), NULL,
+      ngx_http_upstream_cache_age, 0,
+      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },
+
 #endif
 
     { ngx_null_string, NULL, NULL, 0, 0, 0 }
@@ -4851,6 +4857,37 @@ ngx_http_upstream_cache_etag(ngx_http_re
     return NGX_OK;
 }
 
+
+static ngx_int_t
+ngx_http_upstream_cache_age(ngx_http_request_t *r,
+    ngx_http_variable_value_t *v, uintptr_t data)
+{
+    if (r->upstream == NULL) {
+        v->not_found = 1;
+        return NGX_OK;
+    }
+
+    if (r->upstream->cache_status != NGX_HTTP_CACHE_STALE
+        && r->upstream->cache_status != NGX_HTTP_CACHE_UPDATING
+        && r->upstream->cache_status != NGX_HTTP_CACHE_HIT)
+    {
+        v->not_found = 1;
+        return NGX_OK;
+    }
+
+    v->data = ngx_pnalloc(r->pool, NGX_TIME_T_LEN);
+    if (v->data == NULL) {
+        return NGX_ERROR;
+    }
+
+    v->len = ngx_sprintf(v->data, "%T", ngx_time() - r->cache->date) - v->data;
+    v->valid = 1;
+    v->no_cacheable = 0;
+    v->not_found = 0;
+
+    return NGX_OK;
+}
+
 #endif
 
 



More information about the nginx-devel mailing list