From: phk Date: Fri, 27 Feb 2009 12:02:50 +0000 (+0000) Subject: Add a beresp.* variable family, which contains the backend response X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3f8d6282350e492dceb5a854504694fe64806ee9;p=varnish Add a beresp.* variable family, which contains the backend response 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 --- diff --git a/varnish-cache/bin/varnishd/cache.h b/varnish-cache/bin/varnishd/cache.h index 63c230fd..d8fd2f5a 100644 --- a/varnish-cache/bin/varnishd/cache.h +++ b/varnish-cache/bin/varnishd/cache.h @@ -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); diff --git a/varnish-cache/bin/varnishd/cache_center.c b/varnish-cache/bin/varnishd/cache_center.c index a64762ed..a58521e1 100644 --- a/varnish-cache/bin/varnishd/cache_center.c +++ b/varnish-cache/bin/varnishd/cache_center.c @@ -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); diff --git a/varnish-cache/bin/varnishd/cache_fetch.c b/varnish-cache/bin/varnishd/cache_fetch.c index 03e928c5..109d0ac5 100644 --- a/varnish-cache/bin/varnishd/cache_fetch.c +++ b/varnish-cache/bin/varnishd/cache_fetch.c @@ -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); diff --git a/varnish-cache/bin/varnishd/cache_vrt.c b/varnish-cache/bin/varnishd/cache_vrt.c index bfddf0c7..d4a5a8e2 100644 --- a/varnish-cache/bin/varnishd/cache_vrt.c +++ b/varnish-cache/bin/varnishd/cache_vrt.c @@ -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; diff --git a/varnish-cache/bin/varnishtest/vtc_http.c b/varnish-cache/bin/varnishtest/vtc_http.c index 5d69a90f..5849b896 100644 --- a/varnish-cache/bin/varnishtest/vtc_http.c +++ b/varnish-cache/bin/varnishtest/vtc_http.c @@ -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); diff --git a/varnish-cache/include/vrt.h b/varnish-cache/include/vrt.h index 5a0f60dc..0084a7b6 100644 --- a/varnish-cache/include/vrt.h +++ b/varnish-cache/include/vrt.h @@ -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 *, ...); diff --git a/varnish-cache/include/vrt_obj.h b/varnish-cache/include/vrt_obj.h index 74490878..66f03b70 100644 --- a/varnish-cache/include/vrt_obj.h +++ b/varnish-cache/include/vrt_obj.h @@ -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 *); diff --git a/varnish-cache/lib/libvcl/vcc_fixed_token.c b/varnish-cache/lib/libvcl/vcc_fixed_token.c index 3a737f15..cf88ce3a 100644 --- a/varnish-cache/lib/libvcl/vcc_fixed_token.c +++ b/varnish-cache/lib/libvcl/vcc_fixed_token.c @@ -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"); diff --git a/varnish-cache/lib/libvcl/vcc_gen_obj.tcl b/varnish-cache/lib/libvcl/vcc_gen_obj.tcl index 89ce9029..2f5b18af 100755 --- a/varnish-cache/lib/libvcl/vcc_gen_obj.tcl +++ b/varnish-cache/lib/libvcl/vcc_gen_obj.tcl @@ -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 diff --git a/varnish-cache/lib/libvcl/vcc_obj.c b/varnish-cache/lib/libvcl/vcc_obj.c index c9c6c98b..74f1391a 100644 --- a/varnish-cache/lib/libvcl/vcc_obj.c +++ b/varnish-cache/lib/libvcl/vcc_obj.c @@ -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,