]> Cypherpunks repositories - gostls13.git/commit
net/http: don't hang if RemoteAddr() blocks
authorDavid Glasser <glasser@meteor.com>
Wed, 14 Oct 2015 21:25:00 +0000 (14:25 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Wed, 14 Oct 2015 22:26:38 +0000 (22:26 +0000)
commitb58515baba3fedac7ef7ce1c3a8da600460b6c70
tree669e9a3e0ee02b71f510e0044808e59bd0ecff92
parent2687db109d2b9f057f9e75503d4a9325e26e84a0
net/http: don't hang if RemoteAddr() blocks

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/15835
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
src/net/http/serve_test.go
src/net/http/server.go