mirror of
https://github.com/golang/go
synced 2024-11-12 03:40:21 -07:00
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 <adg@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
abc1472d78
commit
a9cf0b1e1e
@ -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()
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user