@@ -835,6 +835,33 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
835835
836836 assert response .http_request .headers .get ("x-stainless-retry-count" ) == "42"
837837
838+ @pytest .mark .respx (base_url = base_url )
839+ def test_follow_redirects (self , respx_mock : MockRouter ) -> None :
840+ # Test that the default follow_redirects=True allows following redirects
841+ respx_mock .post ("/redirect" ).mock (
842+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
843+ )
844+ respx_mock .get ("/redirected" ).mock (return_value = httpx .Response (200 , json = {"status" : "ok" }))
845+
846+ response = self .client .post ("/redirect" , body = {"key" : "value" }, cast_to = httpx .Response )
847+ assert response .status_code == 200
848+ assert response .json () == {"status" : "ok" }
849+
850+ @pytest .mark .respx (base_url = base_url )
851+ def test_follow_redirects_disabled (self , respx_mock : MockRouter ) -> None :
852+ # Test that follow_redirects=False prevents following redirects
853+ respx_mock .post ("/redirect" ).mock (
854+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
855+ )
856+
857+ with pytest .raises (APIStatusError ) as exc_info :
858+ self .client .post (
859+ "/redirect" , body = {"key" : "value" }, options = {"follow_redirects" : False }, cast_to = httpx .Response
860+ )
861+
862+ assert exc_info .value .response .status_code == 302
863+ assert exc_info .value .response .headers ["Location" ] == f"{ base_url } /redirected"
864+
838865
839866class TestAsyncKernel :
840867 client = AsyncKernel (base_url = base_url , api_key = api_key , _strict_response_validation = True )
@@ -1684,3 +1711,30 @@ async def test_main() -> None:
16841711 raise AssertionError ("calling get_platform using asyncify resulted in a hung process" )
16851712
16861713 time .sleep (0.1 )
1714+
1715+ @pytest .mark .respx (base_url = base_url )
1716+ async def test_follow_redirects (self , respx_mock : MockRouter ) -> None :
1717+ # Test that the default follow_redirects=True allows following redirects
1718+ respx_mock .post ("/redirect" ).mock (
1719+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
1720+ )
1721+ respx_mock .get ("/redirected" ).mock (return_value = httpx .Response (200 , json = {"status" : "ok" }))
1722+
1723+ response = await self .client .post ("/redirect" , body = {"key" : "value" }, cast_to = httpx .Response )
1724+ assert response .status_code == 200
1725+ assert response .json () == {"status" : "ok" }
1726+
1727+ @pytest .mark .respx (base_url = base_url )
1728+ async def test_follow_redirects_disabled (self , respx_mock : MockRouter ) -> None :
1729+ # Test that follow_redirects=False prevents following redirects
1730+ respx_mock .post ("/redirect" ).mock (
1731+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
1732+ )
1733+
1734+ with pytest .raises (APIStatusError ) as exc_info :
1735+ await self .client .post (
1736+ "/redirect" , body = {"key" : "value" }, options = {"follow_redirects" : False }, cast_to = httpx .Response
1737+ )
1738+
1739+ assert exc_info .value .response .status_code == 302
1740+ assert exc_info .value .response .headers ["Location" ] == f"{ base_url } /redirected"
0 commit comments