Commit a9cf0b1e authored by Brad Fitzpatrick's avatar Brad Fitzpatrick

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/22672Reviewed-by: default avatarAndrew Gerrand <adg@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent abc1472d
...@@ -4062,7 +4062,12 @@ func TestServerContext_ServerContextKey(t *testing.T) { ...@@ -4062,7 +4062,12 @@ func TestServerContext_ServerContextKey(t *testing.T) {
ctx := r.Context() ctx := r.Context()
got := ctx.Value(ServerContextKey) got := ctx.Value(ServerContextKey)
if _, ok := got.(*Server); !ok { 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() defer ts.Close()
......
...@@ -176,6 +176,12 @@ var ( ...@@ -176,6 +176,12 @@ var (
// started the handler. The associated value will be of // started the handler. The associated value will be of
// type *Server. // type *Server.
ServerContextKey = &contextKey{"http-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. // A conn represents the server side of an HTTP connection.
...@@ -2189,6 +2195,7 @@ func (srv *Server) Serve(l net.Listener) error { ...@@ -2189,6 +2195,7 @@ func (srv *Server) Serve(l net.Listener) error {
// use cases yet. // use cases yet.
baseCtx := context.Background() baseCtx := context.Background()
ctx := context.WithValue(baseCtx, ServerContextKey, srv) ctx := context.WithValue(baseCtx, ServerContextKey, srv)
ctx = context.WithValue(ctx, LocalAddrContextKey, l.Addr())
for { for {
rw, e := l.Accept() rw, e := l.Accept()
if e != nil { if e != nil {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment