]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: provide access to the listener address an HTTP request arrived on
authorBrad Fitzpatrick <bradfitz@golang.org>
Sun, 1 May 2016 04:11:26 +0000 (21:11 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Sun, 1 May 2016 06:06:07 +0000 (06:06 +0000)
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 <adg@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

index 5f206b187380ee550b9548d5f86fb2f9bd804cb5..661f355d0dd7090736b31ec188458f93c73b86d5 100644 (file)
@@ -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()
index c36f5a06ba15b512594f802b05baa3bc68ff141a..23fb84fcdabf410ef3b1af208108acb052654e9b 100644 (file)
@@ -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 {