From: Christopher Faulet Date: Thu, 20 Apr 2017 12:16:13 +0000 (+0200) Subject: BUG/MEDIUM: http: Drop the connection establishment when a redirect is performed X-Git-Tag: v1.8-dev2~69 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9f724edbd8d1cf595d4177c3612607f395b4380e;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: http: Drop the connection establishment when a redirect is performed This bug occurs when a redirect rule is applied during the request analysis on a persistent connection, on a proxy without any server. This means, in a frontend section or in a listen/backend section with no "server" line. Because the transaction processing is shortened, no server can be selected to perform the connection. So if we try to establish it, this fails and a 503 error is returned, while a 3XX was already sent. So, in this case, HAProxy generates 2 replies and only the first one is expected. Here is the configuration snippet to easily reproduce the problem: listen www bind :8080 mode http timeout connect 5s timeout client 3s timeout server 6s redirect location / A simple HTTP/1.1 request without body will trigger the bug: $ telnet 0 8080 Trying 0.0.0.0... Connected to 0. Escape character is '^]'. GET / HTTP/1.1 HTTP/1.1 302 Found Cache-Control: no-cache Content-length: 0 Location: / HTTP/1.0 503 Service Unavailable Cache-Control: no-cache Connection: close Content-Type: text/html

503 Service Unavailable

No server is available to handle this request. Connection closed by foreign host. [wt: only 1.8-dev is impacted though the bug is present in older ones] --- diff --git a/src/proto_http.c b/src/proto_http.c index 24d034ae03..6c940f1e3b 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -4261,6 +4261,8 @@ static int http_apply_redirect_rule(struct redirect_rule *rule, struct stream *s /* Trim any possible response */ res->chn->buf->i = 0; res->next = res->sov = 0; + /* If not already done, don't perform any connection establishment */ + channel_dont_connect(req->chn); } else { /* keep-alive not possible */ if (unlikely(txn->flags & TX_USE_PX_CONN)) {