[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