func setRequestIDHeaderMiddleware(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) { requestIDHeader, _ := config.GetString("request-id-header") if requestIDHeader == "" { next(w, r) return } requestID := r.Header.Get(requestIDHeader) if requestID == "" { unparsedID, err := uuid.NewV4() if err != nil { log.Errorf("unable to generate request id: %s", err) next(w, r) return } requestID = unparsedID.String() } context.SetRequestID(r, requestIDHeader, requestID) next(w, r) }
func (s *S) TestLoggerMiddlewareWithRequestID(c *check.C) { config.Set("request-id-header", "Request-ID") defer config.Unset("request-id-header") recorder := httptest.NewRecorder() request, err := http.NewRequest("PUT", "/my/path", nil) c.Assert(err, check.IsNil) context.SetRequestID(request, "Request-ID", "my-rid") h, handlerLog := doHandler() handlerLog.sleep = 100 * time.Millisecond handlerLog.response = http.StatusOK var out bytes.Buffer middle := loggerMiddleware{ logger: log.New(&out, "", 0), } middle.ServeHTTP(negroni.NewResponseWriter(recorder), request, h) c.Assert(handlerLog.called, check.Equals, true) timePart := time.Now().Format(time.RFC3339Nano)[:19] c.Assert(out.String(), check.Matches, fmt.Sprintf(`%s\..+? PUT /my/path 200 in 1\d{2}\.\d+ms \[Request-ID: my-rid\]`+"\n", timePart)) }