]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: h2: pass accept-invalid-http-request down the request parser
authorWilly Tarreau <w@1wt.eu>
Tue, 8 Aug 2023 13:38:28 +0000 (15:38 +0200)
committerWilly Tarreau <w@1wt.eu>
Tue, 8 Aug 2023 17:10:54 +0000 (19:10 +0200)
We're adding a new argument "relaxed" to h2_make_htx_request() so that
we can control its level of acceptance of certain invalid requests at
the proxy level with "option accept-invalid-http-request". The goal
will be to add deactivable checks that are still desirable to have by
default. For now no test is subject to it.

include/haproxy/h2.h
src/h2.c
src/mux_h2.c

index 84e4c76fc26052dfa7771551fbdcab0988a837f7..4082b38a80f9904d518bbd9bd9f852712a3d3d9b 100644 (file)
@@ -207,7 +207,7 @@ extern struct h2_frame_definition h2_frame_definition[H2_FT_ENTRIES];
 /* various protocol processing functions */
 
 int h2_parse_cont_len_header(unsigned int *msgf, struct ist *value, unsigned long long *body_len);
-int h2_make_htx_request(struct http_hdr *list, struct htx *htx, unsigned int *msgf, unsigned long long *body_len);
+int h2_make_htx_request(struct http_hdr *list, struct htx *htx, unsigned int *msgf, unsigned long long *body_len, int relaxed);
 int h2_make_htx_response(struct http_hdr *list, struct htx *htx, unsigned int *msgf, unsigned long long *body_len, char *upgrade_protocol);
 int h2_make_htx_trailers(struct http_hdr *list, struct htx *htx);
 
index 76c936783461e7c3828fc08f96489bbe483b6d88..cf42b7a5610e7890e60c0741a7cfdf89f640c0ee 100644 (file)
--- a/src/h2.c
+++ b/src/h2.c
@@ -296,8 +296,12 @@ static struct htx_sl *h2_prepare_htx_reqline(uint32_t fields, struct ist *phdr,
  *
  * The Cookie header will be reassembled at the end, and for this, the <list>
  * will be used to create a linked list, so its contents may be destroyed.
+ *
+ * When <relaxed> is non-nul, some non-dangerous checks will be ignored. This
+ * is in order to satisfy "option accept-invalid-http-request" for
+ * interoperability purposes.
  */
-int h2_make_htx_request(struct http_hdr *list, struct htx *htx, unsigned int *msgf, unsigned long long *body_len)
+int h2_make_htx_request(struct http_hdr *list, struct htx *htx, unsigned int *msgf, unsigned long long *body_len, int relaxed)
 {
        struct ist phdr_val[H2_PHDR_NUM_ENTRIES];
        uint32_t fields; /* bit mask of H2_PHDR_FND_* */
index 63b9a805c14a80d654313af6a3320e151a3caa0f..39fdf3cea7b5ccc21478faa108d54777ae0e13f0 100644 (file)
@@ -4936,7 +4936,8 @@ next_frame:
        if (h2c->flags & H2_CF_IS_BACK)
                outlen = h2_make_htx_response(list, htx, &msgf, body_len, upgrade_protocol);
        else
-               outlen = h2_make_htx_request(list, htx, &msgf, body_len);
+               outlen = h2_make_htx_request(list, htx, &msgf, body_len,
+                                            !!(((const struct session *)h2c->conn->owner)->fe->options2 & PR_O2_REQBUG_OK));
 
        if (outlen < 0 || htx_free_space(htx) < global.tune.maxrewrite) {
                /* too large headers? this is a stream error only */