]> err.no Git - varnish/commitdiff
Add a beresp.* variable family, which contains the backend response
authorphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Fri, 27 Feb 2009 12:02:50 +0000 (12:02 +0000)
committerphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Fri, 27 Feb 2009 12:02:50 +0000 (12:02 +0000)
before filtering.

Cut Fetch() into two, FetchHdr() and FetchBody(), for now, just call
them sequentially from cache_center.c

git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@3834 d4fa192b-c00b-0410-8231-f00ffab90ce4

varnish-cache/bin/varnishd/cache.h
varnish-cache/bin/varnishd/cache_center.c
varnish-cache/bin/varnishd/cache_fetch.c
varnish-cache/bin/varnishd/cache_vrt.c
varnish-cache/bin/varnishtest/vtc_http.c
varnish-cache/include/vrt.h
varnish-cache/include/vrt_obj.h
varnish-cache/lib/libvcl/vcc_fixed_token.c
varnish-cache/lib/libvcl/vcc_gen_obj.tcl
varnish-cache/lib/libvcl/vcc_obj.c

index 63c230fd4c210ea518ea4bd3e30ff1b7c24cf514..d8fd2f5a448e5896cedf6e59f6719bc5b834f941 100644 (file)
@@ -477,7 +477,8 @@ int EXP_Touch(const struct object *o);
 int EXP_NukeOne(struct sess *sp);
 
 /* cache_fetch.c */
-int Fetch(struct sess *sp);
+int FetchHdr(struct sess *sp);
+int FetchBody(struct sess *sp);
 int FetchReqBody(struct sess *sp);
 void Fetch_Init(void);
 
