]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
backport jhylton's checkin of
authorMichael W. Hudson <mwh@python.net>
Mon, 11 Mar 2002 10:06:36 +0000 (10:06 +0000)
committerMichael W. Hudson <mwh@python.net>
Mon, 11 Mar 2002 10:06:36 +0000 (10:06 +0000)
    revision 1.45 of httplib.py

SF bug report #405939: wrong Host header with proxy

In August, Greg said this looked good, so I'm going ahead with it.

The fix is different from the one in the bug report.  Instead of using
a regular expression to extract the host from the url, I use
urlparse.urlsplit.

Martin commented that the patch doesn't address URLs that have basic
authentication username and password in the header.  I don't see any
code anywhere in httplib that supports this feature, so I'm not going
to address it for this fix.

Bug fix candidate.

Lib/httplib.py

index 41bab824d0583bc5c108025e1e35eb050f9c277a..8daeb8963bc962759e6a36ace5ed8cdcd2822cf8 100644 (file)
@@ -69,6 +69,7 @@ Req-sent-unread-response       _CS_REQ_SENT       <response_class>
 import errno
 import mimetools
 import socket
+from urlparse import urlsplit
 
 try:
     from cStringIO import StringIO
@@ -467,9 +468,15 @@ class HTTPConnection:
             # themselves. we should NOT issue it twice; some web servers (such
             # as Apache) barf when they see two Host: headers
 
-            # if we need a non-standard port,include it in the header
-            if self.port == HTTP_PORT:
-                self.putheader('Host', self.host)
+            # If we need a non-standard port,include it in the header.
+            # If the request is going through a proxy, but the host of
+            # the actual URL, not the host of the proxy.
+
+            if url.startswith('http:'):
+                nil, netloc, nil, nil, nil = urlsplit(url)
+                self.putheader('Host', netloc)
+            elif self.port == HTTP_PORT:
+                self.putheader('Host', netloc)
             else:
                 self.putheader('Host', "%s:%s" % (self.host, self.port))
 
@@ -857,6 +864,17 @@ def test():
     print
     print h.getfile().read()
 
+    # minimal test that code to extract host from url works
+    class HTTP11(HTTP):
+        _http_vsn = 11
+        _http_vsn_str = 'HTTP/1.1'
+
+    h = HTTP11('www.python.org')
+    h.putrequest('GET', 'http://www.python.org/~jeremy/')
+    h.endheaders()
+    h.getreply()
+    h.close()
+
     if hasattr(socket, 'ssl'):
         host = 'sourceforge.net'
         selector = '/projects/python'