Skip to content

Commit c32fafa

Browse files
Guilherme Cardosoaldas
Guilherme Cardoso
authored andcommitted
Add support for configurable target header for the request_id middleware
1 parent b437ee3 commit c32fafa

File tree

3 files changed

+43
-4
lines changed

3 files changed

+43
-4
lines changed

echo.go

+1
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ const (
214214
HeaderXHTTPMethodOverride = "X-HTTP-Method-Override"
215215
HeaderXRealIP = "X-Real-IP"
216216
HeaderXRequestID = "X-Request-ID"
217+
HeaderXCorrelationID = "X-Correlation-ID"
217218
HeaderXRequestedWith = "X-Requested-With"
218219
HeaderServer = "Server"
219220
HeaderOrigin = "Origin"

middleware/request_id.go

+11-4
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,18 @@ type (
1717

1818
// RequestIDHandler defines a function which is executed for a request id.
1919
RequestIDHandler func(echo.Context, string)
20+
21+
// TargetHeader defines what header to look for to populate the id
22+
TargetHeader string
2023
}
2124
)
2225

2326
var (
2427
// DefaultRequestIDConfig is the default RequestID middleware config.
2528
DefaultRequestIDConfig = RequestIDConfig{
26-
Skipper: DefaultSkipper,
27-
Generator: generator,
29+
Skipper: DefaultSkipper,
30+
Generator: generator,
31+
TargetHeader: echo.HeaderXRequestID,
2832
}
2933
)
3034

@@ -42,6 +46,9 @@ func RequestIDWithConfig(config RequestIDConfig) echo.MiddlewareFunc {
4246
if config.Generator == nil {
4347
config.Generator = generator
4448
}
49+
if config.TargetHeader == "" {
50+
config.TargetHeader = echo.HeaderXRequestID
51+
}
4552

4653
return func(next echo.HandlerFunc) echo.HandlerFunc {
4754
return func(c echo.Context) error {
@@ -51,11 +58,11 @@ func RequestIDWithConfig(config RequestIDConfig) echo.MiddlewareFunc {
5158

5259
req := c.Request()
5360
res := c.Response()
54-
rid := req.Header.Get(echo.HeaderXRequestID)
61+
rid := req.Header.Get(config.TargetHeader)
5562
if rid == "" {
5663
rid = config.Generator()
5764
}
58-
res.Header().Set(echo.HeaderXRequestID, rid)
65+
res.Header().Set(config.TargetHeader, rid)
5966
if config.RequestIDHandler != nil {
6067
config.RequestIDHandler(c, rid)
6168
}

middleware/request_id_test.go

+31
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,34 @@ func TestRequestID_IDNotAltered(t *testing.T) {
5555
_ = h(c)
5656
assert.Equal(t, rec.Header().Get(echo.HeaderXRequestID), "<sample-request-id>")
5757
}
58+
59+
func TestRequestIDConfigDifferentHeader(t *testing.T) {
60+
e := echo.New()
61+
req := httptest.NewRequest(http.MethodGet, "/", nil)
62+
rec := httptest.NewRecorder()
63+
c := e.NewContext(req, rec)
64+
handler := func(c echo.Context) error {
65+
return c.String(http.StatusOK, "test")
66+
}
67+
68+
rid := RequestIDWithConfig(RequestIDConfig{TargetHeader: echo.HeaderXCorrelationID})
69+
h := rid(handler)
70+
h(c)
71+
assert.Len(t, rec.Header().Get(echo.HeaderXCorrelationID), 32)
72+
73+
// Custom generator and handler
74+
customID := "customGenerator"
75+
calledHandler := false
76+
rid = RequestIDWithConfig(RequestIDConfig{
77+
Generator: func() string { return customID },
78+
TargetHeader: echo.HeaderXCorrelationID,
79+
RequestIDHandler: func(_ echo.Context, id string) {
80+
calledHandler = true
81+
assert.Equal(t, customID, id)
82+
},
83+
})
84+
h = rid(handler)
85+
h(c)
86+
assert.Equal(t, rec.Header().Get(echo.HeaderXCorrelationID), "customGenerator")
87+
assert.True(t, calledHandler)
88+
}

0 commit comments

Comments
 (0)