[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