[master] e8cae03 Move VPF setup before vcl_recv{}

Poul-Henning Kamp phk at FreeBSD.org
Wed Feb 10 22:27:17 CET 2016


commit e8cae033eab21cce6ca4ca8f94cf4cd693d639a3
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Wed Feb 10 21:21:39 2016 +0000

    Move VPF setup before vcl_recv{}

diff --git a/bin/varnishd/cache/cache_panic.c b/bin/varnishd/cache/cache_panic.c
index 0a2cedf..2363b25 100644
--- a/bin/varnishd/cache/cache_panic.c
+++ b/bin/varnishd/cache/cache_panic.c
@@ -380,7 +380,7 @@ pan_req(struct vsb *vsb, const struct req *req)
 		return;
 	VSB_indent(vsb, 2);
 
-	VSB_printf(vsb, "vxid = %u, transport = %s", VXID(req->vsl->wid),
+	VSB_printf(vsb, "vxid = %u, transport = %s\n", VXID(req->vsl->wid),
 	    req->transport == NULL ? "NULL" : req->transport->name);
 
 	switch (req->req_step) {
diff --git a/bin/varnishd/cache/cache_req_body.c b/bin/varnishd/cache/cache_req_body.c
index 51492d3..fa0f98f 100644
--- a/bin/varnishd/cache/cache_req_body.c
+++ b/bin/varnishd/cache/cache_req_body.c
@@ -33,7 +33,6 @@
 #include <stdlib.h>
 
 #include "cache.h"
-#include "http1/cache_http1.h"
 #include "cache_filter.h"
 #include "vtim.h"
 #include "hash/hash_slinger.h"
@@ -97,11 +96,8 @@ VRB_Iterate(struct req *req, objiterate_f *func, void *priv)
 	}
 
 	CHECK_OBJ_NOTNULL(req->htc, HTTP_CONN_MAGIC);
+	CHECK_OBJ_NOTNULL(req->htc->vfc, VFP_CTX_MAGIC);
 	vfc = req->htc->vfc;
-	VFP_Setup(vfc);
-	vfc->http = req->http;
-	vfc->wrk = req->wrk;
-	V1F_Setup_Fetch(vfc, req->htc);
 	if (VFP_Open(vfc) < 0) {
 		VSLb(req->vsl, SLT_FetchError, "Could not open Fetch Pipeline");
 		return (-1);
@@ -214,9 +210,8 @@ VRB_Cache(struct req *req, ssize_t maxsize)
 	}
 
 	CHECK_OBJ_NOTNULL(req->htc, HTTP_CONN_MAGIC);
+	CHECK_OBJ_NOTNULL(req->htc->vfc, VFP_CTX_MAGIC);
 	vfc = req->htc->vfc;
-	VFP_Setup(vfc);
-	vfc->wrk = req->wrk;
 
 	if (req->htc->content_length > maxsize) {
 		req->req_body_status = REQ_BODY_FAIL;
@@ -224,14 +219,11 @@ VRB_Cache(struct req *req, ssize_t maxsize)
 		return (-1);
 	}
 
-	vfc->http = req->http;
-
 	req->body_oc = HSH_Private(req->wrk);
 	AN(req->body_oc);
 	XXXAN(STV_NewObject(req->wrk, req->body_oc, TRANSIENT_STORAGE, 8));
 
 	vfc->oc = req->body_oc;
-	V1F_Setup_Fetch(vfc, req->htc);
 
 	if (VFP_Open(vfc) < 0) {
 		req->req_body_status = REQ_BODY_FAIL;
diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index 2d65fbd..92404b9 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -689,6 +689,12 @@ cnt_recv(struct worker *wrk, struct req *req)
 
 	http_CollectHdr(req->http, H_Cache_Control);
 
+	VFP_Setup(req->htc->vfc);
+	req->htc->vfc->http = req->http;
+	req->htc->vfc->wrk = wrk;
+	if (req->transport->req_body != NULL)
+		req->transport->req_body(req);
+
 	VCL_recv_method(req->vcl, wrk, req, NULL, NULL);
 
 	/* Attempts to cache req.body may fail */
diff --git a/bin/varnishd/cache/cache_transport.h b/bin/varnishd/cache/cache_transport.h
index 6b8d7e9..268eac2 100644
--- a/bin/varnishd/cache/cache_transport.h
+++ b/bin/varnishd/cache/cache_transport.h
@@ -34,6 +34,7 @@
  */
 
 typedef void vtr_deliver_f (struct req *, struct boc *, int sendbody);
+typedef void vtr_req_body_f (struct req *);
 
 struct transport {
 	unsigned		magic;
@@ -44,5 +45,6 @@ struct transport {
 	task_func_t		*new_session;
 	task_func_t		*unwait;
 
+	vtr_req_body_f		*req_body;
 	vtr_deliver_f		*deliver;
 };
diff --git a/bin/varnishd/http1/cache_http1_fsm.c b/bin/varnishd/http1/cache_http1_fsm.c
index dff2f0a..592ba8f 100644
--- a/bin/varnishd/http1/cache_http1_fsm.c
+++ b/bin/varnishd/http1/cache_http1_fsm.c
@@ -38,6 +38,7 @@
 #include <stdlib.h>
 
 #include "cache/cache.h"
+#include "cache/cache_filter.h"
 #include "common/heritage.h"
 #include "cache/cache_transport.h"
 #include "cache_http1.h"
@@ -111,11 +112,28 @@ http1_unwait(struct worker *wrk, void *arg)
 	wrk->task.priv = req;
 }
 
+static void __match_proto__(vtr_req_body_t)
+http1_req_body(struct req *req)
+{
+
+	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
+	switch(req->htc->body_status) {
+	case BS_EOF:
+	case BS_LENGTH:
+	case BS_CHUNKED:
+		V1F_Setup_Fetch(req->htc->vfc, req->htc);
+		break;
+	default:
+		break;
+	}
+}
+
 const struct transport HTTP1_transport = {
 	.name =			"HTTP/1",
 	.magic =		TRANSPORT_MAGIC,
 	.deliver =		V1D_Deliver,
 	.unwait =		http1_unwait,
+	.req_body =		http1_req_body,
 	.new_session =		http1_new_session,
 };
 



More information about the varnish-commit mailing list