[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