@@ -50,6 +50,12 @@ func TestReverseProxy(t *testing.T) {
50
50
if r .Header .Get ("X-Forwarded-For" ) == "" {
51
51
t .Errorf ("didn't get X-Forwarded-For header" )
52
52
}
53
+ if r .Header .Get ("X-Forwarded-Host" ) == "" {
54
+ t .Errorf ("didn't get X-Forwarded-Host header" )
55
+ }
56
+ if r .Header .Get ("X-Forwarded-Proto" ) == "" {
57
+ t .Errorf ("didn't get X-Forwarded-Proto header" )
58
+ }
53
59
if c := r .Header .Get ("Connection" ); c != "" {
54
60
t .Errorf ("handler got Connection header value %q" , c )
55
61
}
@@ -299,13 +305,20 @@ func TestXForwardedFor(t *testing.T) {
299
305
const prevForwardedFor = "client ip"
300
306
const backendResponse = "I am the backend"
301
307
const backendStatus = 404
308
+ const host = "some-name"
302
309
backend := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
303
310
if r .Header .Get ("X-Forwarded-For" ) == "" {
304
311
t .Errorf ("didn't get X-Forwarded-For header" )
305
312
}
306
313
if ! strings .Contains (r .Header .Get ("X-Forwarded-For" ), prevForwardedFor ) {
307
314
t .Errorf ("X-Forwarded-For didn't contain prior data" )
308
315
}
316
+ if got , want := r .Header .Get ("X-Forwarded-Host" ), host ; got != want {
317
+ t .Errorf ("X-Forwarded-Host = %q, want %q" , got , want )
318
+ }
319
+ if got , want := r .Header .Get ("X-Forwarded-Proto" ), "http" ; got != want {
320
+ t .Errorf ("X-Forwarded-Proto = %q, want %q" , got , want )
321
+ }
309
322
w .WriteHeader (backendStatus )
310
323
w .Write ([]byte (backendResponse ))
311
324
}))
@@ -319,7 +332,7 @@ func TestXForwardedFor(t *testing.T) {
319
332
defer frontend .Close ()
320
333
321
334
getReq , _ := http .NewRequest ("GET" , frontend .URL , nil )
322
- getReq .Host = "some-name"
335
+ getReq .Host = host
323
336
getReq .Header .Set ("Connection" , "close" )
324
337
getReq .Header .Set ("X-Forwarded-For" , prevForwardedFor )
325
338
getReq .Close = true
@@ -336,11 +349,36 @@ func TestXForwardedFor(t *testing.T) {
336
349
}
337
350
}
338
351
352
+ func TestXForwardedProtoTLS (t * testing.T ) {
353
+ backend := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
354
+ if got , want := r .Header .Get ("X-Forwarded-Proto" ), "https" ; got != want {
355
+ t .Errorf ("X-Forwarded-Proto = %q, want %q" , got , want )
356
+ }
357
+ }))
358
+ defer backend .Close ()
359
+ backendURL , err := url .Parse (backend .URL )
360
+ if err != nil {
361
+ t .Fatal (err )
362
+ }
363
+ proxyHandler := NewSingleHostReverseProxy (backendURL )
364
+ frontend := httptest .NewTLSServer (proxyHandler )
365
+ defer frontend .Close ()
366
+
367
+ getReq , _ := http .NewRequest ("GET" , frontend .URL , nil )
368
+ getReq .Host = "some-host"
369
+ _ , err = frontend .Client ().Do (getReq )
370
+ if err != nil {
371
+ t .Fatalf ("Get: %v" , err )
372
+ }
373
+ }
374
+
339
375
// Issue 38079: don't append to X-Forwarded-For if it's present but nil
340
376
func TestXForwardedFor_Omit (t * testing.T ) {
341
377
backend := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
342
- if v := r .Header .Get ("X-Forwarded-For" ); v != "" {
343
- t .Errorf ("got X-Forwarded-For header: %q" , v )
378
+ for _ , h := range []string {"X-Forwarded-For" , "X-Forwarded-Host" , "X-Forwarded-Proto" } {
379
+ if v := r .Header .Get (h ); v != "" {
380
+ t .Errorf ("got %v header: %q" , h , v )
381
+ }
344
382
}
345
383
w .Write ([]byte ("hi" ))
346
384
}))
@@ -356,6 +394,8 @@ func TestXForwardedFor_Omit(t *testing.T) {
356
394
oldDirector := proxyHandler .Director
357
395
proxyHandler .Director = func (r * http.Request ) {
358
396
r .Header ["X-Forwarded-For" ] = nil
397
+ r .Header ["X-Forwarded-Host" ] = nil
398
+ r .Header ["X-Forwarded-Proto" ] = nil
359
399
oldDirector (r )
360
400
}
361
401
@@ -1029,13 +1069,16 @@ func TestClonesRequestHeaders(t *testing.T) {
1029
1069
}
1030
1070
rp .ServeHTTP (httptest .NewRecorder (), req )
1031
1071
1032
- if req .Header .Get ("From-Director" ) == "1" {
1033
- t .Error ("Director header mutation modified caller's request" )
1034
- }
1035
- if req .Header .Get ("X-Forwarded-For" ) != "" {
1036
- t .Error ("X-Forward-For header mutation modified caller's request" )
1072
+ for _ , h := range []string {
1073
+ "From-Director" ,
1074
+ "X-Forwarded-For" ,
1075
+ "X-Forwarded-Host" ,
1076
+ "X-Forwarded-Proto" ,
1077
+ } {
1078
+ if req .Header .Get (h ) != "" {
1079
+ t .Errorf ("%v header mutation modified caller's request" , h )
1080
+ }
1037
1081
}
1038
-
1039
1082
}
1040
1083
1041
1084
type roundTripperFunc func (req * http.Request ) (* http.Response , error )
0 commit comments