diff options
| author | Senthil Kumaran <orsenthil@gmail.com> | 2009-05-24 09:14:50 (GMT) | 
|---|---|---|
| committer | Senthil Kumaran <orsenthil@gmail.com> | 2009-05-24 09:14:50 (GMT) | 
| commit | e266f25cf1f9ad28409f4c11c40595fb25f555da (patch) | |
| tree | f6a44ac991861418765056f676d17bcf2520d7a1 /Lib/httplib.py | |
| parent | 655d835415800085cddbacecfc8a22111d70a5ef (diff) | |
| download | cpython-e266f25cf1f9ad28409f4c11c40595fb25f555da.zip cpython-e266f25cf1f9ad28409f4c11c40595fb25f555da.tar.gz cpython-e266f25cf1f9ad28409f4c11c40595fb25f555da.tar.bz2  | |
Fixed Issue1424152, urllib2 fails with HTTPS over Proxy.
Diffstat (limited to 'Lib/httplib.py')
| -rw-r--r-- | Lib/httplib.py | 29 | 
1 files changed, 29 insertions, 0 deletions
diff --git a/Lib/httplib.py b/Lib/httplib.py index 2e749ea..6fc5733 100644 --- a/Lib/httplib.py +++ b/Lib/httplib.py @@ -662,11 +662,18 @@ class HTTPConnection:          self.__response = None          self.__state = _CS_IDLE          self._method = None +        self._tunnel_host = None +        self._tunnel_port = None          self._set_hostport(host, port)          if strict is not None:              self.strict = strict +    def set_tunnel(self, host, port=None): +        """ Sets up the host and the port for the HTTP CONNECT Tunnelling.""" +        self._tunnel_host = host +        self._tunnel_port = port +      def _set_hostport(self, host, port):          if port is None:              i = host.rfind(':') @@ -687,11 +694,30 @@ class HTTPConnection:      def set_debuglevel(self, level):          self.debuglevel = level +    def _tunnel(self): +        self._set_hostport(self._tunnel_host, self._tunnel_port) +        self.send("CONNECT %s:%d HTTP/1.0\r\n\r\n" % (self.host, self.port)) +        response = self.response_class(self.sock, strict = self.strict, +                                       method = self._method) +        (version, code, message) = response._read_status() + +        if code != 200: +            self.close() +            raise socket.error, "Tunnel connection failed: %d %s" % (code, +                                                                     message.strip()) +        while True: +            line = response.fp.readline() +            if line == '\r\n': break + +      def connect(self):          """Connect to the host and port specified in __init__."""          self.sock = socket.create_connection((self.host,self.port),                                               self.timeout) +        if self._tunnel_host: +            self._tunnel() +      def close(self):          """Close the connection to the HTTP server."""          if self.sock: @@ -1101,6 +1127,9 @@ else:              "Connect to a host on a given (SSL) port."              sock = socket.create_connection((self.host, self.port), self.timeout) +            if self._tunnel_host: +                self.sock = sock +                self._tunnel()              self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file)      __all__.append("HTTPSConnection")  | 
