From: Willy Tarreau Date: Sun, 3 Dec 2017 09:42:59 +0000 (+0100) Subject: BUG/MINOR: h2: try to abort closed streams as soon as possible X-Git-Tag: v1.9-dev1~622 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9470d2cd35938db8e053f390c5de0e94eefe254b;p=thirdparty%2Fhaproxy.git BUG/MINOR: h2: try to abort closed streams as soon as possible The purpose here is to be able to signal receipt of RST_STREAM to streams when they start to provide a response so that the response can be aborted ASAP. Given that RST_STREAM immediately switches the stream to the CLOSED state, we must check for CLOSED in addition to the existing ERROR check. To be backported to 1.8. --- diff --git a/src/mux_h2.c b/src/mux_h2.c index 733687e7bf..0c2fcdeb2f 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -3066,7 +3066,7 @@ static int h2_snd_buf(struct conn_stream *cs, struct buffer *buf, int flags) if (h2s->res.state < HTTP_MSG_BODY) { total += h2s_frt_make_resp_headers(h2s, buf); - if (h2s->st == H2_SS_ERROR) + if (h2s->st >= H2_SS_ERROR) break; if (h2s->flags & H2_SF_BLK_ANY) @@ -3075,7 +3075,7 @@ static int h2_snd_buf(struct conn_stream *cs, struct buffer *buf, int flags) else if (h2s->res.state < HTTP_MSG_TRAILERS) { total += h2s_frt_make_resp_data(h2s, buf); - if (h2s->st == H2_SS_ERROR) + if (h2s->st >= H2_SS_ERROR) break; if (h2s->flags & H2_SF_BLK_ANY) @@ -3102,7 +3102,7 @@ static int h2_snd_buf(struct conn_stream *cs, struct buffer *buf, int flags) } /* RST are sent similarly to frame acks */ - if (h2s->st == H2_SS_ERROR) { + if (h2s->st >= H2_SS_ERROR) { cs->flags |= CS_FL_ERROR; if (h2s_send_rst_stream(h2s->h2c, h2s) > 0) h2s->st = H2_SS_CLOSED;