[master] eb34f7d Turn {be}req.hash into a BLOB

Federico G. Schwindt fgsch at lodoss.net
Mon Sep 4 16:46:10 CEST 2017


commit eb34f7dd5b3afcb9ef9df002f63655180694dc5f
Author: Federico G. Schwindt <fgsch at lodoss.net>
Date:   Mon Sep 4 15:06:58 2017 +0100

    Turn {be}req.hash into a BLOB
    
    Fixes #2402.

diff --git a/bin/varnishd/cache/cache_vrt_var.c b/bin/varnishd/cache/cache_vrt_var.c
index 42f93b6..243a814 100644
--- a/bin/varnishd/cache/cache_vrt_var.c
+++ b/bin/varnishd/cache/cache_vrt_var.c
@@ -768,34 +768,32 @@ VRT_BODY_L(resp)
 
 /*--------------------------------------------------------------------*/
 
-static const char *
-vrt_hash(VRT_CTX, uint8_t *digest)
-{
-	char *p;
-	int i;
-
-	p = WS_Alloc(ctx->ws, SHA256_LEN * 2 + 1);
-	if (p == NULL)
-		return (NULL);
-	for (i = 0; i < SHA256_LEN; i++)
-		sprintf(&p[i * 2], "%02x", digest[i]);
+static struct vmod_priv *
+vrt_do_blob(VRT_CTX, uint8_t *digest)
+{
+	struct vmod_priv *p;
+	p = (void *)WS_Alloc(ctx->ws, sizeof *p);
+	AN(p);
+	memset(p, 0, sizeof *p);
+	p->len = DIGEST_LEN;
+	p->priv = WS_Copy(ctx->ws, digest, DIGEST_LEN);
 	return (p);
 }
 
-const char *
+VCL_BLOB
 VRT_r_req_hash(VRT_CTX)
 {
 	CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
 	CHECK_OBJ_NOTNULL(ctx->req, REQ_MAGIC);
-	return (vrt_hash(ctx, ctx->req->digest));
+	return (vrt_do_blob(ctx, ctx->req->digest));
 }
 
-const char *
+VCL_BLOB
 VRT_r_bereq_hash(VRT_CTX)
 {
 	CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
 	CHECK_OBJ_NOTNULL(ctx->bo, BUSYOBJ_MAGIC);
-	return (vrt_hash(ctx, ctx->bo->digest));
+	return (vrt_do_blob(ctx, ctx->bo->digest));
 }
 
 /*--------------------------------------------------------------------*/
diff --git a/bin/varnishtest/tests/b00051.vtc b/bin/varnishtest/tests/b00051.vtc
index 1863850..1ec12a1 100644
--- a/bin/varnishtest/tests/b00051.vtc
+++ b/bin/varnishtest/tests/b00051.vtc
@@ -6,11 +6,12 @@ server s1 {
 } -start
 
 varnish v1 -vcl+backend {
+	import vtc;
 	sub vcl_backend_response {
-		set beresp.http.bereq_hash = bereq.hash;
+		set beresp.http.bereq_hash = vtc.blob2hex(bereq.hash);
 	}
 	sub vcl_deliver {
-		set resp.http.req_hash = req.hash;
+		set resp.http.req_hash = vtc.blob2hex(req.hash);
 	}
 } -start
 
diff --git a/bin/varnishtest/tests/v00020.vtc b/bin/varnishtest/tests/v00020.vtc
index b113669..77dcefa 100644
--- a/bin/varnishtest/tests/v00020.vtc
+++ b/bin/varnishtest/tests/v00020.vtc
@@ -220,15 +220,17 @@ varnish v1 -errvcl {Function returns VOID} {
 
 varnish v1 -errvcl {'req.hash': Not available in method 'vcl_recv'.} {
 	backend b { .host = "127.0.0.1"; }
+	import vtc;
 	sub vcl_recv {
-		set req.http.foo = req.hash;
+		set req.http.foo = vtc.blob2hex(req.hash);
 	}
 }
 
 varnish v1 -errvcl {'req.hash': Not available in method 'vcl_hash'.} {
 	backend b { .host = "127.0.0.1"; }
+	import vtc;
 	sub vcl_hash {
-		set req.http.foo = req.hash;
+		set req.http.foo = vtc.blob2hex(req.hash);
 	}
 }
 
diff --git a/lib/libvcc/generate.py b/lib/libvcc/generate.py
index 8bbd1e6..64e2167 100755
--- a/lib/libvcc/generate.py
+++ b/lib/libvcc/generate.py
@@ -234,7 +234,7 @@ sp_variables = [
 		"""
 	),
 	('req.hash',
-		'STRING',
+		'BLOB',
 		('hit', 'miss', 'pass', 'purge', 'deliver', ),
 		(), """
 		The hash key of this request.
@@ -428,7 +428,7 @@ sp_variables = [
 		"""
 	),
 	('bereq.hash',
-		'STRING',
+		'BLOB',
 		('pipe', 'backend', ),
 		(), """
 		The hash key of this request.



More information about the varnish-commit mailing list