Skip to content

Commit 5aff0ca

Browse files
stainless-app[bot]stainless-bot
authored andcommitted
chore(internal): codegen related update (#506)
1 parent db16735 commit 5aff0ca

File tree

2 files changed

+96
-1
lines changed

2 files changed

+96
-1
lines changed

src/finch/_base_client.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,10 @@ def _build_headers(self, options: FinalRequestOptions, *, retries_taken: int = 0
413413
if idempotency_header and options.method.lower() != "get" and idempotency_header not in headers:
414414
headers[idempotency_header] = options.idempotency_key or self._idempotency_key()
415415

416-
headers.setdefault("x-stainless-retry-count", str(retries_taken))
416+
# Don't set the retry count header if it was already set or removed by the caller. We check
417+
# `custom_headers`, which can contain `Omit()`, instead of `headers` to account for the removal case.
418+
if "x-stainless-retry-count" not in (header.lower() for header in custom_headers):
419+
headers["x-stainless-retry-count"] = str(retries_taken)
417420

418421
return headers
419422

tests/test_client.py

+92
Original file line numberDiff line numberDiff line change
@@ -842,6 +842,50 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
842842
assert response.retries_taken == failures_before_success
843843
assert int(response.http_request.headers.get("x-stainless-retry-count")) == failures_before_success
844844

845+
@pytest.mark.parametrize("failures_before_success", [0, 2, 4])
846+
@mock.patch("finch._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
847+
@pytest.mark.respx(base_url=base_url)
848+
def test_omit_retry_count_header(self, client: Finch, failures_before_success: int, respx_mock: MockRouter) -> None:
849+
client = client.with_options(max_retries=4)
850+
851+
nb_retries = 0
852+
853+
def retry_handler(_request: httpx.Request) -> httpx.Response:
854+
nonlocal nb_retries
855+
if nb_retries < failures_before_success:
856+
nb_retries += 1
857+
return httpx.Response(500)
858+
return httpx.Response(200)
859+
860+
respx_mock.get("/employer/directory").mock(side_effect=retry_handler)
861+
862+
response = client.hris.directory.with_raw_response.list(extra_headers={"x-stainless-retry-count": Omit()})
863+
864+
assert len(response.http_request.headers.get_list("x-stainless-retry-count")) == 0
865+
866+
@pytest.mark.parametrize("failures_before_success", [0, 2, 4])
867+
@mock.patch("finch._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
868+
@pytest.mark.respx(base_url=base_url)
869+
def test_overwrite_retry_count_header(
870+
self, client: Finch, failures_before_success: int, respx_mock: MockRouter
871+
) -> None:
872+
client = client.with_options(max_retries=4)
873+
874+
nb_retries = 0
875+
876+
def retry_handler(_request: httpx.Request) -> httpx.Response:
877+
nonlocal nb_retries
878+
if nb_retries < failures_before_success:
879+
nb_retries += 1
880+
return httpx.Response(500)
881+
return httpx.Response(200)
882+
883+
respx_mock.get("/employer/directory").mock(side_effect=retry_handler)
884+
885+
response = client.hris.directory.with_raw_response.list(extra_headers={"x-stainless-retry-count": "42"})
886+
887+
assert response.http_request.headers.get("x-stainless-retry-count") == "42"
888+
845889
@pytest.mark.parametrize("failures_before_success", [0, 2, 4])
846890
@mock.patch("finch._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
847891
@pytest.mark.respx(base_url=base_url)
@@ -1679,6 +1723,54 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
16791723
assert response.retries_taken == failures_before_success
16801724
assert int(response.http_request.headers.get("x-stainless-retry-count")) == failures_before_success
16811725

1726+
@pytest.mark.parametrize("failures_before_success", [0, 2, 4])
1727+
@mock.patch("finch._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
1728+
@pytest.mark.respx(base_url=base_url)
1729+
@pytest.mark.asyncio
1730+
async def test_omit_retry_count_header(
1731+
self, async_client: AsyncFinch, failures_before_success: int, respx_mock: MockRouter
1732+
) -> None:
1733+
client = async_client.with_options(max_retries=4)
1734+
1735+
nb_retries = 0
1736+
1737+
def retry_handler(_request: httpx.Request) -> httpx.Response:
1738+
nonlocal nb_retries
1739+
if nb_retries < failures_before_success:
1740+
nb_retries += 1
1741+
return httpx.Response(500)
1742+
return httpx.Response(200)
1743+
1744+
respx_mock.get("/employer/directory").mock(side_effect=retry_handler)
1745+
1746+
response = await client.hris.directory.with_raw_response.list(extra_headers={"x-stainless-retry-count": Omit()})
1747+
1748+
assert len(response.http_request.headers.get_list("x-stainless-retry-count")) == 0
1749+
1750+
@pytest.mark.parametrize("failures_before_success", [0, 2, 4])
1751+
@mock.patch("finch._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
1752+
@pytest.mark.respx(base_url=base_url)
1753+
@pytest.mark.asyncio
1754+
async def test_overwrite_retry_count_header(
1755+
self, async_client: AsyncFinch, failures_before_success: int, respx_mock: MockRouter
1756+
) -> None:
1757+
client = async_client.with_options(max_retries=4)
1758+
1759+
nb_retries = 0
1760+
1761+
def retry_handler(_request: httpx.Request) -> httpx.Response:
1762+
nonlocal nb_retries
1763+
if nb_retries < failures_before_success:
1764+
nb_retries += 1
1765+
return httpx.Response(500)
1766+
return httpx.Response(200)
1767+
1768+
respx_mock.get("/employer/directory").mock(side_effect=retry_handler)
1769+
1770+
response = await client.hris.directory.with_raw_response.list(extra_headers={"x-stainless-retry-count": "42"})
1771+
1772+
assert response.http_request.headers.get("x-stainless-retry-count") == "42"
1773+
16821774
@pytest.mark.parametrize("failures_before_success", [0, 2, 4])
16831775
@mock.patch("finch._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
16841776
@pytest.mark.respx(base_url=base_url)

0 commit comments

Comments
 (0)