@@ -493,3 +493,128 @@ func TestAllowsHTTP2(t *testing.T) {
493
493
})
494
494
}
495
495
}
496
+
497
+ func TestSourceIPs (t * testing.T ) {
498
+ tests := []struct {
499
+ name string
500
+ realIP string
501
+ forwardedFor string
502
+ remoteAddr string
503
+ expected []string
504
+ }{{
505
+ name : "no headers, missing remoteAddr" ,
506
+ expected : []string {},
507
+ }, {
508
+ name : "no headers, just remoteAddr host:port" ,
509
+ remoteAddr : "1.2.3.4:555" ,
510
+ expected : []string {"1.2.3.4" },
511
+ }, {
512
+ name : "no headers, just remoteAddr host" ,
513
+ remoteAddr : "1.2.3.4" ,
514
+ expected : []string {"1.2.3.4" },
515
+ }, {
516
+ name : "empty forwarded-for chain" ,
517
+ forwardedFor : " " ,
518
+ remoteAddr : "1.2.3.4" ,
519
+ expected : []string {"1.2.3.4" },
520
+ }, {
521
+ name : "invalid forwarded-for chain" ,
522
+ forwardedFor : "garbage garbage values!" ,
523
+ remoteAddr : "1.2.3.4" ,
524
+ expected : []string {"1.2.3.4" },
525
+ }, {
526
+ name : "partially invalid forwarded-for chain" ,
527
+ forwardedFor : "garbage garbage values!,4.5.6.7" ,
528
+ remoteAddr : "1.2.3.4" ,
529
+ expected : []string {"4.5.6.7" , "1.2.3.4" },
530
+ }, {
531
+ name : "valid forwarded-for chain" ,
532
+ forwardedFor : "120.120.120.126,2.2.2.2,4.5.6.7" ,
533
+ remoteAddr : "1.2.3.4" ,
534
+ expected : []string {"120.120.120.126" , "2.2.2.2" , "4.5.6.7" , "1.2.3.4" },
535
+ }, {
536
+ name : "valid forwarded-for chain with redundant remoteAddr" ,
537
+ forwardedFor : "2.2.2.2,1.2.3.4" ,
538
+ remoteAddr : "1.2.3.4" ,
539
+ expected : []string {"2.2.2.2" , "1.2.3.4" },
540
+ }, {
541
+ name : "invalid Real-Ip" ,
542
+ realIP : "garbage, just garbage!" ,
543
+ remoteAddr : "1.2.3.4" ,
544
+ expected : []string {"1.2.3.4" },
545
+ }, {
546
+ name : "invalid Real-Ip with forwarded-for" ,
547
+ realIP : "garbage, just garbage!" ,
548
+ forwardedFor : "2.2.2.2" ,
549
+ remoteAddr : "1.2.3.4" ,
550
+ expected : []string {"2.2.2.2" , "1.2.3.4" },
551
+ }, {
552
+ name : "valid Real-Ip" ,
553
+ realIP : "2.2.2.2" ,
554
+ remoteAddr : "1.2.3.4" ,
555
+ expected : []string {"2.2.2.2" , "1.2.3.4" },
556
+ }, {
557
+ name : "redundant Real-Ip" ,
558
+ realIP : "1.2.3.4" ,
559
+ remoteAddr : "1.2.3.4" ,
560
+ expected : []string {"1.2.3.4" },
561
+ }, {
562
+ name : "valid Real-Ip with forwarded-for" ,
563
+ realIP : "2.2.2.2" ,
564
+ forwardedFor : "120.120.120.126,4.5.6.7" ,
565
+ remoteAddr : "1.2.3.4" ,
566
+ expected : []string {"120.120.120.126" , "4.5.6.7" , "2.2.2.2" , "1.2.3.4" },
567
+ }, {
568
+ name : "redundant Real-Ip with forwarded-for" ,
569
+ realIP : "2.2.2.2" ,
570
+ forwardedFor : "120.120.120.126,2.2.2.2,4.5.6.7" ,
571
+ remoteAddr : "1.2.3.4" ,
572
+ expected : []string {"120.120.120.126" , "2.2.2.2" , "4.5.6.7" , "1.2.3.4" },
573
+ }, {
574
+ name : "full redundancy" ,
575
+ realIP : "1.2.3.4" ,
576
+ forwardedFor : "1.2.3.4" ,
577
+ remoteAddr : "1.2.3.4" ,
578
+ expected : []string {"1.2.3.4" },
579
+ }, {
580
+ name : "full ipv6" ,
581
+ realIP : "abcd:ef01:2345:6789:abcd:ef01:2345:6789" ,
582
+ forwardedFor : "aaaa:bbbb:cccc:dddd:eeee:ffff:0:1111,0:1111:2222:3333:4444:5555:6666:7777" ,
583
+ remoteAddr : "aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa" ,
584
+ expected : []string {
585
+ "aaaa:bbbb:cccc:dddd:eeee:ffff:0:1111" ,
586
+ "0:1111:2222:3333:4444:5555:6666:7777" ,
587
+ "abcd:ef01:2345:6789:abcd:ef01:2345:6789" ,
588
+ "aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa" ,
589
+ },
590
+ }, {
591
+ name : "mixed ipv4 ipv6" ,
592
+ forwardedFor : "aaaa:bbbb:cccc:dddd:eeee:ffff:0:1111,1.2.3.4" ,
593
+ remoteAddr : "0:0:0:0:0:ffff:102:304" , // ipv6 equivalent to 1.2.3.4
594
+ expected : []string {
595
+ "aaaa:bbbb:cccc:dddd:eeee:ffff:0:1111" ,
596
+ "1.2.3.4" ,
597
+ },
598
+ }}
599
+
600
+ for _ , test := range tests {
601
+ t .Run (test .name , func (t * testing.T ) {
602
+ req , _ := http .NewRequest ("GET" , "https://cluster.k8s.io/apis/foobars/v1/foo/bar" , nil )
603
+ req .RemoteAddr = test .remoteAddr
604
+ if test .forwardedFor != "" {
605
+ req .Header .Set ("X-Forwarded-For" , test .forwardedFor )
606
+ }
607
+ if test .realIP != "" {
608
+ req .Header .Set ("X-Real-Ip" , test .realIP )
609
+ }
610
+
611
+ actualIPs := SourceIPs (req )
612
+ actual := make ([]string , len (actualIPs ))
613
+ for i , ip := range actualIPs {
614
+ actual [i ] = ip .String ()
615
+ }
616
+
617
+ assert .Equal (t , test .expected , actual )
618
+ })
619
+ }
620
+ }
0 commit comments