diff --git a/vcr/stubs/__init__.py b/vcr/stubs/__init__.py index 5ab819d..52b57f4 100644 --- a/vcr/stubs/__init__.py +++ b/vcr/stubs/__init__.py @@ -18,7 +18,7 @@ log = logging.getLogger(__name__) class VCRFakeSocket(object): """ A socket that doesn't do anything! - Used when playing back casssettes, when there + Used when playing back cassettes, when there is no actual open socket. """ @@ -36,6 +36,16 @@ class VCRFakeSocket(object): """ return 0 # wonder how bad this is.... + def __nonzero__(self): + """This is hacky too. + + urllib3 checks if sock is truthy before calling + set_tunnel (urllib3/connectionpool.py#L592). + If it is true, it never sets the tunnel and this + breaks proxy requests. + """ + return False + def parse_headers(header_list): """ @@ -130,7 +140,7 @@ class VCRConnection(object): """ Returns empty string for the default port and ':port' otherwise """ - port = self.real_connection.port + port = self._tunnel_port or self.real_connection.port default_port = {'https': 443, 'http': 80}[self._protocol] return ':{}'.format(port) if port != default_port else '' @@ -138,7 +148,7 @@ class VCRConnection(object): """Returns request absolute URI""" uri = "{}://{}{}{}".format( self._protocol, - self.real_connection.host, + self._tunnel_host or self.real_connection.host, self._port_postfix(), url, ) @@ -148,7 +158,7 @@ class VCRConnection(object): """Returns request selector url from absolute URI""" prefix = "{}://{}{}".format( self._protocol, - self.real_connection.host, + self._tunnel_host or self.real_connection.host, self._port_postfix(), ) return uri.replace(prefix, '', 1) @@ -313,6 +323,9 @@ class VCRConnection(object): with force_reset(): self.real_connection = self._baseclass(*args, **kwargs) + self._tunnel_host = None + self._tunnel_port = None + def __setattr__(self, name, value): """ We need to define this because any attributes that are set on the