[master] 12e191c Switch to the list format for VFP's, now visible in beresp.filters

Poul-Henning Kamp phk at FreeBSD.org
Tue Apr 17 22:33:14 UTC 2018


commit 12e191c27c84805269f43a39a77af8cf673721fe
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Tue Apr 17 22:31:44 2018 +0000

    Switch to the list format for VFP's, now visible in beresp.filters

diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index ee6091d..424ccbc 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -36,6 +36,7 @@
 #include "hash/hash_slinger.h"
 #include "storage/storage.h"
 #include "vcl.h"
+#include "vct.h"
 #include "vtim.h"
 
 /*--------------------------------------------------------------------
@@ -500,9 +501,12 @@ vbf_stp_fetchbody(struct worker *wrk, struct busyobj *bo)
 /*--------------------------------------------------------------------
  */
 
-static int
-vbf_figure_out_vfp(struct busyobj *bo)
+static void
+vbf_default_filter_list(const struct busyobj *bo, struct vsb *vsb)
 {
+
+	int do_gzip = bo->do_gzip;
+	int do_gunzip = bo->do_gunzip;
 	int is_gzip, is_gunzip;
 
 	/*
@@ -515,52 +519,125 @@ vbf_figure_out_vfp(struct busyobj *bo)
 	 *	"Content-Encoding: gzip"	--> object is gzip'ed.
 	 *	no Content-Encoding		--> object is not gzip'ed.
 	 *	anything else			--> do nothing wrt gzip
-	 *
 	 */
 
 	/* No body -> done */
-	if (bo->htc->body_status == BS_NONE ||
-	    bo->htc->content_length == 0) {
-		http_Unset(bo->beresp, H_Content_Encoding);
-		bo->do_gzip = bo->do_gunzip = 0;
-		bo->do_stream = 0;
-		return (0);
-	}
+	if (bo->htc->body_status == BS_NONE || bo->htc->content_length == 0)
+		return;
 
 	if (!cache_param->http_gzip_support)
-		bo->do_gzip = bo->do_gunzip = 0;
+		do_gzip = do_gunzip = 0;
 
 	is_gzip = http_HdrIs(bo->beresp, H_Content_Encoding, "gzip");
 	is_gunzip = !http_GetHdr(bo->beresp, H_Content_Encoding, NULL);
 	assert(is_gzip == 0 || is_gunzip == 0);
 
 	/* We won't gunzip unless it is gzip'ed */
-	if (bo->do_gunzip && !is_gzip)
-		bo->do_gunzip = 0;
+	if (do_gunzip && !is_gzip)
+		do_gunzip = 0;
 
 	/* We wont gzip unless if it already is gzip'ed */
-	if (bo->do_gzip && !is_gunzip)
-		bo->do_gzip = 0;
+	if (do_gzip && !is_gunzip)
+		do_gzip = 0;
 
 	/* But we can't do both at the same time */
-	assert(bo->do_gzip == 0 || bo->do_gunzip == 0);
+	assert(do_gzip == 0 || do_gunzip == 0);
 
-	if (bo->do_gunzip || (is_gzip && bo->do_esi))
-		if (VFP_Push(bo->vfc, &VFP_gunzip) == NULL)
-			return (-1);
+	if (do_gunzip || (is_gzip && bo->do_esi))
+		VSB_cat(vsb, " gunzip");
 
-	if (bo->do_esi && (bo->do_gzip || (is_gzip && !bo->do_gunzip)))
-		return (VFP_Push(bo->vfc, &VFP_esi_gzip) == NULL ? -1 : 0);
+	if (bo->do_esi && (do_gzip || (is_gzip && !do_gunzip))) {
+		VSB_cat(vsb, " esi_gzip");
+		return;
+	}
 
-	if (bo->do_esi)
-		return (VFP_Push(bo->vfc, &VFP_esi) == NULL ? -1 : 0);
+	if (bo->do_esi) {
+		VSB_cat(vsb, " esi");
+		return;
+	}
+
+	if (do_gzip)
+		VSB_cat(vsb, " gzip");
 
-	if (bo->do_gzip)
-		return (VFP_Push(bo->vfc, &VFP_gzip) == NULL ? -1 : 0);
+	if (is_gzip && !do_gunzip)
+		VSB_cat(vsb, " testgunzip");
+}
 
-	if (is_gzip && !bo->do_gunzip)
-		return (VFP_Push(bo->vfc, &VFP_testgunzip) == NULL ? -1 : 0);
 
