~bigbes/core-go

5de4cd8edf4f5de56c8c6910d7e00012dfe3818e — Drew DeVault 5 years ago 177d60f
Stash remote address in context
1 files changed, 21 insertions(+), 0 deletions(-)

M server/server.go
M server/server.go => server/server.go +21 -0
@@ 118,6 118,12 @@ func (server *Server) WithSchema(
	return server
}

var remoteAddrCtxKey = &contextKey{"remoteAddr"}

type contextKey struct {
	name string
}

// Adds the default middleware to this server, including:
//
// - Configuration middleware


@@ 177,9 183,24 @@ func (server *Server) WithDefaultMiddleware() *Server {
	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
func (server *Server) WithMiddleware(
	middlewares ...func(http.Handler) http.Handler) *Server {