[master] 7cd22d4a7 Add `req.transport` which returns "HTTP/1" or "HTTP/2" as appropriate.

Poul-Henning Kamp phk at FreeBSD.org
Sun Dec 19 18:14:04 UTC 2021


commit 7cd22d4a769e8b4d7f4b12fe584c85b0afd92c7a
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Sun Dec 19 17:40:23 2021 +0000

    Add `req.transport` which returns "HTTP/1" or "HTTP/2" as appropriate.

diff --git a/bin/varnishd/cache/cache_acceptor.c b/bin/varnishd/cache/cache_acceptor.c
index fd86f4835..5232f2a7a 100644
--- a/bin/varnishd/cache/cache_acceptor.c
+++ b/bin/varnishd/cache/cache_acceptor.c
@@ -800,9 +800,9 @@ XPORT_Init(void)
 
 	ASSERT_MGT();
 
-	XPORT_Register(&PROXY_transport);
-	XPORT_Register(&HTTP1_transport);
-	XPORT_Register(&H2_transport);
+#define TRANSPORT_MACRO(name) XPORT_Register(&name##_transport);
+	TRANSPORTS
+#undef TRANSPORT_MACRO
 }
 
 const struct transport *
diff --git a/bin/varnishd/cache/cache_transport.h b/bin/varnishd/cache/cache_transport.h
index 36502911a..6815ce446 100644
--- a/bin/varnishd/cache/cache_transport.h
+++ b/bin/varnishd/cache/cache_transport.h
@@ -69,9 +69,15 @@ struct transport {
 	VTAILQ_ENTRY(transport)		list;
 };
 
-extern struct transport PROXY_transport;
-extern struct transport HTTP1_transport;
-extern struct transport H2_transport;
+#define TRANSPORTS \
+	TRANSPORT_MACRO(PROXY) \
+	TRANSPORT_MACRO(HTTP1) \
+	TRANSPORT_MACRO(HTTP2)
+
+#define TRANSPORT_MACRO(name) extern struct transport name##_transport;
+TRANSPORTS
+#undef TRANSPORT_MACRO
+
 htc_complete_f H2_prism_complete;
 void H2_PU_Sess(struct worker *, struct sess *, struct req *);
 void H2_OU_Sess(struct worker *, struct sess *, struct req *);
diff --git a/bin/varnishd/cache/cache_vrt_var.c b/bin/varnishd/cache/cache_vrt_var.c
index d80b96526..8d2da90ca 100644
--- a/bin/varnishd/cache/cache_vrt_var.c
+++ b/bin/varnishd/cache/cache_vrt_var.c
@@ -35,6 +35,7 @@
 #include <stdio.h>
 
 #include "cache_varnishd.h"
+#include "cache_transport.h"
 #include "common/heritage.h"
 
 #include "vcl.h"
@@ -634,6 +635,18 @@ VRT_r_bereq_retries(VRT_CTX)
 	return (ctx->bo->retries);
 }
 
+/*--------------------------------------------------------------------*/
+
+VCL_STRING
+VRT_r_req_transport(VRT_CTX)
+{
+	CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
+
+	CHECK_OBJ_NOTNULL(ctx->req, REQ_MAGIC);
+	CHECK_OBJ_NOTNULL(ctx->req->transport, TRANSPORT_MAGIC);
+	return (ctx->req->transport->name);
+}
+
 /*--------------------------------------------------------------------
  * In exp.*:
  *	t_origin is absolute
diff --git a/bin/varnishd/http2/cache_http2_proto.c b/bin/varnishd/http2/cache_http2_proto.c
index df5d4bc2e..f2d238769 100644
--- a/bin/varnishd/http2/cache_http2_proto.c
+++ b/bin/varnishd/http2/cache_http2_proto.c
@@ -677,7 +677,7 @@ h2_rx_headers(struct worker *wrk, struct h2_sess *h2, struct h2_req *r2)
 
 	h2->new_req = req;
 	req->sp = h2->sess;
-	req->transport = &H2_transport;
+	req->transport = &HTTP2_transport;
 
 	req->t_first = VTIM_real();
 	req->t_req = VTIM_real();
diff --git a/bin/varnishd/http2/cache_http2_session.c b/bin/varnishd/http2/cache_http2_session.c
index b260ffc59..1740d2a0a 100644
--- a/bin/varnishd/http2/cache_http2_session.c
+++ b/bin/varnishd/http2/cache_http2_session.c
@@ -278,7 +278,7 @@ h2_ou_session(struct worker *wrk, struct h2_sess *h2,
 
 	/* Start req thread */
 	r2 = h2_new_req(h2, 1, req);
-	req->transport = &H2_transport;
+	req->transport = &HTTP2_transport;
 	assert(req->req_step == R_STP_TRANSPORT);
 	req->task->func = h2_do_req;
 	req->task->priv = req;
@@ -317,7 +317,7 @@ H2_PU_Sess(struct worker *wrk, struct sess *sp, struct req *req)
 {
 	VSLb(req->vsl, SLT_Debug, "H2 Prior Knowledge Upgrade");
 	req->err_code = H2_PU_MARKER;
-	SES_SetTransport(wrk, sp, req, &H2_transport);
+	SES_SetTransport(wrk, sp, req, &HTTP2_transport);
 }
 
 void
