@@ -704,6 +704,83 @@ func TestProxyUpgradeErrorResponse(t *testing.T) {
704
704
}
705
705
}
706
706
707
+ func TestRejectForwardingRedirectsOption (t * testing.T ) {
708
+ originalBody := []byte (`some data` )
709
+ testCases := []struct {
710
+ name string
711
+ rejectForwardingRedirects bool
712
+ serverStatusCode int
713
+ expectStatusCode int
714
+ expectBody []byte
715
+ }{
716
+ {
717
+ name : "reject redirection enabled in proxy, backend server sending 200 response" ,
718
+ rejectForwardingRedirects : true ,
719
+ serverStatusCode : 200 ,
720
+ expectStatusCode : 200 ,
721
+ expectBody : originalBody ,
722
+ },
723
+ {
724
+ name : "reject redirection enabled in proxy, backend server sending 301 response" ,
725
+ rejectForwardingRedirects : true ,
726
+ serverStatusCode : 301 ,
727
+ expectStatusCode : 502 ,
728
+ expectBody : []byte (`the backend attempted to redirect this request, which is not permitted` ),
729
+ },
730
+ {
731
+ name : "reject redirection disabled in proxy, backend server sending 200 response" ,
732
+ rejectForwardingRedirects : false ,
733
+ serverStatusCode : 200 ,
734
+ expectStatusCode : 200 ,
735
+ expectBody : originalBody ,
736
+ },
737
+ {
738
+ name : "reject redirection disabled in proxy, backend server sending 301 response" ,
739
+ rejectForwardingRedirects : false ,
740
+ serverStatusCode : 301 ,
741
+ expectStatusCode : 301 ,
742
+ expectBody : originalBody ,
743
+ },
744
+ }
745
+ for _ , tc := range testCases {
746
+ t .Run (tc .name , func (t * testing.T ) {
747
+ // Set up a backend server
748
+ backendServer := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
749
+ w .WriteHeader (tc .serverStatusCode )
750
+ w .Write (originalBody )
751
+ }))
752
+ defer backendServer .Close ()
753
+ backendServerURL , _ := url .Parse (backendServer .URL )
754
+
755
+ // Set up a proxy pointing to the backend
756
+ proxyHandler := NewUpgradeAwareHandler (backendServerURL , nil , false , false , & fakeResponder {t : t })
757
+ proxyHandler .RejectForwardingRedirects = tc .rejectForwardingRedirects
758
+ proxy := httptest .NewServer (proxyHandler )
759
+ defer proxy .Close ()
760
+ proxyURL , _ := url .Parse (proxy .URL )
761
+
762
+ conn , err := net .Dial ("tcp" , proxyURL .Host )
763
+ require .NoError (t , err )
764
+ bufferedReader := bufio .NewReader (conn )
765
+
766
+ req , _ := http .NewRequest ("GET" , proxyURL .String (), nil )
767
+ require .NoError (t , req .Write (conn ))
768
+ // Verify we get the correct response and message body content
769
+ resp , err := http .ReadResponse (bufferedReader , nil )
770
+ require .NoError (t , err )
771
+ assert .Equal (t , tc .expectStatusCode , resp .StatusCode )
772
+ data , err := ioutil .ReadAll (resp .Body )
773
+ require .NoError (t , err )
774
+ assert .Equal (t , tc .expectBody , data )
775
+ assert .Equal (t , int64 (len (tc .expectBody )), resp .ContentLength )
776
+ resp .Body .Close ()
777
+
778
+ // clean up
779
+ conn .Close ()
780
+ })
781
+ }
782
+ }
783
+
707
784
func TestDefaultProxyTransport (t * testing.T ) {
708
785
tests := []struct {
709
786
name ,
0 commit comments