1111DEVICE_AUTH_GRANT = "urn:ietf:params:oauth:grant-type:device_code"
1212
1313
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+
1421class RetryAfterParser (object ):
1522 FIELD_NAME_LOWER = "Retry-After" .lower ()
1623 def __init__ (self , default_value = None ):
@@ -19,9 +26,7 @@ def __init__(self, default_value=None):
1926 def parse (self , * , result , ** ignored ):
2027 """Return seconds to throttle"""
2128 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 ()}
2530 if not (response .status_code == 429 or response .status_code >= 500
2631 or self .FIELD_NAME_LOWER in lowercase_headers ):
2732 return 0 # Quick exit
@@ -49,7 +54,7 @@ def __init__(self, raw_response):
4954 self .status_code = raw_response .status_code
5055 self .text = raw_response .text
5156 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 () # TODO
5358 if k .lower () == RetryAfterParser .FIELD_NAME_LOWER
5459 }
5560
@@ -153,7 +158,7 @@ def __init__(self, *args, default_throttle_time=None, **kwargs):
153158 and kwargs ["data" ].get ("grant_type" ) == DEVICE_AUTH_GRANT
154159 )
155160 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 ))
157162 else 0 ,
158163 )(self .post )
159164
0 commit comments