896
|
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
|