From: Brad Fitzpatrick Date: Sun, 1 May 2016 04:11:26 +0000 (-0700) Subject: net/http: provide access to the listener address an HTTP request arrived on X-Git-Tag: go1.7beta1~376 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=a9cf0b1e1e2a66db547fcabb7188465e4ac54700;p=gostls13.git net/http: provide access to the listener address an HTTP request arrived on This adds a context key named LocalAddrContextKey (for now, see #15229) to let users access the net.Addr of the net.Listener that accepted the connection that sent an HTTP request. This is similar to ServerContextKey which provides access to the *Server. (A Server may have multiple Listeners) Fixes #6732 Change-Id: I74296307b68aaaab8df7ad4a143e11b5227b5e62 Reviewed-on: https://go-review.googlesource.com/22672 Reviewed-by: Andrew Gerrand Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- diff --git a/src/net/http/serve_test.go b/src/net/http/serve_test.go index 5f206b1873..661f355d0d 100644 --- a/src/net/http/serve_test.go +++ b/src/net/http/serve_test.go @@ -4062,7 +4062,12 @@ func TestServerContext_ServerContextKey(t *testing.T) { ctx := r.Context() got := ctx.Value(ServerContextKey) if _, ok := got.(*Server); !ok { - t.Errorf("context value = %T; want *http.Server") + t.Errorf("context value = %T; want *http.Server", got) + } + + got = ctx.Value(LocalAddrContextKey) + if _, ok := got.(net.Addr); !ok { + t.Errorf("local addr value = %T; want net.Addr", got) } })) defer ts.Close() diff --git a/src/net/http/server.go b/src/net/http/server.go index c36f5a06ba..23fb84fcda 100644 --- a/src/net/http/server.go +++ b/src/net/http/server.go @@ -176,6 +176,12 @@ var ( // started the handler. The associated value will be of // type *Server. ServerContextKey = &contextKey{"http-server"} + + // LocalAddrContextKey is a context key. It can be used in + // HTTP handlers with context.WithValue to access the address + // the local address the connection arrived on. + // The associated value will be of type net.Addr. + LocalAddrContextKey = &contextKey{"local-addr"} ) // A conn represents the server side of an HTTP connection. @@ -2189,6 +2195,7 @@ func (srv *Server) Serve(l net.Listener) error { // use cases yet. baseCtx := context.Background() ctx := context.WithValue(baseCtx, ServerContextKey, srv) + ctx = context.WithValue(ctx, LocalAddrContextKey, l.Addr()) for { rw, e := l.Accept() if e != nil {