Skip to content

Commit deb61fa

Browse files
committed
Improve test cases to test header-less response
1 parent 62855d4 commit deb61fa

File tree

2 files changed

+14
-16
lines changed

2 files changed

+14
-16
lines changed

tests/http_client.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,12 @@ class MinimalResponse(object): # Not for production use
2828
def __init__(self, requests_resp=None, status_code=None, text=None, headers=None):
2929
self.status_code = status_code or requests_resp.status_code
3030
self.text = text if text is not None else requests_resp.text
31-
self.headers = {} if headers is None else headers
31+
if headers:
32+
# Early versions of MSAL did not require http response to contain headers.
33+
# As of April 2025, some Azure Identity code paths still yield response without headers.
34+
# Here we mimic the behavior of header-less response by default,
35+
# so that test cases can cover header-less response scenarios.
36+
self.headers = headers
3237
self._raw_resp = requests_resp
3338

3439
def raise_for_status(self):

tests/test_throttled_http_client.py

+8-15
Original file line numberDiff line numberDiff line change
@@ -50,18 +50,6 @@ def close(self):
5050
raise CloseMethodCalled("Not used by MSAL, but our customers may use it")
5151

5252

53-
class DummyHttpClientWithoutResponseHeaders(DummyHttpClient):
54-
def post(self, url, params=None, data=None, headers=None, **kwargs):
55-
response = super().post(url, params, data, headers, **kwargs)
56-
del response.headers # Early versions of MSAL did not require http client to return headers
57-
return response
58-
59-
def get(self, url, params=None, headers=None, **kwargs):
60-
response = super().get(url, params, headers, **kwargs)
61-
del response.headers # Early versions of MSAL did not require http client to return headers
62-
return response
63-
64-
6553
class CloseMethodCalled(Exception):
6654
pass
6755

@@ -99,9 +87,14 @@ def assertValidResponse(self, response):
9987
self.assertCleanPickle(response)
10088

10189
def test_throttled_http_client_base_response_should_tolerate_headerless_response(self):
102-
http_client = ThrottledHttpClientBase(DummyHttpClientWithoutResponseHeaders(
103-
status_code=200, response_text="foo"))
104-
response = http_client.post("https://example.com")
90+
# MSAL Python 1.32.1 had a regression that caused it to require headers in the response.
91+
# This was fixed in 1.32.2
92+
# https://github.com/AzureAD/microsoft-authentication-library-for-python/compare/1.32.1...1.32.2
93+
# This test case is to ensure that we can tolerate headerless response.
94+
http_client = DummyHttpClient(status_code=200, response_text="foo")
95+
raw_response = http_client.post("https://example.com")
96+
self.assertFalse(hasattr(raw_response, "headers"), "Should not contain headers")
97+
response = ThrottledHttpClientBase(http_client).post("https://example.com")
10598
self.assertEqual(response.text, "foo", "Should return the same response text")
10699

107100
def test_throttled_http_client_base_response_should_not_contain_signature(self):

0 commit comments

Comments
 (0)