rigid 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/vendor/click/__init__.pyc +0 -0
- data/vendor/click/_bashcomplete.pyc +0 -0
- data/vendor/click/_compat.pyc +0 -0
- data/vendor/click/_termui_impl.pyc +0 -0
- data/vendor/click/_textwrap.pyc +0 -0
- data/vendor/click/_unicodefun.pyc +0 -0
- data/vendor/click/_winconsole.pyc +0 -0
- data/vendor/click/core.pyc +0 -0
- data/vendor/click/decorators.pyc +0 -0
- data/vendor/click/exceptions.pyc +0 -0
- data/vendor/click/formatting.pyc +0 -0
- data/vendor/click/globals.pyc +0 -0
- data/vendor/click/parser.pyc +0 -0
- data/vendor/click/termui.pyc +0 -0
- data/vendor/click/testing.pyc +0 -0
- data/vendor/click/types.pyc +0 -0
- data/vendor/click/utils.pyc +0 -0
- data/vendor/easy_install.pyc +0 -0
- data/vendor/pkg_resources/__init__.pyc +0 -0
- data/vendor/pkg_resources/_vendor/__init__.pyc +0 -0
- data/vendor/pkg_resources/_vendor/appdirs.pyc +0 -0
- data/vendor/pkg_resources/_vendor/packaging/__about__.pyc +0 -0
- data/vendor/pkg_resources/_vendor/packaging/__init__.pyc +0 -0
- data/vendor/pkg_resources/_vendor/packaging/_compat.pyc +0 -0
- data/vendor/pkg_resources/_vendor/packaging/_structures.pyc +0 -0
- data/vendor/pkg_resources/_vendor/packaging/markers.pyc +0 -0
- data/vendor/pkg_resources/_vendor/packaging/requirements.pyc +0 -0
- data/vendor/pkg_resources/_vendor/packaging/specifiers.pyc +0 -0
- data/vendor/pkg_resources/_vendor/packaging/utils.pyc +0 -0
- data/vendor/pkg_resources/_vendor/packaging/version.pyc +0 -0
- data/vendor/pkg_resources/_vendor/pyparsing.pyc +0 -0
- data/vendor/pkg_resources/_vendor/six.pyc +0 -0
- data/vendor/pkg_resources/extern/__init__.pyc +0 -0
- data/vendor/{requests-2.11.1.dist-info/METADATA → requests-2.12.1.dist-info/DESCRIPTION.rst} +51 -30
- data/vendor/{requests-2.11.1.dist-info → requests-2.12.1.dist-info}/INSTALLER +0 -0
- data/vendor/{requests-2.11.1.dist-info/DESCRIPTION.rst → requests-2.12.1.dist-info/METADATA} +80 -1
- data/vendor/{requests-2.11.1.dist-info → requests-2.12.1.dist-info}/RECORD +61 -41
- data/vendor/{requests-2.11.1.dist-info → requests-2.12.1.dist-info}/WHEEL +1 -1
- data/vendor/requests-2.12.1.dist-info/metadata.json +1 -0
- data/vendor/{requests-2.11.1.dist-info → requests-2.12.1.dist-info}/top_level.txt +0 -0
- data/vendor/requests/__init__.py +2 -2
- data/vendor/requests/__init__.pyc +0 -0
- data/vendor/requests/_internal_utils.py +27 -0
- data/vendor/requests/_internal_utils.pyc +0 -0
- data/vendor/requests/adapters.py +1 -1
- data/vendor/requests/adapters.pyc +0 -0
- data/vendor/requests/api.py +3 -1
- data/vendor/requests/api.pyc +0 -0
- data/vendor/requests/auth.py +2 -1
- data/vendor/requests/auth.pyc +0 -0
- data/vendor/requests/cacert.pem +448 -375
- data/vendor/requests/certs.pyc +0 -0
- data/vendor/requests/compat.py +2 -0
- data/vendor/requests/compat.pyc +0 -0
- data/vendor/requests/cookies.py +3 -1
- data/vendor/requests/cookies.pyc +0 -0
- data/vendor/requests/exceptions.py +2 -0
- data/vendor/requests/exceptions.pyc +0 -0
- data/vendor/requests/hooks.pyc +0 -0
- data/vendor/requests/models.py +53 -29
- data/vendor/requests/models.pyc +0 -0
- data/vendor/requests/packages/__init__.py +6 -0
- data/vendor/requests/packages/__init__.pyc +0 -0
- data/vendor/requests/packages/chardet/__init__.pyc +0 -0
- data/vendor/requests/packages/chardet/big5freq.pyc +0 -0
- data/vendor/requests/packages/chardet/big5prober.pyc +0 -0
- data/vendor/requests/packages/chardet/chardetect.pyc +0 -0
- data/vendor/requests/packages/chardet/chardistribution.pyc +0 -0
- data/vendor/requests/packages/chardet/charsetgroupprober.pyc +0 -0
- data/vendor/requests/packages/chardet/charsetprober.pyc +0 -0
- data/vendor/requests/packages/chardet/codingstatemachine.pyc +0 -0
- data/vendor/requests/packages/chardet/compat.pyc +0 -0
- data/vendor/requests/packages/chardet/constants.pyc +0 -0
- data/vendor/requests/packages/chardet/cp949prober.pyc +0 -0
- data/vendor/requests/packages/chardet/escprober.pyc +0 -0
- data/vendor/requests/packages/chardet/escsm.pyc +0 -0
- data/vendor/requests/packages/chardet/eucjpprober.pyc +0 -0
- data/vendor/requests/packages/chardet/euckrfreq.pyc +0 -0
- data/vendor/requests/packages/chardet/euckrprober.pyc +0 -0
- data/vendor/requests/packages/chardet/euctwfreq.pyc +0 -0
- data/vendor/requests/packages/chardet/euctwprober.pyc +0 -0
- data/vendor/requests/packages/chardet/gb2312freq.pyc +0 -0
- data/vendor/requests/packages/chardet/gb2312prober.pyc +0 -0
- data/vendor/requests/packages/chardet/hebrewprober.pyc +0 -0
- data/vendor/requests/packages/chardet/jisfreq.pyc +0 -0
- data/vendor/requests/packages/chardet/jpcntx.pyc +0 -0
- data/vendor/requests/packages/chardet/langbulgarianmodel.pyc +0 -0
- data/vendor/requests/packages/chardet/langcyrillicmodel.pyc +0 -0
- data/vendor/requests/packages/chardet/langgreekmodel.pyc +0 -0
- data/vendor/requests/packages/chardet/langhebrewmodel.pyc +0 -0
- data/vendor/requests/packages/chardet/langhungarianmodel.pyc +0 -0
- data/vendor/requests/packages/chardet/langthaimodel.pyc +0 -0
- data/vendor/requests/packages/chardet/latin1prober.pyc +0 -0
- data/vendor/requests/packages/chardet/mbcharsetprober.pyc +0 -0
- data/vendor/requests/packages/chardet/mbcsgroupprober.pyc +0 -0
- data/vendor/requests/packages/chardet/mbcssm.pyc +0 -0
- data/vendor/requests/packages/chardet/sbcharsetprober.pyc +0 -0
- data/vendor/requests/packages/chardet/sbcsgroupprober.pyc +0 -0
- data/vendor/requests/packages/chardet/sjisprober.pyc +0 -0
- data/vendor/requests/packages/chardet/universaldetector.pyc +0 -0
- data/vendor/requests/packages/chardet/utf8prober.pyc +0 -0
- data/vendor/requests/packages/idna/__init__.py +1 -0
- data/vendor/requests/packages/idna/__init__.pyc +0 -0
- data/vendor/requests/packages/idna/codec.py +118 -0
- data/vendor/requests/packages/idna/codec.pyc +0 -0
- data/vendor/requests/packages/idna/compat.py +12 -0
- data/vendor/requests/packages/idna/compat.pyc +0 -0
- data/vendor/requests/packages/idna/core.py +387 -0
- data/vendor/requests/packages/idna/core.pyc +0 -0
- data/vendor/requests/packages/idna/idnadata.py +1584 -0
- data/vendor/requests/packages/idna/idnadata.pyc +0 -0
- data/vendor/requests/packages/idna/intranges.py +46 -0
- data/vendor/requests/packages/idna/intranges.pyc +0 -0
- data/vendor/requests/packages/idna/uts46data.py +7267 -0
- data/vendor/requests/packages/idna/uts46data.pyc +0 -0
- data/vendor/requests/packages/urllib3/__init__.py +2 -1
- data/vendor/requests/packages/urllib3/__init__.pyc +0 -0
- data/vendor/requests/packages/urllib3/_collections.pyc +0 -0
- data/vendor/requests/packages/urllib3/connection.py +62 -26
- data/vendor/requests/packages/urllib3/connection.pyc +0 -0
- data/vendor/requests/packages/urllib3/connectionpool.py +25 -20
- data/vendor/requests/packages/urllib3/connectionpool.pyc +0 -0
- data/vendor/requests/packages/urllib3/contrib/__init__.pyc +0 -0
- data/vendor/requests/packages/urllib3/contrib/appengine.py +87 -22
- data/vendor/requests/packages/urllib3/contrib/appengine.pyc +0 -0
- data/vendor/requests/packages/urllib3/contrib/ntlmpool.py +2 -5
- data/vendor/requests/packages/urllib3/contrib/ntlmpool.pyc +0 -0
- data/vendor/requests/packages/urllib3/contrib/pyopenssl.py +191 -118
- data/vendor/requests/packages/urllib3/contrib/pyopenssl.pyc +0 -0
- data/vendor/requests/packages/urllib3/contrib/socks.py +11 -5
- data/vendor/requests/packages/urllib3/contrib/socks.pyc +0 -0
- data/vendor/requests/packages/urllib3/exceptions.py +32 -0
- data/vendor/requests/packages/urllib3/exceptions.pyc +0 -0
- data/vendor/requests/packages/urllib3/fields.py +1 -1
- data/vendor/requests/packages/urllib3/fields.pyc +0 -0
- data/vendor/requests/packages/urllib3/filepost.py +1 -1
- data/vendor/requests/packages/urllib3/filepost.pyc +0 -0
- data/vendor/requests/packages/urllib3/packages/__init__.pyc +0 -0
- data/vendor/requests/packages/urllib3/packages/backports/__init__.py +0 -0
- data/vendor/requests/packages/urllib3/packages/backports/__init__.pyc +0 -0
- data/vendor/requests/packages/urllib3/packages/backports/makefile.py +53 -0
- data/vendor/requests/packages/urllib3/packages/backports/makefile.pyc +0 -0
- data/vendor/requests/packages/urllib3/packages/ordered_dict.pyc +0 -0
- data/vendor/requests/packages/urllib3/packages/six.pyc +0 -0
- data/vendor/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py +7 -1
- data/vendor/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyc +0 -0
- data/vendor/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py +55 -3
- data/vendor/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyc +0 -0
- data/vendor/requests/packages/urllib3/poolmanager.py +2 -6
- data/vendor/requests/packages/urllib3/poolmanager.pyc +0 -0
- data/vendor/requests/packages/urllib3/request.py +1 -4
- data/vendor/requests/packages/urllib3/request.pyc +0 -0
- data/vendor/requests/packages/urllib3/response.py +94 -6
- data/vendor/requests/packages/urllib3/response.pyc +0 -0
- data/vendor/requests/packages/urllib3/util/__init__.pyc +0 -0
- data/vendor/requests/packages/urllib3/util/connection.py +1 -0
- data/vendor/requests/packages/urllib3/util/connection.pyc +0 -0
- data/vendor/requests/packages/urllib3/util/request.pyc +0 -0
- data/vendor/requests/packages/urllib3/util/response.py +7 -0
- data/vendor/requests/packages/urllib3/util/response.pyc +0 -0
- data/vendor/requests/packages/urllib3/util/retry.py +93 -17
- data/vendor/requests/packages/urllib3/util/retry.pyc +0 -0
- data/vendor/requests/packages/urllib3/util/ssl_.py +28 -12
- data/vendor/requests/packages/urllib3/util/ssl_.pyc +0 -0
- data/vendor/requests/packages/urllib3/util/timeout.py +9 -6
- data/vendor/requests/packages/urllib3/util/timeout.pyc +0 -0
- data/vendor/requests/packages/urllib3/util/url.py +14 -5
- data/vendor/requests/packages/urllib3/util/url.pyc +0 -0
- data/vendor/requests/sessions.py +18 -5
- data/vendor/requests/sessions.pyc +0 -0
- data/vendor/requests/status_codes.pyc +0 -0
- data/vendor/requests/structures.pyc +0 -0
- data/vendor/requests/utils.py +42 -32
- data/vendor/requests/utils.pyc +0 -0
- data/vendor/{rigid-0.2.0.dist-info → rigid-0.2.1.dist-info}/DESCRIPTION.rst +0 -0
- data/vendor/{rigid-0.2.0.dist-info → rigid-0.2.1.dist-info}/INSTALLER +0 -0
- data/vendor/{rigid-0.2.0.dist-info → rigid-0.2.1.dist-info}/METADATA +2 -2
- data/vendor/{rigid-0.2.0.dist-info → rigid-0.2.1.dist-info}/RECORD +18 -18
- data/vendor/{rigid-0.2.0.dist-info → rigid-0.2.1.dist-info}/WHEEL +0 -0
- data/vendor/{rigid-0.2.0.dist-info → rigid-0.2.1.dist-info}/entry_points.txt +0 -0
- data/vendor/{rigid-0.2.0.dist-info → rigid-0.2.1.dist-info}/metadata.json +1 -1
- data/vendor/{rigid-0.2.0.dist-info → rigid-0.2.1.dist-info}/top_level.txt +0 -0
- data/vendor/rigid/__init__.pyc +0 -0
- data/vendor/rigid/api.py +39 -2
- data/vendor/rigid/api.pyc +0 -0
- data/vendor/rigid/commands/__init__.py +71 -11
- data/vendor/rigid/commands/__init__.pyc +0 -0
- data/vendor/rigid/commands/deploy.pyc +0 -0
- data/vendor/rigid/deploy.py +1 -1
- data/vendor/rigid/deploy.pyc +0 -0
- data/vendor/rigid/file_scanner.py +1 -1
- data/vendor/rigid/file_scanner.pyc +0 -0
- data/vendor/rigid/utils.pyc +0 -0
- data/vendor/tests/__init__.pyc +0 -0
- data/vendor/tests/integration/__init__.pyc +0 -0
- data/vendor/tests/integration/test_app.py +12 -0
- data/vendor/tests/integration/test_app.pyc +0 -0
- data/vendor/tests/integration/test_apps.pyc +0 -0
- data/vendor/tests/integration/test_deploy.pyc +0 -0
- data/vendor/tests/integration/test_domains.pyc +0 -0
- data/vendor/tests/integration/test_login.pyc +0 -0
- data/vendor/tests/integration/test_promote.py +2 -2
- data/vendor/tests/integration/test_promote.pyc +0 -0
- data/vendor/tests/integration/test_token.pyc +0 -0
- data/vendor/tests/integration/test_whoami.pyc +0 -0
- data/vendor/tests/test_deploy.pyc +0 -0
- data/vendor/tests/test_file_scanner.pyc +0 -0
- data/vendor/tests/utils.py +5 -2
- data/vendor/tests/utils.pyc +0 -0
- data/vendor/yaml/__init__.pyc +0 -0
- data/vendor/yaml/composer.pyc +0 -0
- data/vendor/yaml/constructor.pyc +0 -0
- data/vendor/yaml/cyaml.pyc +0 -0
- data/vendor/yaml/dumper.pyc +0 -0
- data/vendor/yaml/emitter.pyc +0 -0
- data/vendor/yaml/error.pyc +0 -0
- data/vendor/yaml/events.pyc +0 -0
- data/vendor/yaml/loader.pyc +0 -0
- data/vendor/yaml/nodes.pyc +0 -0
- data/vendor/yaml/parser.pyc +0 -0
- data/vendor/yaml/reader.pyc +0 -0
- data/vendor/yaml/representer.pyc +0 -0
- data/vendor/yaml/resolver.pyc +0 -0
- data/vendor/yaml/scanner.pyc +0 -0
- data/vendor/yaml/serializer.pyc +0 -0
- data/vendor/yaml/tokens.pyc +0 -0
- metadata +37 -17
- data/vendor/requests-2.11.1.dist-info/metadata.json +0 -1
Binary file
|
@@ -32,7 +32,7 @@ except ImportError:
|
|
32
32
|
|
33
33
|
__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)'
|
34
34
|
__license__ = 'MIT'
|
35
|
-
__version__ = '1.
|
35
|
+
__version__ = '1.19.1'
|
36
36
|
|
37
37
|
__all__ = (
|
38
38
|
'HTTPConnectionPool',
|
@@ -71,6 +71,7 @@ def add_stderr_logger(level=logging.DEBUG):
|
|
71
71
|
logger.debug('Added a stderr logging handler to logger: %s', __name__)
|
72
72
|
return handler
|
73
73
|
|
74
|
+
|
74
75
|
# ... Clean up.
|
75
76
|
del NullHandler
|
76
77
|
|
Binary file
|
Binary file
|
@@ -7,13 +7,8 @@ import socket
|
|
7
7
|
from socket import error as SocketError, timeout as SocketTimeout
|
8
8
|
import warnings
|
9
9
|
from .packages import six
|
10
|
-
|
11
|
-
|
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
|
17
12
|
|
18
13
|
try: # Compiled with SSL?
|
19
14
|
import ssl
|
@@ -44,8 +39,9 @@ from .packages.ssl_match_hostname import match_hostname, CertificateError
|
|
44
39
|
from .util.ssl_ import (
|
45
40
|
resolve_cert_reqs,
|
46
41
|
resolve_ssl_version,
|
47
|
-
ssl_wrap_socket,
|
48
42
|
assert_fingerprint,
|
43
|
+
create_urllib3_context,
|
44
|
+
ssl_wrap_socket
|
49
45
|
)
|
50
46
|
|
51
47
|
|
@@ -174,7 +170,13 @@ class HTTPConnection(_HTTPConnection, object):
|
|
174
170
|
"""
|
175
171
|
headers = HTTPHeaderDict(headers if headers is not None else {})
|
176
172
|
skip_accept_encoding = 'accept-encoding' in headers
|
177
|
-
|
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
|
+
)
|
178
180
|
for header, value in headers.items():
|
179
181
|
self.putheader(header, value)
|
180
182
|
if 'transfer-encoding' not in headers:
|
@@ -203,14 +205,18 @@ class HTTPConnection(_HTTPConnection, object):
|
|
203
205
|
class HTTPSConnection(HTTPConnection):
|
204
206
|
default_port = port_by_scheme['https']
|
205
207
|
|
208
|
+
ssl_version = None
|
209
|
+
|
206
210
|
def __init__(self, host, port=None, key_file=None, cert_file=None,
|
207
|
-
strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
|
211
|
+
strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
|
212
|
+
ssl_context=None, **kw):
|
208
213
|
|
209
214
|
HTTPConnection.__init__(self, host, port, strict=strict,
|
210
215
|
timeout=timeout, **kw)
|
211
216
|
|
212
217
|
self.key_file = key_file
|
213
218
|
self.cert_file = cert_file
|
219
|
+
self.ssl_context = ssl_context
|
214
220
|
|
215
221
|
# Required property for Google AppEngine 1.9.0 which otherwise causes
|
216
222
|
# HTTPS requests to go out as HTTP. (See Issue #356)
|
@@ -219,7 +225,19 @@ class HTTPSConnection(HTTPConnection):
|
|
219
225
|
def connect(self):
|
220
226
|
conn = self._new_conn()
|
221
227
|
self._prepare_conn(conn)
|
222
|
-
|
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
|
+
)
|
223
241
|
|
224
242
|
|
225
243
|
class VerifiedHTTPSConnection(HTTPSConnection):
|
@@ -237,9 +255,18 @@ class VerifiedHTTPSConnection(HTTPSConnection):
|
|
237
255
|
cert_reqs=None, ca_certs=None,
|
238
256
|
assert_hostname=None, assert_fingerprint=None,
|
239
257
|
ca_cert_dir=None):
|
240
|
-
|
241
|
-
|
242
|
-
|
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
|
243
270
|
|
244
271
|
self.key_file = key_file
|
245
272
|
self.cert_file = cert_file
|
@@ -253,9 +280,6 @@ class VerifiedHTTPSConnection(HTTPSConnection):
|
|
253
280
|
# Add certificate verification
|
254
281
|
conn = self._new_conn()
|
255
282
|
|
256
|
-
resolved_cert_reqs = resolve_cert_reqs(self.cert_reqs)
|
257
|
-
resolved_ssl_version = resolve_ssl_version(self.ssl_version)
|
258
|
-
|
259
283
|
hostname = self.host
|
260
284
|
if getattr(self, '_tunnel_host', None):
|
261
285
|
# _tunnel_host was added in Python 2.6.3
|
@@ -281,17 +305,27 @@ class VerifiedHTTPSConnection(HTTPSConnection):
|
|
281
305
|
|
282
306
|
# Wrap socket using verification with the root certs in
|
283
307
|
# trusted_root_certs
|
284
|
-
self.
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
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)
|
290
324
|
|
291
325
|
if self.assert_fingerprint:
|
292
326
|
assert_fingerprint(self.sock.getpeercert(binary_form=True),
|
293
327
|
self.assert_fingerprint)
|
294
|
-
elif
|
328
|
+
elif context.verify_mode != ssl.CERT_NONE \
|
295
329
|
and self.assert_hostname is not False:
|
296
330
|
cert = self.sock.getpeercert()
|
297
331
|
if not cert.get('subjectAltName', ()):
|
@@ -304,8 +338,10 @@ class VerifiedHTTPSConnection(HTTPSConnection):
|
|
304
338
|
)
|
305
339
|
_match_hostname(cert, self.assert_hostname or hostname)
|
306
340
|
|
307
|
-
self.is_verified = (
|
308
|
-
|
341
|
+
self.is_verified = (
|
342
|
+
context.verify_mode == ssl.CERT_REQUIRED or
|
343
|
+
self.assert_fingerprint is not None
|
344
|
+
)
|
309
345
|
|
310
346
|
|
311
347
|
def _match_hostname(cert, asserted_hostname):
|
Binary file
|
@@ -7,13 +7,6 @@ import warnings
|
|
7
7
|
from socket import error as SocketError, timeout as SocketTimeout
|
8
8
|
import socket
|
9
9
|
|
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
|
-
|
17
10
|
|
18
11
|
from .exceptions import (
|
19
12
|
ClosedPoolError,
|
@@ -32,6 +25,7 @@ from .exceptions import (
|
|
32
25
|
)
|
33
26
|
from .packages.ssl_match_hostname import CertificateError
|
34
27
|
from .packages import six
|
28
|
+
from .packages.six.moves.queue import LifoQueue, Empty, Full
|
35
29
|
from .connection import (
|
36
30
|
port_by_scheme,
|
37
31
|
DummyConnection,
|
@@ -48,6 +42,10 @@ from .util.timeout import Timeout
|
|
48
42
|
from .util.url import get_host, Url
|
49
43
|
|
50
44
|
|
45
|
+
if six.PY2:
|
46
|
+
# Queue is imported for side effects on MS Windows
|
47
|
+
import Queue as _unused_module_Queue # noqa: F401
|
48
|
+
|
51
49
|
xrange = six.moves.xrange
|
52
50
|
|
53
51
|
log = logging.getLogger(__name__)
|
@@ -210,8 +208,8 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
|
|
210
208
|
Return a fresh :class:`HTTPConnection`.
|
211
209
|
"""
|
212
210
|
self.num_connections += 1
|
213
|
-
log.
|
214
|
-
|
211
|
+
log.debug("Starting new HTTP connection (%d): %s",
|
212
|
+
self.num_connections, self.host)
|
215
213
|
|
216
214
|
conn = self.ConnectionCls(host=self.host, port=self.port,
|
217
215
|
timeout=self.timeout.connect_timeout,
|
@@ -246,7 +244,7 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
|
|
246
244
|
|
247
245
|
# If this is a persistent connection, check if it got disconnected
|
248
246
|
if conn and is_connection_dropped(conn):
|
249
|
-
log.
|
247
|
+
log.debug("Resetting dropped connection: %s", self.host)
|
250
248
|
conn.close()
|
251
249
|
if getattr(conn, 'auto_open', 1) == 0:
|
252
250
|
# This is a proxied connection that has been mutated by
|
@@ -397,8 +395,9 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
|
|
397
395
|
|
398
396
|
# AppEngine doesn't have a version attr.
|
399
397
|
http_version = getattr(conn, '_http_vsn_str', 'HTTP/?')
|
400
|
-
log.debug("\"%s %s %s\" %s %s",
|
401
|
-
httplib_response.status,
|
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)
|
402
401
|
|
403
402
|
try:
|
404
403
|
assert_header_parsing(httplib_response.msg)
|
@@ -600,10 +599,14 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
|
|
600
599
|
# mess.
|
601
600
|
response_conn = conn if not release_conn else None
|
602
601
|
|
602
|
+
# Pass method to Response for length checking
|
603
|
+
response_kw['request_method'] = method
|
604
|
+
|
603
605
|
# Import httplib's response into our own wrapper object
|
604
606
|
response = self.ResponseCls.from_httplib(httplib_response,
|
605
607
|
pool=self,
|
606
608
|
connection=response_conn,
|
609
|
+
retries=retries,
|
607
610
|
**response_kw)
|
608
611
|
|
609
612
|
# Everything went great!
|
@@ -683,7 +686,8 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
|
|
683
686
|
raise
|
684
687
|
return response
|
685
688
|
|
686
|
-
|
689
|
+
retries.sleep_for_retry(response)
|
690
|
+
log.debug("Redirecting %s -> %s", url, redirect_location)
|
687
691
|
return self.urlopen(
|
688
692
|
method, redirect_location, body, headers,
|
689
693
|
retries=retries, redirect=redirect,
|
@@ -692,7 +696,8 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
|
|
692
696
|
release_conn=release_conn, **response_kw)
|
693
697
|
|
694
698
|
# Check if we should retry the HTTP response.
|
695
|
-
|
699
|
+
has_retry_after = bool(response.getheader('Retry-After'))
|
700
|
+
if retries.is_retry(method, response.status, has_retry_after):
|
696
701
|
try:
|
697
702
|
retries = retries.increment(method, url, response=response, _pool=self)
|
698
703
|
except MaxRetryError:
|
@@ -702,8 +707,8 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
|
|
702
707
|
response.release_conn()
|
703
708
|
raise
|
704
709
|
return response
|
705
|
-
retries.sleep()
|
706
|
-
log.
|
710
|
+
retries.sleep(response)
|
711
|
+
log.debug("Retry: %s", url)
|
707
712
|
return self.urlopen(
|
708
713
|
method, url, body, headers,
|
709
714
|
retries=retries, redirect=redirect,
|
@@ -775,7 +780,6 @@ class HTTPSConnectionPool(HTTPConnectionPool):
|
|
775
780
|
assert_hostname=self.assert_hostname,
|
776
781
|
assert_fingerprint=self.assert_fingerprint)
|
777
782
|
conn.ssl_version = self.ssl_version
|
778
|
-
|
779
783
|
return conn
|
780
784
|
|
781
785
|
def _prepare_proxy(self, conn):
|
@@ -801,8 +805,8 @@ class HTTPSConnectionPool(HTTPConnectionPool):
|
|
801
805
|
Return a fresh :class:`httplib.HTTPSConnection`.
|
802
806
|
"""
|
803
807
|
self.num_connections += 1
|
804
|
-
log.
|
805
|
-
|
808
|
+
log.debug("Starting new HTTPS connection (%d): %s",
|
809
|
+
self.num_connections, self.host)
|
806
810
|
|
807
811
|
if not self.ConnectionCls or self.ConnectionCls is DummyConnection:
|
808
812
|
raise SSLError("Can't connect to HTTPS URL because the SSL "
|
@@ -834,7 +838,8 @@ class HTTPSConnectionPool(HTTPConnectionPool):
|
|
834
838
|
warnings.warn((
|
835
839
|
'Unverified HTTPS request is being made. '
|
836
840
|
'Adding certificate verification is strongly advised. See: '
|
837
|
-
'https://urllib3.readthedocs.io/en/latest/
|
841
|
+
'https://urllib3.readthedocs.io/en/latest/advanced-usage.html'
|
842
|
+
'#ssl-warnings'),
|
838
843
|
InsecureRequestWarning)
|
839
844
|
|
840
845
|
|
Binary file
|
Binary file
|
@@ -1,7 +1,48 @@
|
|
1
|
+
"""
|
2
|
+
This module provides a pool manager that uses Google App Engine's
|
3
|
+
`URLFetch Service <https://cloud.google.com/appengine/docs/python/urlfetch>`_.
|
4
|
+
|
5
|
+
Example usage::
|
6
|
+
|
7
|
+
from urllib3 import PoolManager
|
8
|
+
from urllib3.contrib.appengine import AppEngineManager, is_appengine_sandbox
|
9
|
+
|
10
|
+
if is_appengine_sandbox():
|
11
|
+
# AppEngineManager uses AppEngine's URLFetch API behind the scenes
|
12
|
+
http = AppEngineManager()
|
13
|
+
else:
|
14
|
+
# PoolManager uses a socket-level API behind the scenes
|
15
|
+
http = PoolManager()
|
16
|
+
|
17
|
+
r = http.request('GET', 'https://google.com/')
|
18
|
+
|
19
|
+
There are `limitations <https://cloud.google.com/appengine/docs/python/\
|
20
|
+
urlfetch/#Python_Quotas_and_limits>`_ to the URLFetch service and it may not be
|
21
|
+
the best choice for your application. There are three options for using
|
22
|
+
urllib3 on Google App Engine:
|
23
|
+
|
24
|
+
1. You can use :class:`AppEngineManager` with URLFetch. URLFetch is
|
25
|
+
cost-effective in many circumstances as long as your usage is within the
|
26
|
+
limitations.
|
27
|
+
2. You can use a normal :class:`~urllib3.PoolManager` by enabling sockets.
|
28
|
+
Sockets also have `limitations and restrictions
|
29
|
+
<https://cloud.google.com/appengine/docs/python/sockets/\
|
30
|
+
#limitations-and-restrictions>`_ and have a lower free quota than URLFetch.
|
31
|
+
To use sockets, be sure to specify the following in your ``app.yaml``::
|
32
|
+
|
33
|
+
env_variables:
|
34
|
+
GAE_USE_SOCKETS_HTTPLIB : 'true'
|
35
|
+
|
36
|
+
3. If you are using `App Engine Flexible
|
37
|
+
<https://cloud.google.com/appengine/docs/flexible/>`_, you can use the standard
|
38
|
+
:class:`PoolManager` without any configuration or special environment variables.
|
39
|
+
"""
|
40
|
+
|
1
41
|
from __future__ import absolute_import
|
2
42
|
import logging
|
3
43
|
import os
|
4
44
|
import warnings
|
45
|
+
from ..packages.six.moves.urllib.parse import urljoin
|
5
46
|
|
6
47
|
from ..exceptions import (
|
7
48
|
HTTPError,
|
@@ -41,13 +82,12 @@ class AppEngineManager(RequestMethods):
|
|
41
82
|
|
42
83
|
This manager uses the URLFetch service directly instead of using the
|
43
84
|
emulated httplib, and is subject to URLFetch limitations as described in
|
44
|
-
the App Engine documentation here
|
45
|
-
|
46
|
-
https://cloud.google.com/appengine/docs/python/urlfetch
|
85
|
+
the App Engine documentation `here
|
86
|
+
<https://cloud.google.com/appengine/docs/python/urlfetch>`_.
|
47
87
|
|
48
|
-
Notably it will raise an AppEnginePlatformError if:
|
88
|
+
Notably it will raise an :class:`AppEnginePlatformError` if:
|
49
89
|
* URLFetch is not available.
|
50
|
-
* If you attempt to use this on
|
90
|
+
* If you attempt to use this on App Engine Flexible, as full socket
|
51
91
|
support is available.
|
52
92
|
* If a request size is more than 10 megabytes.
|
53
93
|
* If a response size is more than 32 megabtyes.
|
@@ -56,7 +96,8 @@ class AppEngineManager(RequestMethods):
|
|
56
96
|
Beyond those cases, it will raise normal urllib3 errors.
|
57
97
|
"""
|
58
98
|
|
59
|
-
def __init__(self, headers=None, retries=None, validate_certificate=True
|
99
|
+
def __init__(self, headers=None, retries=None, validate_certificate=True,
|
100
|
+
urlfetch_retries=True):
|
60
101
|
if not urlfetch:
|
61
102
|
raise AppEnginePlatformError(
|
62
103
|
"URLFetch is not available in this environment.")
|
@@ -75,6 +116,7 @@ class AppEngineManager(RequestMethods):
|
|
75
116
|
|
76
117
|
RequestMethods.__init__(self, headers)
|
77
118
|
self.validate_certificate = validate_certificate
|
119
|
+
self.urlfetch_retries = urlfetch_retries
|
78
120
|
|
79
121
|
self.retries = retries or Retry.DEFAULT
|
80
122
|
|
@@ -92,16 +134,17 @@ class AppEngineManager(RequestMethods):
|
|
92
134
|
retries = self._get_retries(retries, redirect)
|
93
135
|
|
94
136
|
try:
|
137
|
+
follow_redirects = (
|
138
|
+
redirect and
|
139
|
+
retries.redirect != 0 and
|
140
|
+
retries.total)
|
95
141
|
response = urlfetch.fetch(
|
96
142
|
url,
|
97
143
|
payload=body,
|
98
144
|
method=method,
|
99
145
|
headers=headers or {},
|
100
146
|
allow_truncated=False,
|
101
|
-
follow_redirects=
|
102
|
-
redirect and
|
103
|
-
retries.redirect != 0 and
|
104
|
-
retries.total),
|
147
|
+
follow_redirects=self.urlfetch_retries and follow_redirects,
|
105
148
|
deadline=self._get_absolute_timeout(timeout),
|
106
149
|
validate_certificate=self.validate_certificate,
|
107
150
|
)
|
@@ -133,19 +176,40 @@ class AppEngineManager(RequestMethods):
|
|
133
176
|
"URLFetch does not support method: %s" % method, e)
|
134
177
|
|
135
178
|
http_response = self._urlfetch_response_to_http_response(
|
136
|
-
response, **response_kw)
|
137
|
-
|
138
|
-
#
|
139
|
-
|
140
|
-
|
141
|
-
|
179
|
+
response, retries=retries, **response_kw)
|
180
|
+
|
181
|
+
# Handle redirect?
|
182
|
+
redirect_location = redirect and http_response.get_redirect_location()
|
183
|
+
if redirect_location:
|
184
|
+
# Check for redirect response
|
185
|
+
if (self.urlfetch_retries and retries.raise_on_redirect):
|
186
|
+
raise MaxRetryError(self, url, "too many redirects")
|
187
|
+
else:
|
188
|
+
if http_response.status == 303:
|
189
|
+
method = 'GET'
|
190
|
+
|
191
|
+
try:
|
192
|
+
retries = retries.increment(method, url, response=http_response, _pool=self)
|
193
|
+
except MaxRetryError:
|
194
|
+
if retries.raise_on_redirect:
|
195
|
+
raise MaxRetryError(self, url, "too many redirects")
|
196
|
+
return http_response
|
197
|
+
|
198
|
+
retries.sleep_for_retry(http_response)
|
199
|
+
log.debug("Redirecting %s -> %s", url, redirect_location)
|
200
|
+
redirect_url = urljoin(url, redirect_location)
|
201
|
+
return self.urlopen(
|
202
|
+
method, redirect_url, body, headers,
|
203
|
+
retries=retries, redirect=redirect,
|
204
|
+
timeout=timeout, **response_kw)
|
142
205
|
|
143
206
|
# Check if we should retry the HTTP response.
|
144
|
-
|
207
|
+
has_retry_after = bool(http_response.getheader('Retry-After'))
|
208
|
+
if retries.is_retry(method, http_response.status, has_retry_after):
|
145
209
|
retries = retries.increment(
|
146
210
|
method, url, response=http_response, _pool=self)
|
147
|
-
log.
|
148
|
-
retries.sleep()
|
211
|
+
log.debug("Retry: %s", url)
|
212
|
+
retries.sleep(http_response)
|
149
213
|
return self.urlopen(
|
150
214
|
method, url,
|
151
215
|
body=body, headers=headers,
|
@@ -183,12 +247,13 @@ class AppEngineManager(RequestMethods):
|
|
183
247
|
|
184
248
|
def _get_absolute_timeout(self, timeout):
|
185
249
|
if timeout is Timeout.DEFAULT_TIMEOUT:
|
186
|
-
return
|
250
|
+
return None # Defer to URLFetch's default.
|
187
251
|
if isinstance(timeout, Timeout):
|
188
|
-
if timeout._read is not timeout._connect:
|
252
|
+
if timeout._read is not None or timeout._connect is not None:
|
189
253
|
warnings.warn(
|
190
254
|
"URLFetch does not support granular timeout settings, "
|
191
|
-
"reverting to total timeout.",
|
255
|
+
"reverting to total or default URLFetch timeout.",
|
256
|
+
AppEnginePlatformWarning)
|
192
257
|
return timeout.total
|
193
258
|
return timeout
|
194
259
|
|