• David Glasser's avatar
    net/http: don't hang if RemoteAddr() blocks · b58515ba
    David Glasser authored
    The PROXY protocol is supported by several proxy servers such as haproxy
    and Amazon ELB.  This protocol allows services running behind a proxy to
    learn the remote address of the actual client connecting to the proxy,
    by including a single textual line at the beginning of the TCP
    connection.
    http://www.haproxy.org/download/1.5/doc/proxy-protocol.txt
    
    There are several Go libraries for this protocol (such as
    https://github.com/armon/go-proxyproto), which operate by wrapping a
    net.Conn with an implementation whose RemoteAddr method reads the
    protocol line before returning. This means that RemoteAddr is a blocking
    call.
    
    Before this change, http.Serve called RemoteAddr from the main Accepting
    goroutine, not from the per-connection goroutine. This meant that it
    would not Accept another connection until RemoteAddr returned, which is
    not appropriate if RemoteAddr needs to do a blocking read from the
    socket first.
    
    Fixes #12943.
    
    Change-Id: I1a242169e6e4aafd118b794e7c8ac45d0d573421
    Reviewed-on: https://go-review.googlesource.com/15835Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
    Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    b58515ba
serve_test.go 98.5 KB