Hi Willy,

Thanks so much for your responses! We're using version 1.4.19. I'll work
on getting a network capture for you -- what tcpdump params would help the
most? I usually use "-vv -A -w <file>". Probably the most helpful thing
would be to dump port 81, which is the unencrypted traffic coming it
HAProxy from stunnel.

Thanks again,
rusty

On 3/27/12 2:21 PM, "Willy Tarreau" <[email protected]> wrote:

>Hi Rusty,
>
>On Mon, Mar 26, 2012 at 02:07:40PM -0500, Rusty Geldmacher wrote:
>> Hi all,
>> 
>> Was hoping someone could help shed some light on an issue we're
>>observing in
>> our setup. When we have "option http-server-close" set, then file
>>uploads via
>> multipart form data will not work. By "not work" I mean that the HTTP
>> content-length header will be reported as 0, which in turn causes the
>>final
>> destination to get seriously confused by the request and then give up. I
>> realize this sounds strange, as content-length is reported by the
>>client but
>> this is the behavior I'm witnessing. When I have http-server-close on,
>>the
>> content-length is 0, and when I remove the option the content-length is
>>as
>> expected ? with no changes on the client end.
>
>That's strange indeed. What version is this, so that we can check the
>changelog if any known bug might have had that side effect ?
>
>> Additionally, if we set "option httpclose" then everything will work.
>
>I'm not surprized, "option httpclose" only adjusts the Connection header
>and completely ignores framing. It's what we call the tunnel mode : both
>sides are free to exchange what they want past the headers.
>
>> However, I'm under the impression that using httpclose isn't ideal since
>> clients then wouldn't be able to send multiple HTTP requests across the
>>same
>> connection.
>
>You're right.
>
>> Since this is a mobile app, having that functionality would
>> enhance performance.
>
>For sure !
>
>> Setting http-server-close seems to be ideal because we
>> can correctly load balance multiple requests in the same session.
>
>Yes and it was designed exactly for this.
>
>> So,  I'm wondering:
>> 
>>  *   Does haproxy do anything to validate/calculate the content-length
>>header?
>
>Yes, it parses the Content-length header or alternatively considers the
>Transfer-Encoding if it's present and announced as "chunked".
>
>>  *   How would the presence of http-server-close affect the request's
>>content-length header?
>
>It only checks the header and should not mangle it. Well, there is only
>one
>case it changes it, it's when multiple similar content-length headers are
>sent, then it reduces them to only one.
>
>> At a high level, our request flow looks like this:
>> 
>> stunnel -> haproxy -> apache -> passenger
>> 
>> Where stunnel and haproxy are on the same machine, and apache/passenger
>>are
>> on three or four additional machines.
>> 
>> Here's the relevant snippet from haproxy.cfg:
>> 
>> defaults
>>     mode                    http
>>     log                     global
>>     option                  dontlognull
>>     option                  redispatch
>>     retries                 3
>>     timeout http-request    10s
>>     timeout queue           1m
>>     timeout connect         10s
>>     timeout client          1m
>>     timeout server          1m
>>     timeout http-keep-alive 500
>>     timeout check           10s
>>     maxconn                 3000
>> 
>> # Stunnel listens on 443 and forwards connections off to haproxy on 81
>> frontend https *:81
>>     option httplog
>>     # Enabling http-server-close will cause file uploads to fail!
>>     # option http-server-close
>>     option forwardfor except 127.0.0.0/8
>> 
>>     reqadd X-Forwarded-Proto:\ https
>> 
>>     # set some ACLS?
>>     # choose a backend?
>>     # Nothing else really special
>
>Nothing fancy here !
>
>> And here is a session log for each case, starting with the normal
>>operation
>> (no http-server-close set, or setting httpclose):
>> 
>> 00000020:https.accept(0006)=000a from [10.0.1.30:43419]
>> 00000020:https.clireq[000a:ffff]: POST /URL-GOES-HERE HTTP/1.1
>> 00000020:https.clihdr[000a:ffff]: Host: dev.sermo.com
>> 00000020:https.clihdr[000a:ffff]: Content-Type: multipart/form-data;
>>charset=utf-8; boundary=0xKhTmLbOuNdArY
>> 00000020:https.clihdr[000a:ffff]: User-Agent: iPhone Simulator; iPhone
>>OS 4.3.2; en_US
>> 00000020:https.clihdr[000a:ffff]: Accept-Encoding: gzip
>> 00000020:https.clihdr[000a:ffff]: Content-Length: 62528
>> 00000020:https.clihdr[000a:ffff]: Connection: keep-alive
>> 
>> And here is with nothing else changed except for the addition of the
>> http-server-close option:
>> 
>> 00000007:https.accept(0006)=000a from [10.0.1.30:43688]
>> 00000007:https.clireq[000a:ffff]: POST /URL-GOES-HERE HTTP/1.1
>> 00000007:https.clihdr[000a:ffff]: Host: dev.sermo.com
>> 00000007:https.clihdr[000a:ffff]: Content-Type: multipart/form-data;
>>charset=utf-8; boundary=0xKhTmLbOuNdArY
>> 00000007:https.clihdr[000a:ffff]: User-Agent: iPhone Simulator; iPhone
>>OS 4.3.2; en_US
>> 00000007:https.clihdr[000a:ffff]: Accept-Encoding: gzip
>> 00000007:https.clihdr[000a:ffff]: Content-Length: 0
>> 00000007:https.clihdr[000a:ffff]: Connection: keep-alive
>
>Wow this is amazing !
>I've never seen that and don't understand how that may happen. I'm relly
>interested in knowing your version to try to reproduce.
>
>> We can get the system to work if instead of setting http-server-close,
>>we set
>> httpclose but like I explained above this doesn't seem to be ideal.
>
>I agree this is not a good solution, we need to fix this.
>
>If you could get a network capture for each side too, that would help
>a lot.  Don't post it to the list if there are sensible information there.
>
>Regards,
>Willy
>


Reply via email to