From 9b59e02374ab2d6de481bbd2d9f100ff3275c4ba Mon Sep 17 00:00:00 2001 From: Kevin McCarthy Date: Sat, 27 May 2017 15:11:06 -1000 Subject: [PATCH] Fix compat with requests 2.16 (unvendored urllib3) The new version of requests un-vendors urllib3, with a nifty hack: https://github.com/kennethreitz/requests/blob/master/requests/packages.py Unfortunately messing directly with sys.modules causes some weird behavior that I don't entirely understand. Avoiding the extra import to requests.packages as part of VCR's initialization seems to sidestep the issue. Closes #311 --- vcr/patch.py | 37 +++++++++++++++++++++---------------- vcr/stubs/requests_stubs.py | 4 ++-- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/vcr/patch.py b/vcr/patch.py index ada3c92..e61b153 100644 --- a/vcr/patch.py +++ b/vcr/patch.py @@ -12,16 +12,6 @@ _HTTPConnection = httplib.HTTPConnection _HTTPSConnection = httplib.HTTPSConnection -# Try to save the original types for requests -try: - import requests.packages.urllib3.connectionpool as cpool -except ImportError: # pragma: no cover - pass -else: - _VerifiedHTTPSConnection = cpool.VerifiedHTTPSConnection - _cpoolHTTPConnection = cpool.HTTPConnection - _cpoolHTTPSConnection = cpool.HTTPSConnection - # Try to save the original types for boto3 try: import botocore.vendored.requests.packages.urllib3.connectionpool as cpool @@ -32,14 +22,30 @@ else: _cpoolBoto3HTTPConnection = cpool.HTTPConnection _cpoolBoto3HTTPSConnection = cpool.HTTPSConnection - +cpool = None # Try to save the original types for urllib3 try: - import urllib3 + import urllib3.connectionpool as cpool except ImportError: # pragma: no cover pass else: - _VerifiedHTTPSConnection = urllib3.connectionpool.VerifiedHTTPSConnection + _VerifiedHTTPSConnection = cpool.VerifiedHTTPSConnection + _cpoolHTTPConnection = cpool.HTTPConnection + _cpoolHTTPSConnection = cpool.HTTPSConnection + +# Try to save the original types for requests +try: + if not cpool: + import requests.packages.urllib3.connectionpool as cpool +except ImportError: # pragma: no cover + pass +else: + _VerifiedHTTPSConnection = cpool.VerifiedHTTPSConnection + _cpoolHTTPConnection = cpool.HTTPConnection + _cpoolHTTPSConnection = cpool.HTTPSConnection + + + # Try to save the original types for httplib2 @@ -176,10 +182,9 @@ class CassettePatcherBuilder(object): def _requests(self): try: - import requests.packages.urllib3.connectionpool as cpool - except ImportError: # pragma: no cover + from .stubs import requests_stubs + except ImportError: # pragma: no cover return () - from .stubs import requests_stubs return self._urllib3_patchers(cpool, requests_stubs) def _boto3(self): diff --git a/vcr/stubs/requests_stubs.py b/vcr/stubs/requests_stubs.py index 8cae533..4aa2c82 100644 --- a/vcr/stubs/requests_stubs.py +++ b/vcr/stubs/requests_stubs.py @@ -1,9 +1,9 @@ '''Stubs for requests''' try: - from requests.packages.urllib3.connectionpool import HTTPConnection, VerifiedHTTPSConnection -except ImportError: from urllib3.connectionpool import HTTPConnection, VerifiedHTTPSConnection +except ImportError: + from requests.packages.urllib3.connectionpool import HTTPConnection, VerifiedHTTPSConnection from ..stubs import VCRHTTPConnection, VCRHTTPSConnection