package ripsawlogger import ( "net/http" "github.com/satori/go.uuid" ) func EnsureTransactionHeaders(handler http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // ensure an X-Transaction-ID header if _, ok := r.Header[http.CanonicalHeaderKey("X-Transaction-ID")]; !ok { r.Header.Set(http.CanonicalHeaderKey("X-Transaction-ID"), uuid.NewV4().String()) } // ensure an X-Request-ID header if _, ok := r.Header[http.CanonicalHeaderKey("X-Request-ID")]; !ok { r.Header.Set(http.CanonicalHeaderKey("X-Request-ID"), uuid.NewV4().String()) } // set outgoing headers w.Header().Set("X-Transaction-ID", r.Header.Get("X-Transaction-ID")) w.Header().Set("X-Request-ID", r.Header.Get("X-Request-ID")) handler.ServeHTTP(w, r) }) } func GetTransactionToken(key string, r *http.Request) interface{} { if key == "transactionId" { if transactionId := r.Header.Get("X-Transaction-ID"); len(transactionId) > 0 { return transactionId } } else if key == "requestId" { if requestId := r.Header.Get("X-Request-ID"); len(requestId) > 0 { return requestId } } else if key == "parentRequestId" { if parentRequestId := r.Header.Get("X-Parent-Request-ID"); len(parentRequestId) > 0 { return parentRequestId } } return nil }