index a64762edab21032424bf7495111ce98c61013cb0..a58521e11992922c1ddb1d83379bf301409d6a57 100644 (file)
@@ -355,7 +355,7 @@ DOT         label="fetch from backend\n(find obj.ttl)"
 DOT    ]
 DOT    vcl_fetch [
 DOT            shape=record
-DOT            label="vcl_fetch()|req.\nobj.\nbereq."
+DOT            label="vcl_fetch()|req.\nobj.\nbereq.\nberesp."
 DOT    ]
 DOT    fetch -> vcl_fetch [style=bold,color=blue,weight=2]
 DOT    fetch_pass [
@@ -385,7 +385,9 @@ cnt_fetch(struct sess *sp)
        AN(sp->bereq);
        AN(sp->director);
        AZ(sp->vbe);
-       i = Fetch(sp);
+       i = FetchHdr(sp);
+       if (i == 0)
+               i = FetchBody(sp);
        AZ(sp->wrk->wfd);
        AZ(sp->vbe);
        AN(sp->director);
index 03e928c5c2e532c37cd707209e90d363eeed99ab..109d0ac5b18503a714d1a86bbbd720efdcfd1213 100644 (file)
@@ -308,16 +308,13 @@ FetchReqBody(struct sess *sp)
 /*--------------------------------------------------------------------*/
 
 int
-Fetch(struct sess *sp)
+FetchHdr(struct sess *sp)
 {
        struct vbe_conn *vc;
        struct worker *w;
        char *b;
-       int cls;
-       struct http *hp, *hp2;
-       struct storage *st;
+       struct http *hp;
        struct bereq *bereq;
-       int mklen, is_head;
        struct http_conn htc[1];
        int i;
 
@@ -335,7 +332,6 @@ Fetch(struct sess *sp)
        w = sp->wrk;
        bereq = sp->bereq;
        hp = &bereq->http[0];
-       is_head = (strcasecmp(http_GetReq(hp), "head") == 0);
 
        sp->obj->xid = sp->xid;
 
@@ -398,7 +394,37 @@ Fetch(struct sess *sp)
                return (__LINE__);
        }
 
+       return (0);
+
+}
+
+/*--------------------------------------------------------------------*/
+
+int
+FetchBody(struct sess *sp)
+{
+       struct vbe_conn *vc;
+       char *b;
+       int cls;
+       struct http *hp, *hp2;
+       struct storage *st;
+       int mklen, is_head;
+       struct http_conn htc[1];
+
+       CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+       CHECK_OBJ_NOTNULL(sp->wrk, WORKER_MAGIC);
+       CHECK_OBJ_NOTNULL(sp->obj, OBJECT_MAGIC);
+       CHECK_OBJ_NOTNULL(sp->bereq, BEREQ_MAGIC);
+       hp = &sp->bereq->http[1];
+       AN(sp->director);
+       if (sp->obj->objcore != NULL)           /* pass has no objcore */
+               AN(ObjIsBusy(sp->obj));
+       AN(sp->bereq);
+
+       vc = sp->vbe;
+
        sp->obj->entered = TIM_real();
+       is_head = (strcasecmp(http_GetReq(&sp->bereq->http[0]), "head") == 0);
 
        if (http_GetHdr(hp, H_Last_Modified, &b))
                sp->obj->last_modified = TIM_parse(b);
index bfddf0c7f0b465904c04ef8dfd8e713d37074442..d4a5a8e2891632690300f543864172ab02ae3d05 100644 (file)
@@ -102,6 +102,9 @@ vrt_selecthttp(const struct sess *sp, enum gethdr_e where)
        case HDR_BEREQ:
                hp = &sp->bereq->http[0];
                break;
+       case HDR_BERESP:
+               hp = &sp->bereq->http[1];
+               break;
        case HDR_RESP:
                hp = sp->http;
                break;
index 5d69a90fa93d0b016a30ae44c5705042a752086d..5849b896978d443e23949aa9316d1b55908d56f8 100644 (file)
@@ -321,6 +321,11 @@ http_rxchar_eof(struct http *hp, int n)
                pfd[0].events = POLLIN;
                pfd[0].revents = 0;
                i = poll(pfd, 1, hp->timeout);
+               if (i <= 0) {
+                       vtc_log(hp->vl, 0, "HTTP rx failed (%s)",
+                           strerror(errno));
+                       exit (1);
+               }
                assert(i > 0);
                assert(hp->prxbuf < hp->nrxbuf);
                i = read(hp->fd, hp->rxbuf + hp->prxbuf, n);
@@ -341,8 +346,7 @@ http_rxchar(struct http *hp, int n)
 
        i = http_rxchar_eof(hp, n);
        if (i <= 0) {
-               vtc_log(hp->vl, 0, "HTTP rx failed (%s)",
-                   strerror(errno));
+               vtc_log(hp->vl, 0, "HTTP rx failed (%s)", strerror(errno));
                exit (1);
        }
        assert(i > 0);
index 5a0f60dc95bcf2c295e934a158b6e0c864fce712..0084a7b6a777c2157dc2426324f3644782d0a113 100644 (file)
@@ -150,7 +150,7 @@ int VRT_rewrite(const char *, const char *);
 void VRT_error(struct sess *, unsigned, const char *);
 int VRT_switch_config(const char *);
 
-enum gethdr_e { HDR_REQ, HDR_RESP, HDR_OBJ, HDR_BEREQ };
+enum gethdr_e { HDR_REQ, HDR_RESP, HDR_OBJ, HDR_BEREQ, HDR_BERESP };
 char *VRT_GetHdr(const struct sess *, enum gethdr_e where, const char *);
 void VRT_SetHdr(const struct sess *, enum gethdr_e where, const char *,
     const char *, ...);
index 74490878a41d8b5dfac43b8ddad3d3ea0354c48c..66f03b70f5b9eca61f4ad0364c1824014f835ae2 100644 (file)
@@ -34,6 +34,12 @@ double VRT_r_bereq_first_byte_timeout(struct sess *);
 void VRT_l_bereq_first_byte_timeout(struct sess *, double);
 double VRT_r_bereq_between_bytes_timeout(struct sess *);
 void VRT_l_bereq_between_bytes_timeout(struct sess *, double);
+const char * VRT_r_beresp_request(const struct sess *);
+void VRT_l_beresp_request(const struct sess *, const char *, ...);
+const char * VRT_r_beresp_url(const struct sess *);
+void VRT_l_beresp_url(const struct sess *, const char *, ...);
+const char * VRT_r_beresp_proto(const struct sess *);
+void VRT_l_beresp_proto(const struct sess *, const char *, ...);
 const char * VRT_r_obj_proto(const struct sess *);
 void VRT_l_obj_proto(const struct sess *, const char *, ...);
 int VRT_r_obj_status(const struct sess *);
index 3a737f1507ba157d2d3d3d968880e0c1db010a1a..cf88ce3a38f9aa68489a57c8ef7542007f709741 100644 (file)
@@ -159,8 +159,8 @@ vcl_output_lang_h(struct vsb *sb)
 
        /* ../../include/vcl.h */
 
-       vsb_cat(sb, "/*\n * $Id: vcc_gen_fixed_token.tcl 3534 2009-01-19 13");
-       vsb_cat(sb, ":46:31Z phk $\n *\n * NB:  This file is machine genera");
+       vsb_cat(sb, "/*\n * $Id: vcc_gen_fixed_token.tcl 3781 2009-02-17 10");
+       vsb_cat(sb, ":29:20Z phk $\n *\n * NB:  This file is machine genera");
        vsb_cat(sb, "ted, DO NOT EDIT!\n *\n * Edit and run vcc_gen_fixed_t");
        vsb_cat(sb, "oken.tcl instead\n */\n\nstruct sess;\n");
        vsb_cat(sb, "struct cli;\n\ntypedef void vcl_init_f(struct cli *);\n");
@@ -293,15 +293,15 @@ vcl_output_lang_h(struct vsb *sb)
        vsb_cat(sb, "void VRT_error(struct sess *, unsigned, const char *);");
        vsb_cat(sb, "\nint VRT_switch_config(const char *);\n");
        vsb_cat(sb, "\nenum gethdr_e { HDR_REQ, HDR_RESP, HDR_OBJ, HDR_BERE");
-       vsb_cat(sb, "Q };\nchar *VRT_GetHdr(const struct sess *, enum gethd");
-       vsb_cat(sb, "r_e where, const char *);\nvoid VRT_SetHdr(const struc");
-       vsb_cat(sb, "t sess *, enum gethdr_e where, const char *,\n");
-       vsb_cat(sb, "    const char *, ...);\nvoid VRT_handling(struct sess");
-       vsb_cat(sb, " *sp, unsigned hand);\n\n/* Simple stuff */\n");
-       vsb_cat(sb, "int VRT_strcmp(const char *s1, const char *s2);\n");
-       vsb_cat(sb, "void VRT_memmove(void *dst, const void *src, unsigned ");
-       vsb_cat(sb, "len);\n\nvoid VRT_ESI(struct sess *sp);\n");
-       vsb_cat(sb, "void VRT_Rollback(struct sess *sp);\n");
+       vsb_cat(sb, "Q, HDR_BERESP };\nchar *VRT_GetHdr(const struct sess *");
+       vsb_cat(sb, ", enum gethdr_e where, const char *);\n");
+       vsb_cat(sb, "void VRT_SetHdr(const struct sess *, enum gethdr_e whe");
+       vsb_cat(sb, "re, const char *,\n    const char *, ...);\n");
+       vsb_cat(sb, "void VRT_handling(struct sess *sp, unsigned hand);\n");
+       vsb_cat(sb, "\n/* Simple stuff */\nint VRT_strcmp(const char *s1, c");
+       vsb_cat(sb, "onst char *s2);\nvoid VRT_memmove(void *dst, const voi");
+       vsb_cat(sb, "d *src, unsigned len);\n\nvoid VRT_ESI(struct sess *sp");
+       vsb_cat(sb, ");\nvoid VRT_Rollback(struct sess *sp);\n");
        vsb_cat(sb, "\n/* Synthetic pages */\nvoid VRT_synth_page(struct se");
        vsb_cat(sb, "ss *sp, unsigned flags, const char *, ...);\n");
        vsb_cat(sb, "\n/* Backend related */\nvoid VRT_init_dir_simple(stru");
@@ -322,9 +322,9 @@ vcl_output_lang_h(struct vsb *sb)
 
        /* ../../include/vrt_obj.h */
 
-       vsb_cat(sb, "/*\n * $Id: vcc_gen_obj.tcl 3406 2008-11-19 14:13:57Z ");
-       vsb_cat(sb, "petter $\n *\n * NB:  This file is machine generated, ");
-       vsb_cat(sb, "DO NOT EDIT!\n *\n * Edit vcc_gen_obj.tcl instead\n");
+       vsb_cat(sb, "/*\n * $Id: vcc_gen_obj.tcl 3781 2009-02-17 10:29:20Z ");
+       vsb_cat(sb, "phk $\n *\n * NB:  This file is machine generated, DO ");
+       vsb_cat(sb, "NOT EDIT!\n *\n * Edit vcc_gen_obj.tcl instead\n");
        vsb_cat(sb, " */\n\nstruct sockaddr * VRT_r_client_ip(const struct ");
        vsb_cat(sb, "sess *);\nstruct sockaddr * VRT_r_server_ip(struct ses");
        vsb_cat(sb, "s *);\nint VRT_r_server_port(struct sess *);\n");
@@ -354,19 +354,25 @@ vcl_output_lang_h(struct vsb *sb)
        vsb_cat(sb, "*);\nvoid VRT_l_bereq_first_byte_timeout(struct sess *");
        vsb_cat(sb, ", double);\ndouble VRT_r_bereq_between_bytes_timeout(s");
        vsb_cat(sb, "truct sess *);\nvoid VRT_l_bereq_between_bytes_timeout");
-       vsb_cat(sb, "(struct sess *, double);\nconst char * VRT_r_obj_proto");
-       vsb_cat(sb, "(const struct sess *);\nvoid VRT_l_obj_proto(const str");
-       vsb_cat(sb, "uct sess *, const char *, ...);\n");
-       vsb_cat(sb, "int VRT_r_obj_status(const struct sess *);\n");
-       vsb_cat(sb, "void VRT_l_obj_status(const struct sess *, int);\n");
-       vsb_cat(sb, "const char * VRT_r_obj_response(const struct sess *);\n");
-       vsb_cat(sb, "void VRT_l_obj_response(const struct sess *, const cha");
-       vsb_cat(sb, "r *, ...);\nint VRT_r_obj_hits(const struct sess *);\n");
-       vsb_cat(sb, "unsigned VRT_r_obj_cacheable(const struct sess *);\n");
-       vsb_cat(sb, "void VRT_l_obj_cacheable(const struct sess *, unsigned");
-       vsb_cat(sb, ");\ndouble VRT_r_obj_ttl(const struct sess *);\n");
-       vsb_cat(sb, "void VRT_l_obj_ttl(const struct sess *, double);\n");
-       vsb_cat(sb, "double VRT_r_obj_grace(const struct sess *);\n");
+       vsb_cat(sb, "(struct sess *, double);\nconst char * VRT_r_beresp_re");
+       vsb_cat(sb, "quest(const struct sess *);\nvoid VRT_l_beresp_request");
+       vsb_cat(sb, "(const struct sess *, const char *, ...);\n");
+       vsb_cat(sb, "const char * VRT_r_beresp_url(const struct sess *);\n");
+       vsb_cat(sb, "void VRT_l_beresp_url(const struct sess *, const char ");
+       vsb_cat(sb, "*, ...);\nconst char * VRT_r_beresp_proto(const struct");
+       vsb_cat(sb, " sess *);\nvoid VRT_l_beresp_proto(const struct sess *");
+       vsb_cat(sb, ", const char *, ...);\nconst char * VRT_r_obj_proto(co");
+       vsb_cat(sb, "nst struct sess *);\nvoid VRT_l_obj_proto(const struct");
+       vsb_cat(sb, " sess *, const char *, ...);\nint VRT_r_obj_status(con");
+       vsb_cat(sb, "st struct sess *);\nvoid VRT_l_obj_status(const struct");
+       vsb_cat(sb, " sess *, int);\nconst char * VRT_r_obj_response(const ");
+       vsb_cat(sb, "struct sess *);\nvoid VRT_l_obj_response(const struct ");
+       vsb_cat(sb, "sess *, const char *, ...);\nint VRT_r_obj_hits(const ");
+       vsb_cat(sb, "struct sess *);\nunsigned VRT_r_obj_cacheable(const st");
+       vsb_cat(sb, "ruct sess *);\nvoid VRT_l_obj_cacheable(const struct s");
+       vsb_cat(sb, "ess *, unsigned);\ndouble VRT_r_obj_ttl(const struct s");
+       vsb_cat(sb, "ess *);\nvoid VRT_l_obj_ttl(const struct sess *, doubl");
+       vsb_cat(sb, "e);\ndouble VRT_r_obj_grace(const struct sess *);\n");
        vsb_cat(sb, "void VRT_l_obj_grace(const struct sess *, double);\n");
        vsb_cat(sb, "double VRT_r_obj_lastuse(const struct sess *);\n");
        vsb_cat(sb, "const char * VRT_r_obj_hash(const struct sess *);\n");
index 89ce902989f0b5bd74ed78fb18d47c85894e7808..2f5b18af308380c3548437cc6c55ccc16036c8ea 100755 (executable)
@@ -106,6 +106,7 @@ set spobj {
        "struct sess *"
     }
 
+    #######################################################################
     # Request sent to backend
     { bereq.request
        RW STRING
@@ -143,6 +144,30 @@ set spobj {
        "struct sess *"
     }
 
+    #######################################################################
+    # Response from the backend
+    { beresp.request
+       RW STRING
+       {                             fetch                        }
+       "const struct sess *"
+    }
+    { beresp.url
+       RW STRING
+       {                             fetch                        }
+       "const struct sess *"
+    }
+    { beresp.proto
+       RW STRING
+       {                             fetch                        }
+       "const struct sess *"
+    }
+    { beresp.http.
+       RW HDR_BEREQ
+       {                             fetch                        }
+       "const struct sess *"
+    }
+
+    #######################################################################
     # The (possibly) cached object
     { obj.proto
        RW STRING
index c9c6c98b89e06c5e21e963993993b04670e8f359..74f1391a4312a99254d145ef6f98545afc38787d 100644 (file)
@@ -123,6 +123,26 @@ struct var vcc_vars[] = {
            V_RW,           0,
            VCL_MET_PASS | VCL_MET_MISS
        },
+       { "beresp.request", STRING, 14,
+           "VRT_r_beresp_request(sp)",     "VRT_l_beresp_request(sp, ",
+           V_RW,           0,
+           VCL_MET_FETCH
+       },
+       { "beresp.url", STRING, 10,
+           "VRT_r_beresp_url(sp)",         "VRT_l_beresp_url(sp, ",
+           V_RW,           0,
+           VCL_MET_FETCH
+       },
+       { "beresp.proto", STRING, 12,
+           "VRT_r_beresp_proto(sp)",       "VRT_l_beresp_proto(sp, ",
+           V_RW,           0,
+           VCL_MET_FETCH
+       },
+       { "beresp.http.", HEADER, 12,
+           "VRT_r_beresp_http_(sp)",       "VRT_l_beresp_http_(sp, ",
+           V_RW,           "HDR_BEREQ",
+           VCL_MET_FETCH
+       },
        { "obj.proto", STRING, 9,
            "VRT_r_obj_proto(sp)",          "VRT_l_obj_proto(sp, ",
            V_RW,           0,