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.
This commit is contained in:
Willy Tarreau 2017-12-03 10:42:59 +01:00
parent 11cc2d6031
commit 9470d2cd35

View File

@ -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;