From: Christopher Faulet Date: Fri, 8 Jan 2021 14:53:01 +0000 (+0100) Subject: MINOR: htx/http-ana: Save info about Upgrade option in the Connection header X-Git-Tag: v2.4-dev7~108 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=576c358508ace18fea4ed9a08827045600697f49;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/include/haproxy/http_ana-t.h b/include/haproxy/http_ana-t.h index 50fbd3de82..89d41dd7b3 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 fb015752f5..f14bb25e5e 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 30e2b229e8..dc6accabbd 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 7816ad5630..96753c0ef6 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)