Merge branch '18870-installer' refs #18870
[arvados.git] / sdk / go / httpserver / logger.go
index 437429611cb1ee1d0a5db75be353865863985bb6..b71adf71181a9eb6b550093f73dbe4ab884038ce 100644 (file)
@@ -9,6 +9,7 @@ import (
        "context"
        "net"
        "net/http"
+       "sync"
        "time"
 
        "git.arvados.org/arvados.git/sdk/go/ctxlog"
@@ -23,6 +24,7 @@ type contextKey struct {
 var (
        requestTimeContextKey       = contextKey{"requestTime"}
        responseLogFieldsContextKey = contextKey{"responseLogFields"}
+       mutexContextKey             = contextKey{"mutex"}
 )
 
 type hijacker interface {
@@ -45,7 +47,13 @@ func (hn hijackNotifier) Hijack() (net.Conn, *bufio.ReadWriter, error) {
 // HandlerWithDeadline cancels the request context if the request
 // takes longer than the specified timeout without having its
 // connection hijacked.
+//
+// If timeout is 0, there is no deadline: HandlerWithDeadline is a
+// no-op.
 func HandlerWithDeadline(timeout time.Duration, next http.Handler) http.Handler {
+       if timeout == 0 {
+               return next
+       }
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
                ctx, cancel := context.WithCancel(r.Context())
                defer cancel()
@@ -66,11 +74,15 @@ func HandlerWithDeadline(timeout time.Duration, next http.Handler) http.Handler
 }
 
 func SetResponseLogFields(ctx context.Context, fields logrus.Fields) {
-       ctxfields := ctx.Value(&responseLogFieldsContextKey)
-       if c, ok := ctxfields.(logrus.Fields); ok {
-               for k, v := range fields {
-                       c[k] = v
-               }
+       m, _ := ctx.Value(&mutexContextKey).(*sync.Mutex)
+       c, _ := ctx.Value(&responseLogFieldsContextKey).(logrus.Fields)
+       if m == nil || c == nil {
+               return
+       }
+       m.Lock()
+       defer m.Unlock()
+       for k, v := range fields {
+               c[k] = v
        }
 }
 
@@ -92,6 +104,7 @@ func LogRequests(h http.Handler) http.Handler {
                ctx := req.Context()
                ctx = context.WithValue(ctx, &requestTimeContextKey, time.Now())
                ctx = context.WithValue(ctx, &responseLogFieldsContextKey, logrus.Fields{})
+               ctx = context.WithValue(ctx, &mutexContextKey, &sync.Mutex{})
                ctx = ctxlog.Context(ctx, lgr)
                req = req.WithContext(ctx)