diff --git a/server/server.go b/server/server.go index 79c1d5a74c945ccde07539ca6d364ce6a94c7013..b8728131f91fcd24e037a33d2f30b9baa65d01cd 100644 --- a/server/server.go +++ b/server/server.go @@ -118,6 +118,12 @@ }) return server } +var remoteAddrCtxKey = &contextKey{"remoteAddr"} + +type contextKey struct { + name string +} + // Adds the default middleware to this server, including: // // - Configuration middleware @@ -177,7 +183,22 @@ server.router.Use(middleware.RealIP) server.router.Use(middleware.Logger) server.router.Use(middleware.Timeout(timeout)) server.router.Use(auth.Middleware(server.conf, apiconf)) + server.router.Use(func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ctx := context.WithValue(r.Context(), remoteAddrCtxKey, r.RemoteAddr) + r = r.WithContext(ctx) + next.ServeHTTP(w, r) + }) + }) return server +} + +func RemoteAddr(ctx context.Context) string { + raw, ok := ctx.Value(remoteAddrCtxKey).(string) + if !ok { + panic(fmt.Errorf("Invalid authentication context")) + } + return raw } // Add user-defined middleware to the server