From 576c358508ace18fea4ed9a08827045600697f49 Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Fri, 8 Jan 2021 15:53:01 +0100 Subject: [PATCH] MINOR: htx/http-ana: Save info about Upgrade option in the Connection header Add an HTX start-line flag and its counterpart into the HTTP message to track the presence of the Upgrade option into the Connection header. This way, without parsing the Connection header again, it will be easy to know if a client asks for a protocol upgrade and if the server agrees to do so. It will also be easy to perform some conformance checks when a 101-switching-protocols is received. --- include/haproxy/http_ana-t.h | 1 + include/haproxy/htx-t.h | 2 +- src/h1_htx.c | 2 ++ src/http_ana.c | 4 ++++ 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/include/haproxy/http_ana-t.h b/include/haproxy/http_ana-t.h index 50fbd3de8..89d41dd7b 100644 --- a/include/haproxy/http_ana-t.h +++ b/include/haproxy/http_ana-t.h @@ -89,6 +89,7 @@ #define HTTP_MSGF_COMPRESSING 0x00000020 /* data compression is in progress */ #define HTTP_MSGF_BODYLESS 0x00000040 /* The message has no body (content-length = 0) */ +#define HTTP_MSGF_CONN_UPG 0x00000080 /* The message contains "Connection: Upgrade" header */ /* Maximum length of the cache secondary key (sum of all the possible parts of * the secondary key). The actual keys might be smaller for some diff --git a/include/haproxy/htx-t.h b/include/haproxy/htx-t.h index fb015752f..f14bb25e5 100644 --- a/include/haproxy/htx-t.h +++ b/include/haproxy/htx-t.h @@ -137,7 +137,7 @@ #define HTX_SL_F_SCHM_HTTPS 0x00000200 /* The scheme HTTPS should be used */ #define HTX_SL_F_HAS_AUTHORITY 0x00000400 /* The request authority is explicitly specified */ #define HTX_SL_F_NORMALIZED_URI 0x00000800 /* The received URI is normalized (an implicit absolute-uri form) */ - +#define HTX_SL_F_CONN_UPG 0x00001000 /* The message contains "connection: upgrade" header */ /* HTX flags */ #define HTX_FL_NONE 0x00000000 diff --git a/src/h1_htx.c b/src/h1_htx.c index 30e2b229e..dc6accabb 100644 --- a/src/h1_htx.c +++ b/src/h1_htx.c @@ -148,6 +148,8 @@ static unsigned int h1m_htx_sl_flags(struct h1m *h1m) } if (h1m->state == H1_MSG_TUNNEL) flags |= HTX_SL_F_BODYLESS; + if (h1m->flags & H1_MF_CONN_UPG) + flags |= HTX_SL_F_CONN_UPG; return flags; } diff --git a/src/http_ana.c b/src/http_ana.c index 7816ad563..96753c0ef 100644 --- a/src/http_ana.c +++ b/src/http_ana.c @@ -166,6 +166,8 @@ int http_wait_for_request(struct stream *s, struct channel *req, int an_bit) msg->flags |= HTTP_MSGF_TE_CHNK; if (sl->flags & HTX_SL_F_BODYLESS) msg->flags |= HTTP_MSGF_BODYLESS; + if (sl->flags & HTX_SL_F_CONN_UPG) + msg->flags |= HTTP_MSGF_CONN_UPG; /* we can make use of server redirect on GET and HEAD */ if (txn->meth == HTTP_METH_GET || txn->meth == HTTP_METH_HEAD) @@ -1558,6 +1560,8 @@ int http_wait_for_response(struct stream *s, struct channel *rep, int an_bit) } if (sl->flags & HTX_SL_F_BODYLESS) msg->flags |= HTTP_MSGF_BODYLESS; + if (sl->flags & HTX_SL_F_CONN_UPG) + msg->flags |= HTTP_MSGF_CONN_UPG; n = txn->status / 100; if (n < 1 || n > 5)