mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-02-28 08:30:46 +00:00
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.
This commit is contained in:
parent
aad333a9fc
commit
efe2276a9e
17
src/mux_h2.c
17
src/mux_h2.c
@ -194,6 +194,7 @@ enum h2_ss {
|
||||
#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 @@ next_frame:
|
||||
htx->flags |= HTX_FL_EOM;
|
||||
}
|
||||
|
||||
if (msgf & H2_MSGF_EXT_CONNECT)
|
||||
*flags |= H2_SF_EXT_CONNECT_RCVD;
|
||||
|
||||
/* success */
|
||||
ret = 1;
|
||||
|
||||
@ -4958,9 +4962,16 @@ static size_t h2s_frt_make_resp_headers(struct h2s *h2s, struct htx *htx)
|
||||
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 */
|
||||
|
Loading…
Reference in New Issue
Block a user