Files
pinniped/internal/auditid/auditid.go
2024-11-27 13:53:02 -06:00

39 lines
1.0 KiB
Go

// Copyright 2024 the Pinniped contributors. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package auditid
import (
"net/http"
"github.com/google/uuid"
"k8s.io/apimachinery/pkg/types"
apiserveraudit "k8s.io/apiserver/pkg/apis/audit"
"k8s.io/apiserver/pkg/audit"
)
// NewRequestWithAuditID is public for use in unit tests. Production code should use WithAuditID().
func NewRequestWithAuditID(r *http.Request, newAuditIDFunc func() string) (*http.Request, string) {
ctx := audit.WithAuditContext(r.Context())
r = r.WithContext(ctx)
auditID := newAuditIDFunc()
audit.WithAuditID(ctx, types.UID(auditID))
return r, auditID
}
func WithAuditID(handler http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Add a randomly generated request ID to the context for this request.
r, auditID := NewRequestWithAuditID(r, func() string {
return uuid.New().String()
})
// Send the Audit-ID response header.
w.Header().Set(apiserveraudit.HeaderAuditID, auditID)
handler.ServeHTTP(w, r)
})
}