Edgewall Software
close Warning: No coverage annotation found for /trunk/bitten/util/compat.py for revision range [1001:1001].

source: trunk/bitten/util/compat.py @ 1001

Last change on this file since 1001 was 974, checked in by hodgestar, 13 years ago

Use our own HTTPBasicAuthHandler under Python 2.6 to avoid issue http://bugs.python.org/issue8797. Fixes #658.

File size: 1.7 KB
CovLine 
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
12import sys
13
14# Fix for issue http://bugs.python.org/issue8797 in Python 2.6
15
16if 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
45else:
46    from urllib2 import HTTPBasicAuthHandler
Note: See TracBrowser for help on using the repository browser.