+const char *
+VBF_Get_Filter_List(struct busyobj *bo)
+{
+	unsigned u;
+	struct vsb vsb[1];
+
+	u = WS_Reserve(bo->ws, 0);
+	if (u == 0) {
+		WS_Release(bo->ws, 0);
+		WS_MarkOverflow(bo->ws);
+		return (NULL);
+	}
+	AN(VSB_new(vsb, bo->ws->f, u, VSB_FIXEDLEN));
+	vbf_default_filter_list(bo, vsb);
+	if (VSB_finish(vsb)) {
+		WS_Release(bo->ws, 0);
+		WS_MarkOverflow(bo->ws);
+		return (NULL);
+	}
+	WS_Release(bo->ws, VSB_len(vsb) + 1);
+	return (VSB_data(vsb) + 1);
+}
+
+static const struct vfp *vfplist[] = {
+	&VFP_testgunzip,
+	&VFP_gunzip,
+	&VFP_gzip,
+	&VFP_esi,
+	&VFP_esi_gzip,
+	NULL,
+};
+
+static int
+vbf_figure_out_vfp(struct busyobj *bo)
+{
+	const char *p, *q;
+	const struct vfp **vp;
+	int l;
+
+	/* No body -> done */
+	if (bo->htc->body_status == BS_NONE || bo->htc->content_length == 0) {
+		http_Unset(bo->beresp, H_Content_Encoding);
+		bo->do_gzip = bo->do_gunzip = 0;
+		bo->do_stream = 0;
+		bo->filter_list = "";
+		return (0);
+	}
+
+	if (bo->filter_list == NULL)
+		bo->filter_list = VBF_Get_Filter_List(bo);
+
+	VSLb(bo->vsl, SLT_Debug, "Filters <%s>", bo->filter_list);
+
+	for (p = bo->filter_list; *p; p = q) {
+		if (vct_isspace(*p)) {
+			q = p + 1;
+			continue;
+		}
+		for (q = p; *q; q++)
+			if (vct_isspace(*q))
+				break;
+		for(vp = vfplist; *vp != NULL; vp++) {
+			l = strlen((*vp)->name);
+			if (l != q - p)
+				continue;
+			if (!memcmp(p, (*vp)->name, l))
+				break;
+		}
+		if (*vp == NULL)
+			return (VFP_Error(bo->vfc,
+			    "Filter '%.*s' not found", (int)(q-p), p));
+		if (VFP_Push(bo->vfc, *vp) == NULL)
+			return (-1);
+	}
 	return (0);
 }
 
diff --git a/bin/varnishd/cache/cache_varnishd.h b/bin/varnishd/cache/cache_varnishd.h
index e05e87c..397703a 100644
--- a/bin/varnishd/cache/cache_varnishd.h
+++ b/bin/varnishd/cache/cache_varnishd.h
@@ -201,6 +201,7 @@ enum vbf_fetch_mode_e {
 };
 void VBF_Fetch(struct worker *wrk, struct req *req,
     struct objcore *oc, struct objcore *oldoc, enum vbf_fetch_mode_e);
+const char *VBF_Get_Filter_List(struct busyobj *);
 
 /* cache_fetch_proc.c */
 void VFP_Init(void);
diff --git a/bin/varnishd/cache/cache_vrt_var.c b/bin/varnishd/cache/cache_vrt_var.c
index bb55018..5e56b3a 100644
--- a/bin/varnishd/cache/cache_vrt_var.c
+++ b/bin/varnishd/cache/cache_vrt_var.c
@@ -36,7 +36,6 @@
 #include "common/heritage.h"
 
 #include "vcl.h"
-#include "vct.h"
 
 #include "cache_director.h"
 #include "vrt_obj.h"
@@ -920,20 +919,12 @@ HTTP_VAR(beresp)
 VCL_STRING
 VRT_r_beresp_filters(VRT_CTX)
 {
-	const char *p;
 
 	CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
 	CHECK_OBJ_NOTNULL(ctx->bo, BUSYOBJ_MAGIC);
 	if (ctx->bo->filter_list != NULL)
 		return(ctx->bo->filter_list);
-#if 1
-	p = "Not Yet";
-#else
-	p = VBF_Get_Filter_List(ctx->bo);
-	WS_Release(ctx->bo->ws, strlen(p) + 1);
-#endif
-	while(vct_isspace(*p))
-		p++;
-	return (p);
+	/* We do not set bo->filter_list yet, things might still change */
+	return (VBF_Get_Filter_List(ctx->bo));
 }
 


More information about the varnish-commit mailing list