From 2f2020975b11145dbd98643d82f78af929b9cfd5 Mon Sep 17 00:00:00 2001 From: phk Date: Wed, 5 Jul 2006 09:44:53 +0000 Subject: [PATCH] Add Age and Via header to responses. Change arguments to vca_write_obj() (It should really be "send_repsonse()" ?) Store received age and time entered into cache in object. Generate Age: and Via: headers as part of response. git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@315 d4fa192b-c00b-0410-8231-f00ffab90ce4 --- varnish-cache/bin/varnishd/cache.h | 5 ++++- varnish-cache/bin/varnishd/cache_acceptor.c | 15 +++++++++++---- varnish-cache/bin/varnishd/cache_fetch.c | 3 +-- varnish-cache/bin/varnishd/cache_pool.c | 4 +++- varnish-cache/bin/varnishd/rfc2616.c | 9 ++++++--- 5 files changed, 25 insertions(+), 11 deletions(-) diff --git a/varnish-cache/bin/varnishd/cache.h b/varnish-cache/bin/varnishd/cache.h index 73ab9ad0..ac699553 100644 --- a/varnish-cache/bin/varnishd/cache.h +++ b/varnish-cache/bin/varnishd/cache.h @@ -67,6 +67,9 @@ struct object { unsigned busy; unsigned len; + + time_t age; + time_t entered; time_t ttl; char *header; @@ -133,7 +136,7 @@ struct backend { /* cache_acceptor.c */ void vca_write(struct sess *sp, void *ptr, size_t len); -void vca_write_obj(struct sess *sp, char *b, unsigned l); +void vca_write_obj(struct worker *w, struct sess *sp); void vca_flush(struct sess *sp); void vca_return_session(struct sess *sp); void vca_close_session(struct sess *sp, const char *why); diff --git a/varnish-cache/bin/varnishd/cache_acceptor.c b/varnish-cache/bin/varnishd/cache_acceptor.c index f36a4a2c..5589b27c 100644 --- a/varnish-cache/bin/varnishd/cache_acceptor.c +++ b/varnish-cache/bin/varnishd/cache_acceptor.c @@ -85,18 +85,25 @@ vca_write(struct sess *sp, void *ptr, size_t len) } void -vca_write_obj(struct sess *sp, char *b, unsigned l) +vca_write_obj(struct worker *w, struct sess *sp) { struct storage *st; unsigned u = 0; char *r; + VSL(SLT_Response, sp->fd, "%u", sp->obj->response); VSL(SLT_Length, sp->fd, "%u", sp->obj->len); - if (l == 0) - l = strlen(b); - vca_write(sp, b, l); + vca_write(sp, sp->obj->header, strlen(sp->obj->header)); + + sbuf_clear(w->sb); + sbuf_printf(w->sb, "Age: %u\r\n", + sp->obj->age + sp->t_req - sp->obj->entered); + sbuf_printf(w->sb, "Via: 1.1 varnish\r\n"); + sbuf_printf(w->sb, "\r\n"); + sbuf_finish(w->sb); + vca_write(sp, sbuf_data(w->sb), sbuf_len(w->sb)); assert(http_GetReq(sp->http, &r)); if (!strcmp(r, "GET")) { TAILQ_FOREACH(st, &sp->obj->store, list) { diff --git a/varnish-cache/bin/varnishd/cache_fetch.c b/varnish-cache/bin/varnishd/cache_fetch.c index e27f3097..12cf4370 100644 --- a/varnish-cache/bin/varnishd/cache_fetch.c +++ b/varnish-cache/bin/varnishd/cache_fetch.c @@ -285,11 +285,10 @@ FetchSession(struct worker *w, struct sess *sp) sbuf_printf(w->sb, "Content-Length: %u\r\n", sp->obj->len); } else cls = 0; - sbuf_cat(w->sb, "\r\n"); sbuf_finish(w->sb); sp->obj->header = strdup(sbuf_data(w->sb)); - vca_write_obj(sp, sp->obj->header, 0); + vca_write_obj(w, sp); if (http_GetHdr(hp, "Connection", &b) && !strcasecmp(b, "close")) cls = 1; diff --git a/varnish-cache/bin/varnishd/cache_pool.c b/varnish-cache/bin/varnishd/cache_pool.c index ae8118be..78dfb50a 100644 --- a/varnish-cache/bin/varnishd/cache_pool.c +++ b/varnish-cache/bin/varnishd/cache_pool.c @@ -50,7 +50,7 @@ DeliverSession(struct worker *w, struct sess *sp) { - vca_write_obj(sp, sp->obj->header, 0); + vca_write_obj(w, sp); HSH_Deref(sp->obj); sp->obj = NULL; return (1); @@ -139,6 +139,8 @@ DealWithSession(void *arg, int good) return; } + time(&sp->t_req); + /* * No locking necessary, we're serialized in the acceptor thread */ diff --git a/varnish-cache/bin/varnishd/rfc2616.c b/varnish-cache/bin/varnishd/rfc2616.c index 8f95c63d..e22f2bf1 100644 --- a/varnish-cache/bin/varnishd/rfc2616.c +++ b/varnish-cache/bin/varnishd/rfc2616.c @@ -72,7 +72,7 @@ #endif static time_t -RFC2616_Ttl(struct http *hp, time_t t_req, time_t t_resp) +RFC2616_Ttl(struct http *hp, time_t t_req, time_t t_resp, struct object *obj) { int retirement_age; unsigned u1, u2; @@ -85,8 +85,10 @@ RFC2616_Ttl(struct http *hp, time_t t_req, time_t t_resp) if (http_GetHdrField(hp, "Cache-Control", "max-age", &p)) { u1 = strtoul(p, NULL, 0); u2 = 0; - if (http_GetHdr(hp, "Age", &p)) + if (http_GetHdr(hp, "Age", &p)) { u2 = strtoul(p, NULL, 0); + obj->age = u2; + } if (u2 <= u1) retirement_age = u1 - u2; } @@ -148,7 +150,8 @@ RFC2616_cache_policy(struct sess *sp, struct http *hp) break; } - sp->obj->ttl = RFC2616_Ttl(hp, sp->t_req, sp->t_resp); + sp->obj->ttl = RFC2616_Ttl(hp, sp->t_req, sp->t_resp, sp->obj); + sp->obj->entered = sp->t_req; if (sp->obj->ttl == 0) { sp->obj->cacheable = 0; } -- 2.39.5