31
31
32
32
if compat .PY3 :
33
33
from urllib .request import urlopen , pathname2url
34
- _urlopen = urlopen
35
34
from urllib .parse import urlparse as parse_url
36
35
from urllib .parse import (uses_relative , uses_netloc , uses_params ,
37
36
urlencode , urljoin )
38
37
from urllib .error import URLError
39
38
from http .client import HTTPException # noqa
40
39
else :
41
- from urllib2 import urlopen as _urlopen
40
+ from urllib2 import urlopen as urlopen2
42
41
from urllib import urlencode , pathname2url # noqa
43
42
from urlparse import urlparse as parse_url
44
43
from urlparse import uses_relative , uses_netloc , uses_params , urljoin
47
46
from contextlib import contextmanager , closing # noqa
48
47
from functools import wraps # noqa
49
48
50
- # @wraps(_urlopen )
49
+ # @wraps(urlopen2 )
51
50
@contextmanager
52
51
def urlopen (* args , ** kwargs ):
53
- with closing (_urlopen (* args , ** kwargs )) as f :
52
+ with closing (urlopen2 (* args , ** kwargs )) as f :
54
53
yield f
55
54
56
55
@@ -92,6 +91,34 @@ def _is_url(url):
92
91
return False
93
92
94
93
94
+ def _urlopen (url , session = None ):
95
+ compression = None
96
+ content_encoding = None
97
+ try :
98
+ import requests
99
+ if session :
100
+ if not isinstance (session , requests .sessions .Session ):
101
+ raise ValueError (
102
+ 'Expected a requests.sessions.Session object, '
103
+ 'got {!r}' .format (session )
104
+ )
105
+ r = session .get (url )
106
+ else :
107
+ r = requests .get (url )
108
+ r .raise_for_status
109
+ content = r .content
110
+ except ImportError :
111
+ r = urlopen (url )
112
+ content = r .read ()
113
+ content_encoding = r .headers .get ('Content-Encoding' , None )
114
+ r .close ()
115
+ if content_encoding == 'gzip' :
116
+ # Override compression based on Content-Encoding header.
117
+ compression = 'gzip'
118
+ reader = BytesIO (content )
119
+ return reader , compression
120
+
121
+
95
122
def _expand_user (filepath_or_buffer ):
96
123
"""Return the argument with an initial component of ~ or ~user
97
124
replaced by that user's home directory.
@@ -170,7 +197,7 @@ def is_s3_url(url):
170
197
171
198
172
199
def get_filepath_or_buffer (filepath_or_buffer , encoding = None ,
173
- compression = None , mode = None ):
200
+ compression = None , mode = None , session = None ):
174
201
"""
175
202
If the filepath_or_buffer is a url, translate and return the buffer.
176
203
Otherwise passthrough.
@@ -192,13 +219,7 @@ def get_filepath_or_buffer(filepath_or_buffer, encoding=None,
192
219
filepath_or_buffer = _stringify_path (filepath_or_buffer )
193
220
194
221
if _is_url (filepath_or_buffer ):
195
- req = _urlopen (filepath_or_buffer )
196
- content_encoding = req .headers .get ('Content-Encoding' , None )
197
- if content_encoding == 'gzip' :
198
- # Override compression based on Content-Encoding header
199
- compression = 'gzip'
200
- reader = BytesIO (req .read ())
201
- req .close ()
222
+ reader , compression = _urlopen (filepath_or_buffer , session = session )
202
223
return reader , encoding , compression , True
203
224
204
225
if is_s3_url (filepath_or_buffer ):
0 commit comments