From: Pierre Chapuis Date: Thu, 12 Apr 2012 14:33:15 +0000 (+0200) Subject: Fix infinite loop on wrong Digest Authentication X-Git-Tag: v0.12.0~51^2~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c3e6c41fc164d4348f8ce197bd0075aff05637af;p=services%2Fpython-requests.git Fix infinite loop on wrong Digest Authentication --- diff --git a/requests/auth.py b/requests/auth.py index 4fc338c..353180a 100644 --- a/requests/auth.py +++ b/requests/auth.py @@ -56,6 +56,8 @@ class HTTPDigestAuth(AuthBase): def handle_401(self, r): """Takes the given response and tries digest-auth, if needed.""" + r.request.deregister_hook('response', self.handle_401) + s_auth = r.headers.get('www-authenticate', '') if 'digest' in s_auth.lower(): diff --git a/requests/models.py b/requests/models.py index e117cb0..402adb6 100644 --- a/requests/models.py +++ b/requests/models.py @@ -408,7 +408,18 @@ class Request(object): def register_hook(self, event, hook): """Properly register a hook.""" - return self.hooks[event].append(hook) + self.hooks[event].append(hook) + + def deregister_hook(self,event,hook): + """Deregister a previously registered hook. + Returns True if the hook existed, False if not. + """ + + try: + self.hooks[event].remove(hook) + return True + except ValueError: + return False def send(self, anyway=False, prefetch=False): """Sends the request. Returns True of successful, False if not. diff --git a/tests/test_requests.py b/tests/test_requests.py index 7ca30ba..45497ac 100755 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -272,6 +272,20 @@ class RequestsTestSuite(TestSetup, unittest.TestCase): r = get(url, session=s) self.assertEqual(r.status_code, 200) + def test_DIGESTAUTH_WRONG_HTTP_401_GET(self): + + for service in SERVICES: + + auth = HTTPDigestAuth('user', 'wrongpass') + url = service('digest-auth', 'auth', 'user', 'pass') + + r = get(url, auth=auth) + self.assertEqual(r.status_code, 401) + + s = requests.session(auth=auth) + r = get(url, session=s) + self.assertEqual(r.status_code, 401) + def test_POSTBIN_GET_POST_FILES(self): for service in SERVICES: