From eacef6acda67b2f6ca41da6b68cc9512f4bd97f7 Mon Sep 17 00:00:00 2001
From: Dag Haavi Finstad <daghf@varnish-software.com>
Date: Tue, 19 Feb 2013 14:52:58 +0100
Subject: [PATCH] Make std.collect() also work for resp.http and bereq.http.

Fixes: #1222
---
 bin/varnishtest/tests/m00006.vtc |   16 ++++++++++++++++
 lib/libvmod_std/vmod_std.c       |   11 ++++++++++-
 2 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/bin/varnishtest/tests/m00006.vtc b/bin/varnishtest/tests/m00006.vtc
index c35cc38..123d8fd 100644
--- a/bin/varnishtest/tests/m00006.vtc
+++ b/bin/varnishtest/tests/m00006.vtc
@@ -6,6 +6,10 @@ server s1 {
 	expect req.http.foo == "1, 2"
 	txresp -hdr "bar: a" -hdr "bar: b" -bodylen 1
 
+	rxreq
+	expect req.url == "/2"
+	expect req.http.baz == "1, 2"
+	txresp -hdr "qux: a" -hdr "qux: b" -bodylen 1
 } -start
 
 varnish v1 -vcl+backend {
@@ -14,9 +18,15 @@ varnish v1 -vcl+backend {
 	sub vcl_recv {
 		std.collect(req.http.foo);
 	}
+	sub vcl_miss {
+		std.collect(bereq.http.baz);
+	}
 	sub vcl_fetch {
 		std.collect(beresp.http.bar);
 	}
+	sub vcl_deliver {
+		std.collect(resp.http.qux);
+	}
 } -start
 
 client c1 {
@@ -25,6 +35,12 @@ client c1 {
 	expect resp.http.bar == "a, b"
 	expect resp.status == 200
 	expect resp.bodylen == 1
+
+	txreq -url "/2" -hdr "Baz: 1" -hdr "Baz: 2"
+	rxresp
+	expect resp.http.qux == "a, b"
+	expect resp.status == 200
+	expect resp.bodylen == 1
 } -run
 
 varnish v1 -errvcl {'beresp.http.bar': Not available in method 'vcl_recv'}  {
diff --git a/lib/libvmod_std/vmod_std.c b/lib/libvmod_std/vmod_std.c
index 86b2ad3..cbea944 100644
--- a/lib/libvmod_std/vmod_std.c
+++ b/lib/libvmod_std/vmod_std.c
@@ -175,6 +175,15 @@ vmod_collect(struct req *req, const struct gethdr_s *hdr)
 	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
 	if (hdr->where == HDR_REQ)
 		http_CollectHdr(req->http, hdr->what);
-	else if (hdr->where == HDR_BERESP && req->busyobj != NULL)
+	else if (hdr->where == HDR_BEREQ) {
+		AN(req->busyobj);
+		http_CollectHdr(req->busyobj->bereq, hdr->what);
+	}
+	else if (hdr->where == HDR_BERESP) {
+		AN(req->busyobj);
 		http_CollectHdr(req->busyobj->beresp, hdr->what);
+	}
+	else if (hdr->where == HDR_RESP) {
+		http_CollectHdr(req->resp, hdr->what);
+	}
 }
-- 
1.7.10.4

