@@ -440,15 +440,36 @@ func TestForwardRequestRedirectAndHeaders(t *testing.T) {
440440 r .Equal ("Hello from srv" , res .Body .String ())
441441}
442442
443- func TestUpstreamSetsXForwardedFor (t * testing.T ) {
443+ func TestUpstreamPreservesXForwardedHeaders (t * testing.T ) {
444444 tests := map [string ]struct {
445- forwardedIPs []string
445+ forwardedFor string
446+ forwardedHost string
447+ forwardedProto string
448+ forwardedPort string
446449 }{
447- "appends to existing header chain" : {
448- forwardedIPs : []string {"1.2.3.4" , "5.6.7.8" },
450+ "preserves and extends forwarded IPs" : {
451+ forwardedFor : "198.51.100.1" ,
452+ },
453+ "preserves forwarded host" : {
454+ forwardedHost : "example.org" ,
455+ },
456+ "preserves forwarded proto" : {
457+ forwardedProto : "http" ,
458+ },
459+ "preserves forwarded port" : {
460+ forwardedPort : "443" ,
461+ },
462+ "preserves and extends existing headers" : {
463+ forwardedFor : "1.2.3.4, 5.6.7.8" ,
464+ forwardedHost : "keda.sh" ,
465+ forwardedProto : "https" ,
466+ forwardedPort : "8443" ,
449467 },
450468 "sets header when not present" : {
451- forwardedIPs : nil ,
469+ forwardedFor : "" ,
470+ forwardedHost : "" ,
471+ forwardedProto : "" ,
472+ forwardedPort : "" ,
452473 },
453474 }
454475
@@ -470,28 +491,54 @@ func TestUpstreamSetsXForwardedFor(t *testing.T) {
470491 upstream := NewUpstream (http .DefaultTransport , & config.Tracing {}, false )
471492
472493 req := httptest .NewRequest ("GET" , "/test" , nil )
473- forwardedIPsStr := strings .Join (tt .forwardedIPs , ", " )
474- if tt .forwardedIPs != nil {
475- req .Header .Set ("X-Forwarded-For" , forwardedIPsStr )
494+ if tt .forwardedFor != "" {
495+ req .Header .Set ("X-Forwarded-For" , tt .forwardedFor )
496+ }
497+ if tt .forwardedHost != "" {
498+ req .Header .Set ("X-Forwarded-Host" , tt .forwardedHost )
499+ }
500+ if tt .forwardedProto != "" {
501+ req .Header .Set ("X-Forwarded-Proto" , tt .forwardedProto )
502+ }
503+ if tt .forwardedPort != "" {
504+ req .Header .Set ("X-Forwarded-Port" , tt .forwardedPort )
476505 }
477506 req = util .RequestWithStream (req , backendURL )
478507
479508 upstream .ServeHTTP (httptest .NewRecorder (), req )
480509
481510 // Verify the test conditions
482511 xff := receivedHeaders .Get ("X-Forwarded-For" )
483- if xff == "" {
484- t .Fatal ("X-Forwarded-For should not be empty" )
512+ if tt .forwardedFor != "" {
513+ if ! strings .HasPrefix (xff , tt .forwardedFor + ", " ) {
514+ t .Errorf ("expected X-Forwarded-For to start with %q, got: %q" , tt .forwardedFor + ", " , xff )
515+ }
516+ } else if xff == "" {
517+ t .Error ("X-Forwarded-For should contain at least the client IP" )
518+ }
519+
520+ xfh := receivedHeaders .Get ("X-Forwarded-Host" )
521+ if tt .forwardedHost != "" {
522+ if tt .forwardedHost != xfh {
523+ t .Errorf ("expected forwarded host %q, got %q" , tt .forwardedHost , xfh )
524+ }
525+ } else if xfh != req .Host {
526+ t .Errorf ("expected default forwarded host %q, got %q" , req .Host , xfh )
485527 }
486528
487- if tt .forwardedIPs != nil && ! strings .HasPrefix (xff , forwardedIPsStr ) {
488- t .Errorf ("expected X-Forwarded-For to contain %q, got: %q" , forwardedIPsStr , xff )
529+ xfproto := receivedHeaders .Get ("X-Forwarded-Proto" )
530+ if tt .forwardedProto != "" {
531+ if tt .forwardedProto != xfproto {
532+ t .Errorf ("expected forwarded proto %q, got %q" , tt .forwardedProto , xfproto )
533+ }
534+ } else if xfproto != "http" {
535+ t .Errorf ("expected default forwarded proto %q, got %q" , "http" , xfproto )
489536 }
490537
491- ips := strings . Split ( xff , ", " )
492- expectedLen := len ( tt . forwardedIPs ) + 1
493- if len ( ips ) != expectedLen {
494- t .Errorf ("expected %d IPs in X-Forwarded-For , got %d: % q" , expectedLen , len ( ips ), xff )
538+ // Ensure that X-Forwarded-Port is preserved even if we don't set a default for it
539+ xfport := receivedHeaders . Get ( "X-Forwarded-Port" )
540+ if xfport != tt . forwardedPort {
541+ t .Errorf ("expected forwarded port %q , got %q" , tt . forwardedPort , xfport )
495542 }
496543 })
497544 }
0 commit comments