@@ -5,16 +5,21 @@ import (
55 "log"
66 "net/http"
77 "net/http/httptest"
8+ "reflect"
89 "strings"
910 "testing"
1011)
1112
1213func TestDebugMiddleware (t * testing.T ) {
1314 t .Parallel ()
1415
15- setup := func () (Middleware , * bytes.Buffer ) {
16- var logBuf bytes.Buffer
17- return DebugMiddleware (log .New (& logBuf , "" , 0 )), & logBuf
16+ setup := func () (* RequestLogger , * bytes.Buffer ) {
17+ var (
18+ logBuf bytes.Buffer
19+ middleware = NewRequestLogger ()
20+ )
21+ middleware .logger = log .New (& logBuf , "" , 0 )
22+ return middleware , & logBuf
1823 }
1924
2025 t .Run ("DoesNotRedactMostHeaders" , func (t * testing.T ) {
@@ -28,7 +33,7 @@ func TestDebugMiddleware(t *testing.T) {
2833 req .Header .Set ("User-Agent" , stainlessUserAgent )
2934
3035 var nextMiddlewareRan bool
31- middleware (req , func (req * http.Request ) (* http.Response , error ) {
36+ middleware . Middleware () (req , func (req * http.Request ) (* http.Response , error ) {
3237 nextMiddlewareRan = true
3338
3439 // The request sent down through middleware shouldn't be mutated.
@@ -59,7 +64,7 @@ func TestDebugMiddleware(t *testing.T) {
5964 req .Header .Set ("Authorization" , secretToken )
6065
6166 var nextMiddlewareRan bool
62- middleware (req , func (req * http.Request ) (* http.Response , error ) {
67+ middleware . Middleware () (req , func (req * http.Request ) (* http.Response , error ) {
6368 nextMiddlewareRan = true
6469
6570 // The request sent down through middleware shouldn't be mutated.
@@ -88,7 +93,7 @@ func TestDebugMiddleware(t *testing.T) {
8893 req .Header .Set ("Authorization" , "Bearer " + secretToken )
8994
9095 var nextMiddlewareRan bool
91- middleware (req , func (req * http.Request ) (* http.Response , error ) {
96+ middleware . Middleware () (req , func (req * http.Request ) (* http.Response , error ) {
9297 nextMiddlewareRan = true
9398
9499 return & http.Response {}, nil
@@ -102,4 +107,99 @@ func TestDebugMiddleware(t *testing.T) {
102107 t .Error ("expected authorization header to be redacted" )
103108 }
104109 })
110+
111+ t .Run ("RedactsMultipleAuthorizationHeaders" , func (t * testing.T ) {
112+ t .Parallel ()
113+
114+ middleware , logBuf := setup ()
115+
116+ req := httptest .NewRequest ("GET" , "https://example.com" , nil )
117+ req .Header .Add ("Authorization" , secretToken + "1" )
118+ req .Header .Add ("Authorization" , secretToken + "2" )
119+
120+ var nextMiddlewareRan bool
121+ middleware .Middleware ()(req , func (req * http.Request ) (* http.Response , error ) {
122+ nextMiddlewareRan = true
123+
124+ // The request sent down through middleware shouldn't be mutated.
125+ if ! reflect .DeepEqual (req .Header .Values ("Authorization" ), []string {secretToken + "1" , secretToken + "2" }) {
126+ t .Errorf ("expected original request to be unmodified" )
127+ }
128+
129+ return & http.Response {}, nil
130+ })
131+
132+ if ! nextMiddlewareRan {
133+ t .Error ("expected next middleware to have been run" )
134+ }
135+
136+ if strings .Count (logBuf .String (), "Authorization: " + redactedPlaceholder ) != 2 {
137+ t .Error ("expected exactly two redacted placeholders in authorization headers" )
138+ }
139+ })
140+
141+ const customAPIKeyHeader = "X-My-Api-Key"
142+
143+ t .Run ("RedactsSensitiveHeaders" , func (t * testing.T ) {
144+ t .Parallel ()
145+
146+ middleware , logBuf := setup ()
147+
148+ middleware .sensitiveHeaders = []string {customAPIKeyHeader }
149+
150+ req := httptest .NewRequest ("GET" , "https://example.com" , nil )
151+ req .Header .Set (customAPIKeyHeader , secretToken )
152+
153+ var nextMiddlewareRan bool
154+ middleware .Middleware ()(req , func (req * http.Request ) (* http.Response , error ) {
155+ nextMiddlewareRan = true
156+
157+ // The request sent down through middleware shouldn't be mutated.
158+ if req .Header .Get (customAPIKeyHeader ) != secretToken {
159+ t .Error ("expected original request to be unmodified" )
160+ }
161+
162+ return & http.Response {}, nil
163+ })
164+
165+ if ! nextMiddlewareRan {
166+ t .Error ("expected next middleware to have been run" )
167+ }
168+
169+ if ! strings .Contains (logBuf .String (), customAPIKeyHeader + ": " + redactedPlaceholder ) {
170+ t .Errorf ("expected %s header to be redacted" , customAPIKeyHeader )
171+ }
172+ })
173+
174+ t .Run ("RedactsMultipleSensitiveHeaders" , func (t * testing.T ) {
175+ t .Parallel ()
176+
177+ middleware , logBuf := setup ()
178+
179+ middleware .sensitiveHeaders = []string {customAPIKeyHeader }
180+
181+ req := httptest .NewRequest ("GET" , "https://example.com" , nil )
182+ req .Header .Add (customAPIKeyHeader , secretToken + "1" )
183+ req .Header .Add (customAPIKeyHeader , secretToken + "2" )
184+
185+ var nextMiddlewareRan bool
186+ middleware .Middleware ()(req , func (req * http.Request ) (* http.Response , error ) {
187+ nextMiddlewareRan = true
188+
189+ // The request sent down through middleware shouldn't be mutated.
190+ if ! reflect .DeepEqual (req .Header .Values (customAPIKeyHeader ), []string {secretToken + "1" , secretToken + "2" }) {
191+ t .Error ("expected original request to be unmodified" )
192+ }
193+
194+ return & http.Response {}, nil
195+ })
196+
197+ if ! nextMiddlewareRan {
198+ t .Error ("expected next middleware to have been run" )
199+ }
200+
201+ if strings .Count (logBuf .String (), customAPIKeyHeader + ": " + redactedPlaceholder ) != 2 {
202+ t .Errorf ("expected %s header to be redacted" , customAPIKeyHeader )
203+ }
204+ })
105205}
0 commit comments