11
11
DEVICE_AUTH_GRANT = "urn:ietf:params:oauth:grant-type:device_code"
12
12
13
13
14
+ def _get_headers (response ):
15
+ # MSAL's HttpResponse did not have headers until 1.23.0
16
+ # https://github.com/AzureAD/microsoft-authentication-library-for-python/pull/581/files#diff-28866b706bc3830cd20485685f20fe79d45b58dce7050e68032e9d9372d68654R61
17
+ # This helper ensures graceful degradation to {} without exception
18
+ return getattr (response , "headers" , {})
19
+
20
+
14
21
class RetryAfterParser (object ):
15
22
FIELD_NAME_LOWER = "Retry-After" .lower ()
16
23
def __init__ (self , default_value = None ):
@@ -19,9 +26,7 @@ def __init__(self, default_value=None):
19
26
def parse (self , * , result , ** ignored ):
20
27
"""Return seconds to throttle"""
21
28
response = result
22
- lowercase_headers = {k .lower (): v for k , v in getattr (
23
- # Historically, MSAL's HttpResponse does not always have headers
24
- response , "headers" , {}).items ()}
29
+ lowercase_headers = {k .lower (): v for k , v in _get_headers (response ).items ()}
25
30
if not (response .status_code == 429 or response .status_code >= 500
26
31
or self .FIELD_NAME_LOWER in lowercase_headers ):
27
32
return 0 # Quick exit
@@ -49,7 +54,7 @@ def __init__(self, raw_response):
49
54
self .status_code = raw_response .status_code
50
55
self .text = raw_response .text
51
56
self .headers = { # Only keep the headers which ThrottledHttpClient cares about
52
- k : v for k , v in raw_response . headers .items ()
57
+ k : v for k , v in _get_headers ( raw_response ) .items ()
53
58
if k .lower () == RetryAfterParser .FIELD_NAME_LOWER
54
59
}
55
60
@@ -153,7 +158,7 @@ def __init__(self, *args, default_throttle_time=None, **kwargs):
153
158
and kwargs ["data" ].get ("grant_type" ) == DEVICE_AUTH_GRANT
154
159
)
155
160
and RetryAfterParser .FIELD_NAME_LOWER not in set ( # Otherwise leave it to the Retry-After decorator
156
- h .lower () for h in getattr (result , "headers" , {}). keys ( ))
161
+ h .lower () for h in _get_headers (result ))
157
162
else 0 ,
158
163
)(self .post )
159
164
0 commit comments