]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: http: don't enable auto-close on the response side
authorWilly Tarreau <w@1wt.eu>
Wed, 25 Nov 2015 19:11:11 +0000 (20:11 +0100)
committerWilly Tarreau <w@1wt.eu>
Thu, 26 Nov 2015 09:25:11 +0000 (10:25 +0100)
There is a bug where "option http-keep-alive" doesn't force a response
to stay in keep-alive if the server sends the FIN along with the response
on the second or subsequent response. The reason is that the auto-close
was forced enabled when recycling the HTTP transaction and it's never
disabled along the response processing chain before the SHUTR gets a
chance to be forwarded to the client side. The MSG_DONE state of the
HTTP response properly disables it but too late.

There's no more reason for enabling auto-close here, because either it
doesn't matter in non-keep-alive modes because the connection is closed,
or it is automatically enabled by process_stream() when it sees there's
no analyser on the stream.

This bug also affects 1.5 so a backport is desired.

src/proto_http.c

index 77a52078d0d0d458ed7f0233dfda87eca247d2c2..67e482fea7f3745a73230f42d30c74c46757b4d7 100644 (file)
@@ -5272,11 +5272,13 @@ void http_end_txn_clean_session(struct stream *s)
                        s->res.flags |= CF_EXPECT_MORE;
        }
 
-       /* we're removing the analysers, we MUST re-enable events detection */
+       /* we're removing the analysers, we MUST re-enable events detection.
+        * We don't enable close on the response channel since it's either
+        * already closed, or in keep-alive with an idle connection handler.
+        */
        channel_auto_read(&s->req);
        channel_auto_close(&s->req);
        channel_auto_read(&s->res);
-       channel_auto_close(&s->res);
 
        /* we're in keep-alive with an idle connection, monitor it if not already done */
        if (srv_conn && LIST_ISEMPTY(&srv_conn->list)) {