Skip to content

Commit 99fa7be

Browse files
committed
Update urllib3 to 1.19
1 parent e2408fc commit 99fa7be

File tree

21 files changed

+723
-260
lines changed

21 files changed

+723
-260
lines changed

requests/packages/urllib3/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def emit(self, record):
3232

3333
__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)'
3434
__license__ = 'MIT'
35-
__version__ = '1.16'
35+
__version__ = '1.19'
3636

3737
__all__ = (
3838
'HTTPConnectionPool',

requests/packages/urllib3/connection.py

Lines changed: 62 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,8 @@
77
from socket import error as SocketError, timeout as SocketTimeout
88
import warnings
99
from .packages import six
10-
11-
try: # Python 3
12-
from http.client import HTTPConnection as _HTTPConnection
13-
from http.client import HTTPException # noqa: unused in this module
14-
except ImportError:
15-
from httplib import HTTPConnection as _HTTPConnection
16-
from httplib import HTTPException # noqa: unused in this module
10+
from .packages.six.moves.http_client import HTTPConnection as _HTTPConnection
11+
from .packages.six.moves.http_client import HTTPException # noqa: F401
1712

1813
try: # Compiled with SSL?
1914
import ssl
@@ -44,8 +39,9 @@ class ConnectionError(Exception):
4439
from .util.ssl_ import (
4540
resolve_cert_reqs,
4641
resolve_ssl_version,
47-
ssl_wrap_socket,
4842
assert_fingerprint,
43+
create_urllib3_context,
44+
ssl_wrap_socket
4945
)
5046

5147

@@ -174,7 +170,13 @@ def request_chunked(self, method, url, body=None, headers=None):
174170
"""
175171
headers = HTTPHeaderDict(headers if headers is not None else {})
176172
skip_accept_encoding = 'accept-encoding' in headers
177-
self.putrequest(method, url, skip_accept_encoding=skip_accept_encoding)
173+
skip_host = 'host' in headers
174+
self.putrequest(
175+
method,
176+
url,
177+
skip_accept_encoding=skip_accept_encoding,
178+
skip_host=skip_host
179+
)
178180
for header, value in headers.items():
179181
self.putheader(header, value)
180182
if 'transfer-encoding' not in headers:
@@ -203,14 +205,18 @@ def request_chunked(self, method, url, body=None, headers=None):
203205
class HTTPSConnection(HTTPConnection):
204206
default_port = port_by_scheme['https']
205207

208+
ssl_version = None
209+
206210
def __init__(self, host, port=None, key_file=None, cert_file=None,
207-
strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, **kw):
211+
strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
212+
ssl_context=None, **kw):
208213

209214
HTTPConnection.__init__(self, host, port, strict=strict,
210215
timeout=timeout, **kw)
211216

212217
self.key_file = key_file
213218
self.cert_file = cert_file
219+
self.ssl_context = ssl_context
214220

215221
# Required property for Google AppEngine 1.9.0 which otherwise causes
216222
# HTTPS requests to go out as HTTP. (See Issue #356)
@@ -219,7 +225,19 @@ def __init__(self, host, port=None, key_file=None, cert_file=None,
219225
def connect(self):
220226
conn = self._new_conn()
221227
self._prepare_conn(conn)
222-
self.sock = ssl.wrap_socket(conn, self.key_file, self.cert_file)
228+
229+
if self.ssl_context is None:
230+
self.ssl_context = create_urllib3_context(
231+
ssl_version=resolve_ssl_version(None),
232+
cert_reqs=resolve_cert_reqs(None),
233+
)
234+
235+
self.sock = ssl_wrap_socket(
236+
sock=conn,
237+
keyfile=self.key_file,
238+
certfile=self.cert_file,
239+
ssl_context=self.ssl_context,
240+
)
223241

224242

225243
class VerifiedHTTPSConnection(HTTPSConnection):
@@ -237,9 +255,18 @@ def set_cert(self, key_file=None, cert_file=None,
237255
cert_reqs=None, ca_certs=None,
238256
assert_hostname=None, assert_fingerprint=None,
239257
ca_cert_dir=None):
240-
241-
if (ca_certs or ca_cert_dir) and cert_reqs is None:
242-
cert_reqs = 'CERT_REQUIRED'
258+
"""
259+
This method should only be called once, before the connection is used.
260+
"""
261+
# If cert_reqs is not provided, we can try to guess. If the user gave
262+
# us a cert database, we assume they want to use it: otherwise, if
263+
# they gave us an SSL Context object we should use whatever is set for
264+
# it.
265+
if cert_reqs is None:
266+
if ca_certs or ca_cert_dir:
267+
cert_reqs = 'CERT_REQUIRED'
268+
elif self.ssl_context is not None:
269+
cert_reqs = self.ssl_context.verify_mode
243270

244271
self.key_file = key_file
245272
self.cert_file = cert_file
@@ -253,9 +280,6 @@ def connect(self):
253280
# Add certificate verification
254281
conn = self._new_conn()
255282

256-
resolved_cert_reqs = resolve_cert_reqs(self.cert_reqs)
257-
resolved_ssl_version = resolve_ssl_version(self.ssl_version)
258-
259283
hostname = self.host
260284
if getattr(self, '_tunnel_host', None):
261285
# _tunnel_host was added in Python 2.6.3
@@ -281,17 +305,27 @@ def connect(self):
281305

282306
# Wrap socket using verification with the root certs in
283307
# trusted_root_certs
284-
self.sock = ssl_wrap_socket(conn, self.key_file, self.cert_file,
285-
cert_reqs=resolved_cert_reqs,
286-
ca_certs=self.ca_certs,
287-
ca_cert_dir=self.ca_cert_dir,
288-
server_hostname=hostname,
289-
ssl_version=resolved_ssl_version)
308+
if self.ssl_context is None:
309+
self.ssl_context = create_urllib3_context(
310+
ssl_version=resolve_ssl_version(self.ssl_version),
311+
cert_reqs=resolve_cert_reqs(self.cert_reqs),
312+
)
313+
314+
context = self.ssl_context
315+
context.verify_mode = resolve_cert_reqs(self.cert_reqs)
316+
self.sock = ssl_wrap_socket(
317+
sock=conn,
318+
keyfile=self.key_file,
319+
certfile=self.cert_file,
320+
ca_certs=self.ca_certs,
321+
ca_cert_dir=self.ca_cert_dir,
322+
server_hostname=hostname,
323+
ssl_context=context)
290324

291325
if self.assert_fingerprint:
292326
assert_fingerprint(self.sock.getpeercert(binary_form=True),
293327
self.assert_fingerprint)
294-
elif resolved_cert_reqs != ssl.CERT_NONE \
328+
elif context.verify_mode != ssl.CERT_NONE \
295329
and self.assert_hostname is not False:
296330
cert = self.sock.getpeercert()
297331
if not cert.get('subjectAltName', ()):
@@ -304,8 +338,10 @@ def connect(self):
304338
)
305339
_match_hostname(cert, self.assert_hostname or hostname)
306340

307-
self.is_verified = (resolved_cert_reqs == ssl.CERT_REQUIRED or
308-
self.assert_fingerprint is not None)
341+
self.is_verified = (
342+
context.verify_mode == ssl.CERT_REQUIRED or
343+
self.assert_fingerprint is not None
344+
)
309345

310346

311347
def _match_hostname(cert, asserted_hostname):

requests/packages/urllib3/connectionpool.py

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,6 @@
77
from socket import error as SocketError, timeout as SocketTimeout
88
import socket
99

10-
try: # Python 3
11-
from queue import LifoQueue, Empty, Full
12-
except ImportError:
13-
from Queue import LifoQueue, Empty, Full
14-
# Queue is imported for side effects on MS Windows
15-
import Queue as _unused_module_Queue # noqa: unused
16-
1710

1811
from .exceptions import (
1912
ClosedPoolError,
@@ -32,6 +25,7 @@
3225
)
3326
from .packages.ssl_match_hostname import CertificateError
3427
from .packages import six
28+
from .packages.six.moves.queue import LifoQueue, Empty, Full
3529
from .connection import (
3630
port_by_scheme,
3731
DummyConnection,
@@ -48,6 +42,10 @@
4842
from .util.url import get_host, Url
4943

5044

45+
if six.PY2:
46+
# Queue is imported for side effects on MS Windows
47+
import Queue as _unused_module_Queue # noqa: F401
48+
5149
xrange = six.moves.xrange
5250

5351
log = logging.getLogger(__name__)
@@ -210,8 +208,8 @@ def _new_conn(self):
210208
Return a fresh :class:`HTTPConnection`.
211209
"""
212210
self.num_connections += 1
213-
log.info("Starting new HTTP connection (%d): %s",
214-
self.num_connections, self.host)
211+
log.debug("Starting new HTTP connection (%d): %s",
212+
self.num_connections, self.host)
215213

216214
conn = self.ConnectionCls(host=self.host, port=self.port,
217215
timeout=self.timeout.connect_timeout,
@@ -246,7 +244,7 @@ def _get_conn(self, timeout=None):
246244

247245
# If this is a persistent connection, check if it got disconnected
248246
if conn and is_connection_dropped(conn):
249-
log.info("Resetting dropped connection: %s", self.host)
247+
log.debug("Resetting dropped connection: %s", self.host)
250248
conn.close()
251249
if getattr(conn, 'auto_open', 1) == 0:
252250
# This is a proxied connection that has been mutated by
@@ -397,8 +395,9 @@ def _make_request(self, conn, method, url, timeout=_Default, chunked=False,
397395

398396
# AppEngine doesn't have a version attr.
399397
http_version = getattr(conn, '_http_vsn_str', 'HTTP/?')
400-
log.debug("\"%s %s %s\" %s %s", method, url, http_version,
401-
httplib_response.status, httplib_response.length)
398+
log.debug("%s://%s:%s \"%s %s %s\" %s %s", self.scheme, self.host, self.port,
399+
method, url, http_version, httplib_response.status,
400+
httplib_response.length)
402401

403402
try:
404403
assert_header_parsing(httplib_response.msg)
@@ -600,10 +599,14 @@ def urlopen(self, method, url, body=None, headers=None, retries=None,
600599
# mess.
601600
response_conn = conn if not release_conn else None
602601

602+
# Pass method to Response for length checking
603+
response_kw['request_method'] = method
604+
603605
# Import httplib's response into our own wrapper object
604606
response = self.ResponseCls.from_httplib(httplib_response,
605607
pool=self,
606608
connection=response_conn,
609+
retries=retries,
607610
**response_kw)
608611

609612
# Everything went great!
@@ -683,7 +686,8 @@ def urlopen(self, method, url, body=None, headers=None, retries=None,
683686
raise
684687
return response
685688

686-
log.info("Redirecting %s -> %s", url, redirect_location)
689+
retries.sleep_for_retry(response)
690+
log.debug("Redirecting %s -> %s", url, redirect_location)
687691
return self.urlopen(
688692
method, redirect_location, body, headers,
689693
retries=retries, redirect=redirect,
@@ -692,7 +696,8 @@ def urlopen(self, method, url, body=None, headers=None, retries=None,
692696
release_conn=release_conn, **response_kw)
693697

694698
# Check if we should retry the HTTP response.
695-
if retries.is_forced_retry(method, status_code=response.status):
699+
has_retry_after = bool(response.getheader('Retry-After'))
700+
if retries.is_retry(method, response.status, has_retry_after):
696701
try:
697702
retries = retries.increment(method, url, response=response, _pool=self)
698703
except MaxRetryError:
@@ -702,8 +707,8 @@ def urlopen(self, method, url, body=None, headers=None, retries=None,
702707
response.release_conn()
703708
raise
704709
return response
705-
retries.sleep()
706-
log.info("Forced retry: %s", url)
710+
retries.sleep(response)
711+
log.debug("Retry: %s", url)
707712
return self.urlopen(
708713
method, url, body, headers,
709714
retries=retries, redirect=redirect,
@@ -775,7 +780,6 @@ def _prepare_conn(self, conn):
775780
assert_hostname=self.assert_hostname,
776781
assert_fingerprint=self.assert_fingerprint)
777782
conn.ssl_version = self.ssl_version
778-
779783
return conn
780784

781785
def _prepare_proxy(self, conn):
@@ -801,8 +805,8 @@ def _new_conn(self):
801805
Return a fresh :class:`httplib.HTTPSConnection`.
802806
"""
803807
self.num_connections += 1
804-
log.info("Starting new HTTPS connection (%d): %s",
805-
self.num_connections, self.host)
808+
log.debug("Starting new HTTPS connection (%d): %s",
809+
self.num_connections, self.host)
806810

807811
if not self.ConnectionCls or self.ConnectionCls is DummyConnection:
808812
raise SSLError("Can't connect to HTTPS URL because the SSL "
@@ -834,7 +838,8 @@ def _validate_conn(self, conn):
834838
warnings.warn((
835839
'Unverified HTTPS request is being made. '
836840
'Adding certificate verification is strongly advised. See: '
837-
'https://urllib3.readthedocs.io/en/latest/security.html'),
841+
'https://urllib3.readthedocs.io/en/latest/advanced-usage.html'
842+
'#ssl-warnings'),
838843
InsecureRequestWarning)
839844

840845

0 commit comments

Comments
 (0)