On Thu, Apr 08, 2010 at 11:58:25AM +0200, Willy Tarreau wrote:
> > 3) I have sample configuration running with option http-server-close and 
> > without option httpclose set.
> > 
> > I observe the following at haproxy side:
> > 
> > Request comes:
> > 
> > GET /<some-url> HTTP/1.1
> > Host: host.pp.ru
> > User-Agent: Mozilla/5.0 (X11; U; FreeBSD amd64; en-US; rv:1.9.2.2) 
> > Gecko/20100326 Firefox/3.6.2
> > Accept: */*
> > Accept-Language: en-us,ru;q=0.7,en;q=0.3
> > Accept-Encoding: gzip,deflate
> > Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
> > Keep-Alive: 115
> > Connection: keep-alive
> > 
> > So client requests keep-alive.  I suppose that haproxy should send request 
> > to 
> > backend with Connection: close (because http-server-close is set) but
> > send response to client with keep-alive enabled.
> 
> Exactly.
> 
> > But that does not happen:
> > 
> > HTTP/1.1 200 OK
> > Date: Thu, 08 Apr 2010 08:41:52 GMT
> > Expires: Thu, 08 Apr 2010 08:42:52 GMT
> > Content-Type: text/javascript; charset=utf-8
> > Connection: Close
> > 
> > jsonp1270715696732(["a", ["ab", "and", "a2", "ac", "are", "a a", "ad", "a 
> > b", "a1", "about"]])
> > 
> > 
> > Why haproxy responds to client with Connection: Close?
> 
> Because the server did not provide information required to make the keep-alive
> possible. In your case, there is no "content-length" nor any 
> "transfer-encoding"
> header, so the only way the client has to find the response end, is the 
> closure
> of the connection.
> 
> An exactly similar issue was identified on Tomcat and Jetty. They did not use
> transfer-encoding when the client announces it intends to close. The Tomcat
> team was cooperative and recently agreed to improve that. In the mean time,
> we have released haproxy 1.4.4 which includes a workaround for this : combine
> "option http-pretend-keepalive" with "option http-server-close" and your 
> server
> will believe you're doing keep-alive and may try to send a more appropriate
> response. At least this works with Jetty and Tomcat, though there is nothing
> mandatory in this area.
> 

Hello!

Here is a sample HTTP session with my (hand-made) server.

1) GET /<some-url> HTTP/1.1
Host: hots.pp.ru
User-Agent: Mozilla/5.0 (X11; U; FreeBSD amd64; en-US; rv:1.9.2.3) Gecko/2010041
4 Firefox/3.6.3
Accept: text/javascript, application/javascript, */*
Accept-Language: en-us,ru;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive

2) 
HTTP/1.1 200 OK
Date: Mon, 26 Apr 2010 11:34:19 GMT
Expires: Mon, 26 Apr 2010 11:35:19 GMT
Content-Type: text/javascript; charset=utf-8
Connection: Keep-Alive
Transfer-Encoding: chunked

<some data>

tcpdump analysis of several subsequent requests shows that HTTP keep-alive works
in my case.

When I put that server behind haproxy (version 1.4.4) I see the following:


1) GET <some URL> HTTP/1.1
Host: host.pp.ru
User-Agent: Mozilla/5.0 (X11; U; FreeBSD amd64; en-US; rv:1.9.2.3) Gecko/2010041
4 Firefox/3.6.3
Accept: text/javascript, application/javascript, */*
Accept-Language: en-us,ru;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive

2) 
HTTP/1.1 200 OK
Date: Mon, 26 Apr 2010 11:45:01 GMT
Expires: Mon, 26 Apr 2010 11:46:01 GMT
Content-Type: text/javascript; charset=utf-8
Connection: Close

<some data>

I have
mode http
option http-server-close
option http-pretend-keepalive

in my config (tried both with and without http-pretend-keepalive).

Can you please explain in more detail what server makes wrong and why haproxy
adds Connection: Close header
(and why Firefox successfully uses HTTP keep-alive with the same server without
haproxy).

Thanks in advance!

Reply via email to