From 03893d9b7fffb4c679f9e104c29c8fb1d9cc9ec6 Mon Sep 17 00:00:00 2001 From: Andrew Jesaitis Date: Mon, 21 Jan 2013 16:34:11 -0700 Subject: [PATCH 1/2] Fixes repeated 401s when using DigestAuth with a session --- requests/auth.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requests/auth.py b/requests/auth.py index 277e6010..297a08db 100644 --- a/requests/auth.py +++ b/requests/auth.py @@ -139,8 +139,7 @@ class HTTPDigestAuth(AuthBase): def handle_401(self, r): """Takes the given response and tries digest-auth, if needed.""" - - num_401_calls = r.request.hooks['response'].count(self.handle_401) + num_401_calls = getattr(r.request, 'num_401_calls', 1) s_auth = r.headers.get('www-authenticate', '') if 'digest' in s_auth.lower() and num_401_calls < 2: @@ -153,6 +152,7 @@ class HTTPDigestAuth(AuthBase): r.raw.release_conn() r.request.headers['Authorization'] = self.build_digest_header(r.request.method, r.request.url) + r.request.num_401_calls = num_401_calls + 1 _r = r.connection.send(r.request) _r.history.append(r) From 34268b16c397682be38f4147aa181f3ebf112e42 Mon Sep 17 00:00:00 2001 From: Andrew Jesaitis Date: Wed, 23 Jan 2013 10:32:56 -0700 Subject: [PATCH 2/2] Moves num_401_calls counter to HTTPDigestAuth --- requests/auth.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/requests/auth.py b/requests/auth.py index 297a08db..ca0ce0d8 100644 --- a/requests/auth.py +++ b/requests/auth.py @@ -139,25 +139,27 @@ class HTTPDigestAuth(AuthBase): def handle_401(self, r): """Takes the given response and tries digest-auth, if needed.""" - num_401_calls = getattr(r.request, 'num_401_calls', 1) + + num_401_calls = getattr(self, 'num_401_calls', 1) s_auth = r.headers.get('www-authenticate', '') if 'digest' in s_auth.lower() and num_401_calls < 2: + setattr(self, 'num_401_calls', num_401_calls + 1) self.chal = parse_dict_header(s_auth.replace('Digest ', '')) # Consume content and release the original connection # to allow our new request to reuse the same one. r.content r.raw.release_conn() - + r.request.headers['Authorization'] = self.build_digest_header(r.request.method, r.request.url) - r.request.num_401_calls = num_401_calls + 1 _r = r.connection.send(r.request) _r.history.append(r) return _r + setattr(self, 'num_401_calls', 1) return r def __call__(self, r):