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.
This commit is contained in:
Christopher Faulet 2021-01-08 15:53:01 +01:00
parent 0f9395d81e
commit 576c358508
4 changed files with 8 additions and 1 deletions

View File

@ -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

View File

@ -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

View File

@ -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;
}

View File

@ -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)