changeset 4226:fffacca46f09

Work around a urllib2 bug in Python < 2.4.2 When urllib2 base64-encodes the password needed for the Proxy-authorization header, it forgets to remove the trailing "\n". Later, a "\r\n" sequence is appended to every header, as required by the standard. Some proxies interpret the resulting "\n\r\n" sequence in the same way as "\r\n\r\n": end of headers. This usually doesn't cause trouble for this request, but when the proxy tries to read the next one, it thinks the request starts with some garbage and returns a "400 - Bad Request" error.
author Alexis S. L. Carvalho <alexis@cecm.usp.br>
date Fri, 16 Mar 2007 00:22:53 -0300
parents 281f9f8f1bd4
children f5b9edf3390b
files mercurial/httprepo.py
diffstat 1 files changed, 9 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/httprepo.py	Fri Mar 16 00:22:52 2007 -0300
+++ b/mercurial/httprepo.py	Fri Mar 16 00:22:53 2007 -0300
@@ -76,6 +76,14 @@
         return userpass + '@' + hostport
     return hostport
 
+# work around a bug in Python < 2.4.2
+# (it leaves a "\n" at the end of Proxy-authorization headers)
+class request(urllib2.Request):
+    def add_header(self, key, val):
+        if key.lower() == 'proxy-authorization':
+            val = val.strip()
+        return urllib2.Request.add_header(self, key, val)
+
 class httpsendfile(file):
     def __len__(self):
         return os.fstat(self.fileno()).st_size
@@ -239,7 +247,7 @@
             if data:
                 self.ui.debug(_("sending %s bytes\n") %
                               headers.get('content-length', 'X'))
-            resp = urllib2.urlopen(urllib2.Request(cu, data, headers))
+            resp = urllib2.urlopen(request(cu, data, headers))
         except urllib2.HTTPError, inst:
             if inst.code == 401:
                 raise util.Abort(_('authorization failed'))