@@ -921,6 +921,33 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
921921
922922 assert response .http_request .headers .get ("x-stainless-retry-count" ) == "42"
923923
924+ @pytest .mark .respx (base_url = base_url )
925+ def test_follow_redirects (self , respx_mock : MockRouter ) -> None :
926+ # Test that the default follow_redirects=True allows following redirects
927+ respx_mock .post ("/redirect" ).mock (
928+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
929+ )
930+ respx_mock .get ("/redirected" ).mock (return_value = httpx .Response (200 , json = {"status" : "ok" }))
931+
932+ response = self .client .post ("/redirect" , body = {"key" : "value" }, cast_to = httpx .Response )
933+ assert response .status_code == 200
934+ assert response .json () == {"status" : "ok" }
935+
936+ @pytest .mark .respx (base_url = base_url )
937+ def test_follow_redirects_disabled (self , respx_mock : MockRouter ) -> None :
938+ # Test that follow_redirects=False prevents following redirects
939+ respx_mock .post ("/redirect" ).mock (
940+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
941+ )
942+
943+ with pytest .raises (APIStatusError ) as exc_info :
944+ self .client .post (
945+ "/redirect" , body = {"key" : "value" }, options = {"follow_redirects" : False }, cast_to = httpx .Response
946+ )
947+
948+ assert exc_info .value .response .status_code == 302
949+ assert exc_info .value .response .headers ["Location" ] == f"{ base_url } /redirected"
950+
924951
925952class TestAsyncOpenlayer :
926953 client = AsyncOpenlayer (base_url = base_url , api_key = api_key , _strict_response_validation = True )
@@ -1847,3 +1874,30 @@ async def test_main() -> None:
18471874 raise AssertionError ("calling get_platform using asyncify resulted in a hung process" )
18481875
18491876 time .sleep (0.1 )
1877+
1878+ @pytest .mark .respx (base_url = base_url )
1879+ async def test_follow_redirects (self , respx_mock : MockRouter ) -> None :
1880+ # Test that the default follow_redirects=True allows following redirects
1881+ respx_mock .post ("/redirect" ).mock (
1882+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
1883+ )
1884+ respx_mock .get ("/redirected" ).mock (return_value = httpx .Response (200 , json = {"status" : "ok" }))
1885+
1886+ response = await self .client .post ("/redirect" , body = {"key" : "value" }, cast_to = httpx .Response )
1887+ assert response .status_code == 200
1888+ assert response .json () == {"status" : "ok" }
1889+
1890+ @pytest .mark .respx (base_url = base_url )
1891+ async def test_follow_redirects_disabled (self , respx_mock : MockRouter ) -> None :
1892+ # Test that follow_redirects=False prevents following redirects
1893+ respx_mock .post ("/redirect" ).mock (
1894+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
1895+ )
1896+
1897+ with pytest .raises (APIStatusError ) as exc_info :
1898+ await self .client .post (
1899+ "/redirect" , body = {"key" : "value" }, options = {"follow_redirects" : False }, cast_to = httpx .Response
1900+ )
1901+
1902+ assert exc_info .value .response .status_code == 302
1903+ assert exc_info .value .response .headers ["Location" ] == f"{ base_url } /redirected"
0 commit comments