]> err.no Git - varnish/commitdiff
Add Age and Via header to responses.
authorphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Wed, 5 Jul 2006 09:44:53 +0000 (09:44 +0000)
committerphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Wed, 5 Jul 2006 09:44:53 +0000 (09:44 +0000)
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
varnish-cache/bin/varnishd/cache_acceptor.c
varnish-cache/bin/varnishd/cache_fetch.c
varnish-cache/bin/varnishd/cache_pool.c
varnish-cache/bin/varnishd/rfc2616.c

index 73ab9ad0832bab7360a58ce74bd06a84d6d1c06b..ac6995534849606887e1f344fc71c0a9a66c3af3 100644 (file)
@@ -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);
index f36a4a2c94f6160fcef8f885e145bb3e5f86f5e2..5589b27c3152483e2172b68934136d64a85c4850 100644 (file)
@@ -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) {
index e27f3097dfc291c5ed2c846ce96ed140dce81ff3..12cf4370fa4b1207e9f94c8adb1bc6e87e3d7c82 100644 (file)
@@ -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;
index ae8118be76a6ebb30a10fef3453f08b693d69ccc..78dfb50a9d125f8e775507475722b00daba3f6db 100644 (file)
@@ -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
         */
index 8f95c63d80eeb5b2be06bb01261676fb05024dc2..e22f2bf1bd66cbdcd0f6701049623494ac0e7480 100644 (file)
@@ -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;
        }