Skip to content

Commit d92e036

Browse files
fix: preserve case-insensitive response headers (box/box-codegen#991) (#1593)
1 parent c89f097 commit d92e036

3 files changed

Lines changed: 20 additions & 6 deletions

File tree

‎.codegen.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{ "engineHash": "0072e8b", "specHash": "88cd5aa", "version": "10.15.0" }
1+
{ "engineHash": "daeb1ea", "specHash": "88cd5aa", "version": "10.15.0" }

‎box_sdk_gen/networking/box_network_client.py‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import requests
1010
from requests import RequestException, Session, Response
11+
from requests.structures import CaseInsensitiveDict
1112
from requests_toolbelt import MultipartEncoder
1213

1314
from ..internal.logging import DataSanitizer
@@ -92,12 +93,13 @@ def fetch(self, options: 'FetchOptions') -> FetchResponse:
9293
if response.network_response is not None:
9394
attempt_for_retry = attempt_nr
9495
network_response = response.network_response
96+
response_headers = CaseInsensitiveDict(network_response.headers)
9597

9698
if options.response_format == 'binary':
9799
fetch_response = FetchResponse(
98100
url=network_response.url,
99101
status=network_response.status_code,
100-
headers=dict(response.network_response.headers),
102+
headers=response_headers,
101103
content=ResponseByteStream(
102104
response.network_response.iter_content(chunk_size=1024)
103105
),
@@ -106,7 +108,7 @@ def fetch(self, options: 'FetchOptions') -> FetchResponse:
106108
fetch_response = FetchResponse(
107109
url=network_response.url,
108110
status=network_response.status_code,
109-
headers=dict(response.network_response.headers),
111+
headers=response_headers,
110112
data=(self._read_json_body(network_response.text)),
111113
content=io.BytesIO(network_response.content),
112114
)

‎test/box_network_client.py‎

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,13 @@
3030
)
3131
from box_sdk_gen.networking.proxy_config import ProxyConfig
3232

33+
RETRY_AFTER_HEADER_CASES = [
34+
"retry-after",
35+
"Retry-After",
36+
"rEtRy-AfTeR",
37+
"RETRY-AFTER",
38+
]
39+
3340

3441
@pytest.fixture
3542
def mock_requests_session():
@@ -609,13 +616,16 @@ def test_status_code_202_with_no_retry_after_header(
609616
assert fetch_response.data == {}
610617

611618

612-
def test_retryable_status_code_202(
619+
@pytest.mark.parametrize("retry_after_header", RETRY_AFTER_HEADER_CASES)
620+
def test_retryable_status_code_202_with_case_insensitive_retry_after_header(
613621
network_client,
614622
mock_requests_session,
615623
network_session_mock,
616624
response_202_with_retry_after,
617625
response_200,
626+
retry_after_header,
618627
):
628+
response_202_with_retry_after.headers = {retry_after_header: "0"}
619629
response_200.text = '{"id": "123456"}'
620630
response_200.headers = {"Retry-After": "0"}
621631
mock_requests_session.request.side_effect = [
@@ -847,14 +857,16 @@ def test_get_retry_after_time_use_exponential_backoff(network_session_mock):
847857
assert sleep_time > 0
848858

849859

850-
def test_pass_retry_after_header_to_get_retry_after_time_method(
860+
@pytest.mark.parametrize("retry_after_header", RETRY_AFTER_HEADER_CASES)
861+
def test_pass_case_insensitive_retry_after_header_to_get_retry_after_time_method(
851862
network_client,
852863
mock_requests_session,
853864
network_session_mock,
854865
response_429,
855866
response_200,
867+
retry_after_header,
856868
):
857-
response_429.headers = {"Retry-After": "123"}
869+
response_429.headers = {retry_after_header: "123"}
858870
mock_requests_session.request.side_effect = [response_429, response_200]
859871

860872
with patch("time.sleep") as sleep_mock:

0 commit comments

Comments
 (0)