Commit ea3104d0 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

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: http://www.varnish-cache.org/svn/trunk/varnish-cache@315 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent 24b0a1ab
......@@ -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);
......
......@@ -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) {
......
......@@ -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;
......
......@@ -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
*/
......
......@@ -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;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment