MEDIUM: mux_h2: generate Extended CONNECT response

Support for the rfc 8441 Bootstraping WebSockets with HTTP/2

Convert a 101 htx response message to a 200 HTTP/2 response.
diff --git a/src/mux_h2.c b/src/mux_h2.c
index 25cf98e..1fc6ca0 100644
--- a/src/mux_h2.c
+++ b/src/mux_h2.c
@@ -194,6 +194,7 @@
 #define H2_SF_KILL_CONN         0x00020000  // kill the whole connection with this stream
 
 #define H2_SF_EXT_CONNECT_SENT  0x00040000  // rfc 8441 an Extended CONNECT has been sent
+#define H2_SF_EXT_CONNECT_RCVD  0x00080000  // rfc 8441 an Extended CONNECT has been received and parsed
 
 #define H2_SF_TUNNEL_ABRT       0x00100000  // A tunnel attempt was aborted
 
@@ -4733,6 +4734,9 @@
 		htx->flags |= HTX_FL_EOM;
 	}
 
+	if (msgf & H2_MSGF_EXT_CONNECT)
+		*flags |= H2_SF_EXT_CONNECT_RCVD;
+
 	/* success */
 	ret = 1;
 
@@ -4958,9 +4962,16 @@
 				goto fail;
 			}
 			else if (h2s->status == 101) {
-				/* 101 responses are not supported in H2, so return a error (RFC7540#8.1.1) */
-				TRACE_ERROR("will not encode an invalid status code", H2_EV_TX_FRAME|H2_EV_TX_HDR|H2_EV_H2S_ERR, h2c->conn, h2s);
-				goto fail;
+				if (unlikely(h2s->flags & H2_SF_EXT_CONNECT_RCVD)) {
+					/* If an Extended CONNECT has been received, we need to convert 101 to 200 */
+					h2s->status = 200;
+					h2s->flags &= ~H2_SF_EXT_CONNECT_RCVD;
+				}
+				else {
+					/* Otherwise, 101 responses are not supported in H2, so return a error (RFC7540#8.1.1) */
+					TRACE_ERROR("will not encode an invalid status code", H2_EV_TX_FRAME|H2_EV_TX_HDR|H2_EV_H2S_ERR, h2c->conn, h2s);
+					goto fail;
+				}
 			}
 			else if ((h2s->flags & H2_SF_BODY_TUNNEL) && h2s->status >= 300) {
 				/* Abort the tunnel attempt */