35 lines
738 B
Go

package requestid
import (
"context"
"crypto/rand"
"encoding/hex"
"net/http"
)
type contextKey struct{}
func Middleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
requestID := r.Header.Get("X-Request-Id")
if requestID == "" {
requestID = newID()
}
w.Header().Set("X-Request-Id", requestID)
next.ServeHTTP(w, r.WithContext(context.WithValue(r.Context(), contextKey{}, requestID)))
})
}
func FromContext(ctx context.Context) string {
requestID, _ := ctx.Value(contextKey{}).(string)
return requestID
}
func newID() string {
var buf [16]byte
if _, err := rand.Read(buf[:]); err != nil {
return "req-fallback"
}
return hex.EncodeToString(buf[:])
}