@@ -325,7 +325,7 @@ H2_OU_Sess(struct worker *wrk, struct sess *sp, struct req *req)
 {
 	VSLb(req->vsl, SLT_Debug, "H2 Optimistic Upgrade");
 	req->err_code = H2_OU_MARKER;
-	SES_SetTransport(wrk, sp, req, &H2_transport);
+	SES_SetTransport(wrk, sp, req, &HTTP2_transport);
 }
 
 static void v_matchproto_(task_func_t)
@@ -349,7 +349,7 @@ h2_new_session(struct worker *wrk, void *arg)
 	if (wrk->wpriv->vcl)
 		VCL_Rel(&wrk->wpriv->vcl);
 
-	assert(req->transport == &H2_transport);
+	assert(req->transport == &HTTP2_transport);
 
 	assert (req->err_code == H2_PU_MARKER || req->err_code == H2_OU_MARKER);
 
@@ -438,8 +438,8 @@ h2_new_session(struct worker *wrk, void *arg)
 	wrk->vsl = NULL;
 }
 
-struct transport H2_transport = {
-	.name =			"H2",
+struct transport HTTP2_transport = {
+	.name =			"HTTP/2",
 	.magic =		TRANSPORT_MAGIC,
 	.deliver =		h2_deliver,
 	.minimal_response =	h2_minimal_response,
diff --git a/bin/varnishtest/tests/b00002.vtc b/bin/varnishtest/tests/b00002.vtc
index ade1169d3..c3feb0722 100644
--- a/bin/varnishtest/tests/b00002.vtc
+++ b/bin/varnishtest/tests/b00002.vtc
@@ -15,6 +15,7 @@ varnish v1 -arg "-sTransient=default,1m" -vcl+backend {
 	}
 	sub vcl_deliver {
 		set resp.http.o_uncacheable = obj.uncacheable;
+		set resp.http.xport = req.transport;
 	}
 } -start
 
@@ -36,6 +37,7 @@ client c1 {
 	expect resp.http.connection == close
 	expect resp.http.x-ttl == 0.000
 	expect resp.http.o_uncacheable == true
+	expect resp.http.xport == HTTP/1
 } -run
 
 varnish v1 -expect n_object == 0
diff --git a/bin/varnishtest/tests/o00001.vtc b/bin/varnishtest/tests/o00001.vtc
index ebe38bcb9..03c898996 100644
--- a/bin/varnishtest/tests/o00001.vtc
+++ b/bin/varnishtest/tests/o00001.vtc
@@ -61,6 +61,7 @@ varnish v1 -proto "PROXY" -vcl+backend {
 		set resp.http.sp = std.port(server.ip);
 		set resp.http.fc = (client.ip ~ fwd_client);
 		set resp.http.fs = (server.ip ~ fwd_server);
+		set resp.http.xport = req.transport;
 	}
 } -start
 
@@ -87,6 +88,8 @@ client c1 {
 	expect resp.http.si == "${v1_addr}"
 	expect resp.http.sp == "${v1_port}"
 	expect resp.http.ci == "${localhost}"
+	# Transport is HTTP/1, even though proxy is used
+	expect resp.http.xport == HTTP/1
 } -run
 
 delay .1
diff --git a/bin/varnishtest/tests/t02000.vtc b/bin/varnishtest/tests/t02000.vtc
index 789b5d822..a139cc33a 100644
--- a/bin/varnishtest/tests/t02000.vtc
+++ b/bin/varnishtest/tests/t02000.vtc
@@ -82,6 +82,7 @@ varnish v1 -syntax 4.1 -vcl+backend {
 
 	sub vcl_deliver {
 		set resp.http.C-Sess-XID = sess.xid;
+		set resp.http.xport = req.transport;
 	}
 }
 
@@ -93,6 +94,7 @@ client c1 {
 		expect resp.http.C-Sess-XID ~ "^[0-9]+$"
 		expect resp.http.B-Sess-XID ~ "^[0-9]+$"
 		expect resp.http.C-Sess-XID == resp.http.B-Sess-XID
+		expect resp.http.xport == HTTP/2
 	} -run
 	stream 9 {
 		txreq -url "/still_not_cached"
diff --git a/doc/sphinx/reference/vcl_var.rst b/doc/sphinx/reference/vcl_var.rst
index 049c1f3cf..153d52d33 100644
--- a/doc/sphinx/reference/vcl_var.rst
+++ b/doc/sphinx/reference/vcl_var.rst
@@ -399,6 +399,15 @@ req.time
 	across restarts.
 
 
+req.transport
+
+	Type: STRING
+
+	Readable from: client
+
+	The transport protocol which brought this request.
+
+
 req.ttl
 
 	Type: DURATION
diff --git a/include/vrt.h b/include/vrt.h
index f57398280..1a47ac8ba 100644
--- a/include/vrt.h
+++ b/include/vrt.h
@@ -54,6 +54,7 @@
  * binary/load-time compatible, increment MAJOR version
  *
  * Next (2021-03-15)
+ *	VRT_r_req_transport() added
  *	VRT_Assign_Backend() added
  *	VRT_StaticDirector() added
  *	enum lbody_e changed


More information about the varnish-commit mailing list