@@ -788,6 +788,152 @@ def test_retry_config_external():
788788 assert retry_err .value .reason == error
789789
790790
791+ @responses .activate
792+ def test_redirect_ibm_to_ibm_success ():
793+ url_from = 'http://region1.cloud.ibm.com/'
794+ url_to = 'http://region2.cloud.ibm.com/'
795+
796+ safe_headers = {
797+ 'Authorization' : 'foo' ,
798+ 'WWW-Authenticate' : 'bar' ,
799+ 'Cookie' : 'baz' ,
800+ 'Cookie2' : 'baz2' ,
801+ }
802+
803+ responses .add (responses .GET , url_from , status = 302 , adding_headers = {'Location' : url_to }, body = 'just about to redirect' )
804+ responses .add (responses .GET , url_to , status = 200 , body = 'successfully redirected' )
805+
806+ service = BaseService (service_url = url_from , authenticator = NoAuthAuthenticator ())
807+
808+ prepped = service .prepare_request ('GET' , '' , headers = safe_headers )
809+ response = service .send (prepped )
810+ result = response .get_result ()
811+
812+ assert result .status_code == 200
813+ assert result .url == url_to
814+ assert result .text == 'successfully redirected'
815+
816+ # Make sure the headers are included in the 2nd, redirected request.
817+ redirected_headers = responses .calls [1 ].request .headers
818+ for key in safe_headers :
819+ assert key in redirected_headers
820+
821+
822+ @responses .activate
823+ def test_redirect_not_ibm_to_ibm_fail ():
824+ url_from = 'http://region1.notcloud.ibm.com/'
825+ url_to = 'http://region2.cloud.ibm.com/'
826+
827+ safe_headers = {
828+ 'Authorization' : 'foo' ,
829+ 'WWW-Authenticate' : 'bar' ,
830+ 'Cookie' : 'baz' ,
831+ 'Cookie2' : 'baz2' ,
832+ }
833+
834+ responses .add (responses .GET , url_from , status = 302 , adding_headers = {'Location' : url_to }, body = 'just about to redirect' )
835+ responses .add (responses .GET , url_to , status = 200 , body = 'successfully redirected' )
836+
837+ service = BaseService (service_url = url_from , authenticator = NoAuthAuthenticator ())
838+
839+ prepped = service .prepare_request ('GET' , '' , headers = safe_headers )
840+ response = service .send (prepped )
841+ result = response .get_result ()
842+
843+ assert result .status_code == 200
844+ assert result .url == url_to
845+ assert result .text == 'successfully redirected'
846+
847+ # Make sure the headers have been excluded from the 2nd, redirected request.
848+ redirected_headers = responses .calls [1 ].request .headers
849+ for key in safe_headers :
850+ assert key not in redirected_headers
851+
852+
853+ @responses .activate
854+ def test_redirect_ibm_to_not_ibm_fail ():
855+ url_from = 'http://region1.cloud.ibm.com/'
856+ url_to = 'http://region2.notcloud.ibm.com/'
857+
858+ safe_headers = {
859+ 'Authorization' : 'foo' ,
860+ 'WWW-Authenticate' : 'bar' ,
861+ 'Cookie' : 'baz' ,
862+ 'Cookie2' : 'baz2' ,
863+ }
864+
865+ responses .add (responses .GET , url_from , status = 302 , adding_headers = {'Location' : url_to }, body = 'just about to redirect' )
866+ responses .add (responses .GET , url_to , status = 200 , body = 'successfully redirected' )
867+
868+ service = BaseService (service_url = url_from , authenticator = NoAuthAuthenticator ())
869+
870+ prepped = service .prepare_request ('GET' , '' , headers = safe_headers )
871+ response = service .send (prepped )
872+ result = response .get_result ()
873+
874+ assert result .status_code == 200
875+ assert result .url == url_to
876+ assert result .text == 'successfully redirected'
877+
878+ # Make sure the headers have been excluded from the 2nd, redirected request.
879+ redirected_headers = responses .calls [1 ].request .headers
880+ for key in safe_headers :
881+ assert key not in redirected_headers
882+
883+
884+ @responses .activate
885+ def test_redirect_not_ibm_to_not_ibm_fail ():
886+ url_from = 'http://region1.notcloud.ibm.com/'
887+ url_to = 'http://region2.notcloud.ibm.com/'
888+
889+ safe_headers = {
890+ 'Authorization' : 'foo' ,
891+ 'WWW-Authenticate' : 'bar' ,
892+ 'Cookie' : 'baz' ,
893+ 'Cookie2' : 'baz2' ,
894+ }
895+
896+ responses .add (responses .GET , url_from , status = 302 , adding_headers = {'Location' : url_to }, body = 'just about to redirect' )
897+ responses .add (responses .GET , url_to , status = 200 , body = 'successfully redirected' )
898+
899+ service = BaseService (service_url = url_from , authenticator = NoAuthAuthenticator ())
900+
901+ prepped = service .prepare_request ('GET' , '' , headers = safe_headers )
902+ response = service .send (prepped )
903+ result = response .get_result ()
904+
905+ assert result .status_code == 200
906+ assert result .url == url_to
907+ assert result .text == 'successfully redirected'
908+
909+ # Make sure the headers have been excluded from the 2nd, redirected request.
910+ redirected_headers = responses .calls [1 ].request .headers
911+ for key in safe_headers :
912+ assert key not in redirected_headers
913+
914+
915+ @responses .activate
916+ def test_redirect_ibm_to_ibm_exhausted_fail ():
917+ redirects = 11
918+ safe_headers = {
919+ 'Authorization' : 'foo' ,
920+ 'WWW-Authenticate' : 'bar' ,
921+ 'Cookie' : 'baz' ,
922+ 'Cookie2' : 'baz2' ,
923+ }
924+
925+ for i in range (redirects ):
926+ responses .add (responses .GET , f'http://region{ i + 1 } .cloud.ibm.com/' , status = 302 , adding_headers = {'Location' : f'http://region{ i + 2 } .cloud.ibm.com/' }, body = 'just about to redirect' )
927+
928+ service = BaseService (service_url = f'http://region1.cloud.ibm.com/' , authenticator = NoAuthAuthenticator ())
929+
930+ with pytest .raises (MaxRetryError ) as ex :
931+ prepped = service .prepare_request ('GET' , '' , headers = safe_headers )
932+ service .send (prepped )
933+
934+ assert ex .value .reason == 'reached the maximum number of redirects: 10'
935+
936+
791937@responses .activate
792938def test_user_agent_header ():
793939 service = AnyServiceV1 ('2018-11-20' , authenticator = NoAuthAuthenticator ())
0 commit comments