123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- package http
- import (
- "context"
- "net"
- "net/http"
- )
- type ctxKey int
- const (
- ctxKeyAuth ctxKey = iota
- ctxKeyPublicURL
- ctxKeyUnixSock
- ctxKeyUser
- )
- // NewBaseContext initializes the context for all requests, adding info for use in middleware and handlers
- func NewBaseContext(ctx context.Context, url string) func(l net.Listener) context.Context {
- return func(l net.Listener) context.Context {
- if l.Addr().Network() == "unix" {
- return context.WithValue(ctx, ctxKeyUnixSock, true)
- }
- return context.WithValue(ctx, ctxKeyPublicURL, url)
- }
- }
- // IsAuthenticated checks if this request was authenticated via a middleware
- func IsAuthenticated(r *http.Request) bool {
- if v := r.Context().Value(ctxKeyAuth); v != nil {
- return true
- }
- if v := r.Context().Value(ctxKeyUser); v != nil {
- return true
- }
- return false
- }
- // IsUnixSocket checks if the request was received on a unix socket, used to skip auth & CORS
- func IsUnixSocket(r *http.Request) bool {
- v, _ := r.Context().Value(ctxKeyUnixSock).(bool)
- return v
- }
- // PublicURL returns the URL defined in NewBaseContext, used for logging & CORS
- func PublicURL(r *http.Request) string {
- v, _ := r.Context().Value(ctxKeyPublicURL).(string)
- return v
- }
- // CtxGetAuth is a wrapper over the private Auth context key
- func CtxGetAuth(ctx context.Context) interface{} {
- return ctx.Value(ctxKeyAuth)
- }
- // CtxGetUser is a wrapper over the private User context key
- func CtxGetUser(ctx context.Context) (string, bool) {
- v, ok := ctx.Value(ctxKeyUser).(string)
- return v, ok
- }
- // CtxSetUser is a test helper that injects a User value into context
- func CtxSetUser(ctx context.Context, value string) context.Context {
- return context.WithValue(ctx, ctxKeyUser, value)
- }
|