BUG/MEDIUM: mux-h2: always omit :scheme and :path for the CONNECT method
This is mandated by RFC7540 #8.3, these pseudo-headers must not be emitted
with the CONNECT method.
This must be backported to 1.9.
diff --git a/src/mux_h2.c b/src/mux_h2.c
index 5fdaadf..1c6f3d2 100644
--- a/src/mux_h2.c
+++ b/src/mux_h2.c
@@ -4425,20 +4425,27 @@
goto full;
}
- /* encode the scheme which is always "https" (or 0x86 for "http") */
- if (!hpack_encode_scheme(&outbuf, ist("https"))) {
- /* output full */
- if (b_space_wraps(&h2c->mbuf))
- goto realign_again;
- goto full;
- }
+ /* RFC7540 #8.3: the CONNECT method must have :
+ * - :authority set to the URI part (host:port)
+ * - :method set to CONNECT
+ * - :scheme and :path omitted
+ */
+ if (sl->info.req.meth != HTTP_METH_CONNECT) {
+ /* encode the scheme which is always "https" (or 0x86 for "http") */
+ if (!hpack_encode_scheme(&outbuf, ist("https"))) {
+ /* output full */
+ if (b_space_wraps(&h2c->mbuf))
+ goto realign_again;
+ goto full;
+ }
- /* encode the path, which necessarily is the second one */
- if (!hpack_encode_path(&outbuf, path)) {
- /* output full */
- if (b_space_wraps(&h2c->mbuf))
- goto realign_again;
- goto full;
+ /* encode the path, which necessarily is the second one */
+ if (!hpack_encode_path(&outbuf, path)) {
+ /* output full */
+ if (b_space_wraps(&h2c->mbuf))
+ goto realign_again;
+ goto full;
+ }
}
/* encode all headers, stop at empty name */