Mercurial > bitten > bitten-test
comparison bitten/util/compat.py @ 895:7d93d6358fe0
Use our own HTTPBasicAuthHandler under Python 2.6 to avoid issue http://bugs.python.org/issue8797. Fixes #658.
author | hodgestar |
---|---|
date | Wed, 09 Mar 2011 14:48:35 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
893:ed77e3e1c43f | 895:7d93d6358fe0 |
---|---|
1 # -*- coding: utf-8 -*- | |
2 # | |
3 # Copyright (C) 2011 Edgewall Software | |
4 # All rights reserved. | |
5 # | |
6 # This software is licensed as described in the file COPYING, which | |
7 # you should have received as part of this distribution. The terms | |
8 # are also available at http://bitten.edgewall.org/wiki/License. | |
9 | |
10 """Compatibility fixes for external libraries and Python.""" | |
11 | |
12 import sys | |
13 | |
14 # Fix for issue http://bugs.python.org/issue8797 in Python 2.6 | |
15 | |
16 if sys.version_info[:2] == (2, 6): | |
17 import urllib2 | |
18 import base64 | |
19 | |
20 class HTTPBasicAuthHandler(urllib2.HTTPBasicAuthHandler): | |
21 """Patched version of Python 2.6's HTTPBasicAuthHandler. | |
22 | |
23 The fix for [1]_ introduced an infinite recursion bug [2]_ into | |
24 Python 2.6.x that is triggered by attempting to connect using | |
25 Basic authentication with a bad username and/or password. This | |
26 class fixes the problem using the simple solution outlined in [3]_. | |
27 | |
28 .. [1] http://bugs.python.org/issue3819 | |
29 .. [2] http://bugs.python.org/issue8797 | |
30 .. [3] http://bugs.python.org/issue8797#msg126657 | |
31 """ | |
32 | |
33 def retry_http_basic_auth(self, host, req, realm): | |
34 user, pw = self.passwd.find_user_password(realm, host) | |
35 if pw is not None: | |
36 raw = "%s:%s" % (user, pw) | |
37 auth = 'Basic %s' % base64.b64encode(raw).strip() | |
38 if req.get_header(self.auth_header, None) == auth: | |
39 return None | |
40 req.add_unredirected_header(self.auth_header, auth) | |
41 return self.parent.open(req, timeout=req.timeout) | |
42 else: | |
43 return None | |
44 | |
45 else: | |
46 from urllib2 import HTTPBasicAuthHandler |