30
30
31
31
if compat .PY3 :
32
32
from urllib .request import urlopen , pathname2url
33
- _urlopen = urlopen
34
33
from urllib .parse import urlparse as parse_url
35
34
from urllib .parse import (uses_relative , uses_netloc , uses_params ,
36
35
urlencode , urljoin )
37
36
from urllib .error import URLError
38
37
from http .client import HTTPException # noqa
39
38
else :
40
- from urllib2 import urlopen as _urlopen
39
+ from urllib2 import urlopen as urlopen2
41
40
from urllib import urlencode , pathname2url # noqa
42
41
from urlparse import urlparse as parse_url
43
42
from urlparse import uses_relative , uses_netloc , uses_params , urljoin
46
45
from contextlib import contextmanager , closing # noqa
47
46
from functools import wraps # noqa
48
47
49
- # @wraps(_urlopen )
48
+ # @wraps(urlopen2 )
50
49
@contextmanager
51
50
def urlopen (* args , ** kwargs ):
52
- with closing (_urlopen (* args , ** kwargs )) as f :
51
+ with closing (urlopen2 (* args , ** kwargs )) as f :
53
52
yield f
54
53
55
54
@@ -91,6 +90,34 @@ def _is_url(url):
91
90
return False
92
91
93
92
93
+ def _urlopen (url , session = None ):
94
+ compression = None
95
+ content_encoding = None
96
+ try :
97
+ import requests
98
+ if session :
99
+ if not isinstance (session , requests .sessions .Session ):
100
+ raise ValueError (
101
+ 'Expected a requests.sessions.Session object, '
102
+ 'got {!r}' .format (session )
103
+ )
104
+ r = session .get (url )
105
+ else :
106
+ r = requests .get (url )
107
+ r .raise_for_status
108
+ content = r .content
109
+ except ImportError :
110
+ r = urlopen (url )
111
+ content = r .read ()
112
+ content_encoding = r .headers .get ('Content-Encoding' , None )
113
+ r .close ()
114
+ if content_encoding == 'gzip' :
115
+ # Override compression based on Content-Encoding header.
116
+ compression = 'gzip'
117
+ reader = BytesIO (content )
118
+ return reader , compression
119
+
120
+
94
121
def _expand_user (filepath_or_buffer ):
95
122
"""Return the argument with an initial component of ~ or ~user
96
123
replaced by that user's home directory.
@@ -177,7 +204,7 @@ def is_gcs_url(url):
177
204
178
205
179
206
def get_filepath_or_buffer (filepath_or_buffer , encoding = None ,
180
- compression = None , mode = None ):
207
+ compression = None , mode = None , session = None ):
181
208
"""
182
209
If the filepath_or_buffer is a url, translate and return the buffer.
183
210
Otherwise passthrough.
@@ -199,13 +226,7 @@ def get_filepath_or_buffer(filepath_or_buffer, encoding=None,
199
226
filepath_or_buffer = _stringify_path (filepath_or_buffer )
200
227
201
228
if _is_url (filepath_or_buffer ):
202
- req = _urlopen (filepath_or_buffer )
203
- content_encoding = req .headers .get ('Content-Encoding' , None )
204
- if content_encoding == 'gzip' :
205
- # Override compression based on Content-Encoding header
206
- compression = 'gzip'
207
- reader = BytesIO (req .read ())
208
- req .close ()
229
+ reader , compression = _urlopen (filepath_or_buffer , session = session )
209
230
return reader , encoding , compression , True
210
231
211
232
if is_s3_url (filepath_or_buffer ):
0 commit comments