rigid 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (229) hide show
  1. checksums.yaml +4 -4
  2. data/vendor/click/__init__.pyc +0 -0
  3. data/vendor/click/_bashcomplete.pyc +0 -0
  4. data/vendor/click/_compat.pyc +0 -0
  5. data/vendor/click/_termui_impl.pyc +0 -0
  6. data/vendor/click/_textwrap.pyc +0 -0
  7. data/vendor/click/_unicodefun.pyc +0 -0
  8. data/vendor/click/_winconsole.pyc +0 -0
  9. data/vendor/click/core.pyc +0 -0
  10. data/vendor/click/decorators.pyc +0 -0
  11. data/vendor/click/exceptions.pyc +0 -0
  12. data/vendor/click/formatting.pyc +0 -0
  13. data/vendor/click/globals.pyc +0 -0
  14. data/vendor/click/parser.pyc +0 -0
  15. data/vendor/click/termui.pyc +0 -0
  16. data/vendor/click/testing.pyc +0 -0
  17. data/vendor/click/types.pyc +0 -0
  18. data/vendor/click/utils.pyc +0 -0
  19. data/vendor/easy_install.pyc +0 -0
  20. data/vendor/pkg_resources/__init__.pyc +0 -0
  21. data/vendor/pkg_resources/_vendor/__init__.pyc +0 -0
  22. data/vendor/pkg_resources/_vendor/appdirs.pyc +0 -0
  23. data/vendor/pkg_resources/_vendor/packaging/__about__.pyc +0 -0
  24. data/vendor/pkg_resources/_vendor/packaging/__init__.pyc +0 -0
  25. data/vendor/pkg_resources/_vendor/packaging/_compat.pyc +0 -0
  26. data/vendor/pkg_resources/_vendor/packaging/_structures.pyc +0 -0
  27. data/vendor/pkg_resources/_vendor/packaging/markers.pyc +0 -0
  28. data/vendor/pkg_resources/_vendor/packaging/requirements.pyc +0 -0
  29. data/vendor/pkg_resources/_vendor/packaging/specifiers.pyc +0 -0
  30. data/vendor/pkg_resources/_vendor/packaging/utils.pyc +0 -0
  31. data/vendor/pkg_resources/_vendor/packaging/version.pyc +0 -0
  32. data/vendor/pkg_resources/_vendor/pyparsing.pyc +0 -0
  33. data/vendor/pkg_resources/_vendor/six.pyc +0 -0
  34. data/vendor/pkg_resources/extern/__init__.pyc +0 -0
  35. data/vendor/{requests-2.11.1.dist-info/METADATA → requests-2.12.1.dist-info/DESCRIPTION.rst} +51 -30
  36. data/vendor/{requests-2.11.1.dist-info → requests-2.12.1.dist-info}/INSTALLER +0 -0
  37. data/vendor/{requests-2.11.1.dist-info/DESCRIPTION.rst → requests-2.12.1.dist-info/METADATA} +80 -1
  38. data/vendor/{requests-2.11.1.dist-info → requests-2.12.1.dist-info}/RECORD +61 -41
  39. data/vendor/{requests-2.11.1.dist-info → requests-2.12.1.dist-info}/WHEEL +1 -1
  40. data/vendor/requests-2.12.1.dist-info/metadata.json +1 -0
  41. data/vendor/{requests-2.11.1.dist-info → requests-2.12.1.dist-info}/top_level.txt +0 -0
  42. data/vendor/requests/__init__.py +2 -2
  43. data/vendor/requests/__init__.pyc +0 -0
  44. data/vendor/requests/_internal_utils.py +27 -0
  45. data/vendor/requests/_internal_utils.pyc +0 -0
  46. data/vendor/requests/adapters.py +1 -1
  47. data/vendor/requests/adapters.pyc +0 -0
  48. data/vendor/requests/api.py +3 -1
  49. data/vendor/requests/api.pyc +0 -0
  50. data/vendor/requests/auth.py +2 -1
  51. data/vendor/requests/auth.pyc +0 -0
  52. data/vendor/requests/cacert.pem +448 -375
  53. data/vendor/requests/certs.pyc +0 -0
  54. data/vendor/requests/compat.py +2 -0
  55. data/vendor/requests/compat.pyc +0 -0
  56. data/vendor/requests/cookies.py +3 -1
  57. data/vendor/requests/cookies.pyc +0 -0
  58. data/vendor/requests/exceptions.py +2 -0
  59. data/vendor/requests/exceptions.pyc +0 -0
  60. data/vendor/requests/hooks.pyc +0 -0
  61. data/vendor/requests/models.py +53 -29
  62. data/vendor/requests/models.pyc +0 -0
  63. data/vendor/requests/packages/__init__.py +6 -0
  64. data/vendor/requests/packages/__init__.pyc +0 -0
  65. data/vendor/requests/packages/chardet/__init__.pyc +0 -0
  66. data/vendor/requests/packages/chardet/big5freq.pyc +0 -0
  67. data/vendor/requests/packages/chardet/big5prober.pyc +0 -0
  68. data/vendor/requests/packages/chardet/chardetect.pyc +0 -0
  69. data/vendor/requests/packages/chardet/chardistribution.pyc +0 -0
  70. data/vendor/requests/packages/chardet/charsetgroupprober.pyc +0 -0
  71. data/vendor/requests/packages/chardet/charsetprober.pyc +0 -0
  72. data/vendor/requests/packages/chardet/codingstatemachine.pyc +0 -0
  73. data/vendor/requests/packages/chardet/compat.pyc +0 -0
  74. data/vendor/requests/packages/chardet/constants.pyc +0 -0
  75. data/vendor/requests/packages/chardet/cp949prober.pyc +0 -0
  76. data/vendor/requests/packages/chardet/escprober.pyc +0 -0
  77. data/vendor/requests/packages/chardet/escsm.pyc +0 -0
  78. data/vendor/requests/packages/chardet/eucjpprober.pyc +0 -0
  79. data/vendor/requests/packages/chardet/euckrfreq.pyc +0 -0
  80. data/vendor/requests/packages/chardet/euckrprober.pyc +0 -0
  81. data/vendor/requests/packages/chardet/euctwfreq.pyc +0 -0
  82. data/vendor/requests/packages/chardet/euctwprober.pyc +0 -0
  83. data/vendor/requests/packages/chardet/gb2312freq.pyc +0 -0
  84. data/vendor/requests/packages/chardet/gb2312prober.pyc +0 -0
  85. data/vendor/requests/packages/chardet/hebrewprober.pyc +0 -0
  86. data/vendor/requests/packages/chardet/jisfreq.pyc +0 -0
  87. data/vendor/requests/packages/chardet/jpcntx.pyc +0 -0
  88. data/vendor/requests/packages/chardet/langbulgarianmodel.pyc +0 -0
  89. data/vendor/requests/packages/chardet/langcyrillicmodel.pyc +0 -0
  90. data/vendor/requests/packages/chardet/langgreekmodel.pyc +0 -0
  91. data/vendor/requests/packages/chardet/langhebrewmodel.pyc +0 -0
  92. data/vendor/requests/packages/chardet/langhungarianmodel.pyc +0 -0
  93. data/vendor/requests/packages/chardet/langthaimodel.pyc +0 -0
  94. data/vendor/requests/packages/chardet/latin1prober.pyc +0 -0
  95. data/vendor/requests/packages/chardet/mbcharsetprober.pyc +0 -0
  96. data/vendor/requests/packages/chardet/mbcsgroupprober.pyc +0 -0
  97. data/vendor/requests/packages/chardet/mbcssm.pyc +0 -0
  98. data/vendor/requests/packages/chardet/sbcharsetprober.pyc +0 -0
  99. data/vendor/requests/packages/chardet/sbcsgroupprober.pyc +0 -0
  100. data/vendor/requests/packages/chardet/sjisprober.pyc +0 -0
  101. data/vendor/requests/packages/chardet/universaldetector.pyc +0 -0
  102. data/vendor/requests/packages/chardet/utf8prober.pyc +0 -0
  103. data/vendor/requests/packages/idna/__init__.py +1 -0
  104. data/vendor/requests/packages/idna/__init__.pyc +0 -0
  105. data/vendor/requests/packages/idna/codec.py +118 -0
  106. data/vendor/requests/packages/idna/codec.pyc +0 -0
  107. data/vendor/requests/packages/idna/compat.py +12 -0
  108. data/vendor/requests/packages/idna/compat.pyc +0 -0
  109. data/vendor/requests/packages/idna/core.py +387 -0
  110. data/vendor/requests/packages/idna/core.pyc +0 -0
  111. data/vendor/requests/packages/idna/idnadata.py +1584 -0
  112. data/vendor/requests/packages/idna/idnadata.pyc +0 -0
  113. data/vendor/requests/packages/idna/intranges.py +46 -0
  114. data/vendor/requests/packages/idna/intranges.pyc +0 -0
  115. data/vendor/requests/packages/idna/uts46data.py +7267 -0
  116. data/vendor/requests/packages/idna/uts46data.pyc +0 -0
  117. data/vendor/requests/packages/urllib3/__init__.py +2 -1
  118. data/vendor/requests/packages/urllib3/__init__.pyc +0 -0
  119. data/vendor/requests/packages/urllib3/_collections.pyc +0 -0
  120. data/vendor/requests/packages/urllib3/connection.py +62 -26
  121. data/vendor/requests/packages/urllib3/connection.pyc +0 -0
  122. data/vendor/requests/packages/urllib3/connectionpool.py +25 -20
  123. data/vendor/requests/packages/urllib3/connectionpool.pyc +0 -0
  124. data/vendor/requests/packages/urllib3/contrib/__init__.pyc +0 -0
  125. data/vendor/requests/packages/urllib3/contrib/appengine.py +87 -22
  126. data/vendor/requests/packages/urllib3/contrib/appengine.pyc +0 -0
  127. data/vendor/requests/packages/urllib3/contrib/ntlmpool.py +2 -5
  128. data/vendor/requests/packages/urllib3/contrib/ntlmpool.pyc +0 -0
  129. data/vendor/requests/packages/urllib3/contrib/pyopenssl.py +191 -118
  130. data/vendor/requests/packages/urllib3/contrib/pyopenssl.pyc +0 -0
  131. data/vendor/requests/packages/urllib3/contrib/socks.py +11 -5
  132. data/vendor/requests/packages/urllib3/contrib/socks.pyc +0 -0
  133. data/vendor/requests/packages/urllib3/exceptions.py +32 -0
  134. data/vendor/requests/packages/urllib3/exceptions.pyc +0 -0
  135. data/vendor/requests/packages/urllib3/fields.py +1 -1
  136. data/vendor/requests/packages/urllib3/fields.pyc +0 -0
  137. data/vendor/requests/packages/urllib3/filepost.py +1 -1
  138. data/vendor/requests/packages/urllib3/filepost.pyc +0 -0
  139. data/vendor/requests/packages/urllib3/packages/__init__.pyc +0 -0
  140. data/vendor/requests/packages/urllib3/packages/backports/__init__.py +0 -0
  141. data/vendor/requests/packages/urllib3/packages/backports/__init__.pyc +0 -0
  142. data/vendor/requests/packages/urllib3/packages/backports/makefile.py +53 -0
  143. data/vendor/requests/packages/urllib3/packages/backports/makefile.pyc +0 -0
  144. data/vendor/requests/packages/urllib3/packages/ordered_dict.pyc +0 -0
  145. data/vendor/requests/packages/urllib3/packages/six.pyc +0 -0
  146. data/vendor/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py +7 -1
  147. data/vendor/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyc +0 -0
  148. data/vendor/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py +55 -3
  149. data/vendor/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyc +0 -0
  150. data/vendor/requests/packages/urllib3/poolmanager.py +2 -6
  151. data/vendor/requests/packages/urllib3/poolmanager.pyc +0 -0
  152. data/vendor/requests/packages/urllib3/request.py +1 -4
  153. data/vendor/requests/packages/urllib3/request.pyc +0 -0
  154. data/vendor/requests/packages/urllib3/response.py +94 -6
  155. data/vendor/requests/packages/urllib3/response.pyc +0 -0
  156. data/vendor/requests/packages/urllib3/util/__init__.pyc +0 -0
  157. data/vendor/requests/packages/urllib3/util/connection.py +1 -0
  158. data/vendor/requests/packages/urllib3/util/connection.pyc +0 -0
  159. data/vendor/requests/packages/urllib3/util/request.pyc +0 -0
  160. data/vendor/requests/packages/urllib3/util/response.py +7 -0
  161. data/vendor/requests/packages/urllib3/util/response.pyc +0 -0
  162. data/vendor/requests/packages/urllib3/util/retry.py +93 -17
  163. data/vendor/requests/packages/urllib3/util/retry.pyc +0 -0
  164. data/vendor/requests/packages/urllib3/util/ssl_.py +28 -12
  165. data/vendor/requests/packages/urllib3/util/ssl_.pyc +0 -0
  166. data/vendor/requests/packages/urllib3/util/timeout.py +9 -6
  167. data/vendor/requests/packages/urllib3/util/timeout.pyc +0 -0
  168. data/vendor/requests/packages/urllib3/util/url.py +14 -5
  169. data/vendor/requests/packages/urllib3/util/url.pyc +0 -0
  170. data/vendor/requests/sessions.py +18 -5
  171. data/vendor/requests/sessions.pyc +0 -0
  172. data/vendor/requests/status_codes.pyc +0 -0
  173. data/vendor/requests/structures.pyc +0 -0
  174. data/vendor/requests/utils.py +42 -32
  175. data/vendor/requests/utils.pyc +0 -0
  176. data/vendor/{rigid-0.2.0.dist-info → rigid-0.2.1.dist-info}/DESCRIPTION.rst +0 -0
  177. data/vendor/{rigid-0.2.0.dist-info → rigid-0.2.1.dist-info}/INSTALLER +0 -0
  178. data/vendor/{rigid-0.2.0.dist-info → rigid-0.2.1.dist-info}/METADATA +2 -2
  179. data/vendor/{rigid-0.2.0.dist-info → rigid-0.2.1.dist-info}/RECORD +18 -18
  180. data/vendor/{rigid-0.2.0.dist-info → rigid-0.2.1.dist-info}/WHEEL +0 -0
  181. data/vendor/{rigid-0.2.0.dist-info → rigid-0.2.1.dist-info}/entry_points.txt +0 -0
  182. data/vendor/{rigid-0.2.0.dist-info → rigid-0.2.1.dist-info}/metadata.json +1 -1
  183. data/vendor/{rigid-0.2.0.dist-info → rigid-0.2.1.dist-info}/top_level.txt +0 -0
  184. data/vendor/rigid/__init__.pyc +0 -0
  185. data/vendor/rigid/api.py +39 -2
  186. data/vendor/rigid/api.pyc +0 -0
  187. data/vendor/rigid/commands/__init__.py +71 -11
  188. data/vendor/rigid/commands/__init__.pyc +0 -0
  189. data/vendor/rigid/commands/deploy.pyc +0 -0
  190. data/vendor/rigid/deploy.py +1 -1
  191. data/vendor/rigid/deploy.pyc +0 -0
  192. data/vendor/rigid/file_scanner.py +1 -1
  193. data/vendor/rigid/file_scanner.pyc +0 -0
  194. data/vendor/rigid/utils.pyc +0 -0
  195. data/vendor/tests/__init__.pyc +0 -0
  196. data/vendor/tests/integration/__init__.pyc +0 -0
  197. data/vendor/tests/integration/test_app.py +12 -0
  198. data/vendor/tests/integration/test_app.pyc +0 -0
  199. data/vendor/tests/integration/test_apps.pyc +0 -0
  200. data/vendor/tests/integration/test_deploy.pyc +0 -0
  201. data/vendor/tests/integration/test_domains.pyc +0 -0
  202. data/vendor/tests/integration/test_login.pyc +0 -0
  203. data/vendor/tests/integration/test_promote.py +2 -2
  204. data/vendor/tests/integration/test_promote.pyc +0 -0
  205. data/vendor/tests/integration/test_token.pyc +0 -0
  206. data/vendor/tests/integration/test_whoami.pyc +0 -0
  207. data/vendor/tests/test_deploy.pyc +0 -0
  208. data/vendor/tests/test_file_scanner.pyc +0 -0
  209. data/vendor/tests/utils.py +5 -2
  210. data/vendor/tests/utils.pyc +0 -0
  211. data/vendor/yaml/__init__.pyc +0 -0
  212. data/vendor/yaml/composer.pyc +0 -0
  213. data/vendor/yaml/constructor.pyc +0 -0
  214. data/vendor/yaml/cyaml.pyc +0 -0
  215. data/vendor/yaml/dumper.pyc +0 -0
  216. data/vendor/yaml/emitter.pyc +0 -0
  217. data/vendor/yaml/error.pyc +0 -0
  218. data/vendor/yaml/events.pyc +0 -0
  219. data/vendor/yaml/loader.pyc +0 -0
  220. data/vendor/yaml/nodes.pyc +0 -0
  221. data/vendor/yaml/parser.pyc +0 -0
  222. data/vendor/yaml/reader.pyc +0 -0
  223. data/vendor/yaml/representer.pyc +0 -0
  224. data/vendor/yaml/resolver.pyc +0 -0
  225. data/vendor/yaml/scanner.pyc +0 -0
  226. data/vendor/yaml/serializer.pyc +0 -0
  227. data/vendor/yaml/tokens.pyc +0 -0
  228. metadata +37 -17
  229. data/vendor/requests-2.11.1.dist-info/metadata.json +0 -1
Binary file
@@ -50,6 +50,7 @@ if is_py2:
50
50
  str = unicode
51
51
  basestring = basestring
52
52
  numeric_types = (int, long, float)
53
+ integer_types = (int, long)
53
54
 
54
55
  elif is_py3:
55
56
  from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag
@@ -64,3 +65,4 @@ elif is_py3:
64
65
  bytes = bytes
65
66
  basestring = (str, bytes)
66
67
  numeric_types = (int, float)
68
+ integer_types = (int,)
Binary file
@@ -13,6 +13,8 @@ import copy
13
13
  import time
14
14
  import calendar
15
15
  import collections
16
+
17
+ from ._internal_utils import to_native_string
16
18
  from .compat import cookielib, urlparse, urlunparse, Morsel
17
19
 
18
20
  try:
@@ -55,7 +57,7 @@ class MockRequest(object):
55
57
  if not self._r.headers.get('Host'):
56
58
  return self._r.url
57
59
  # If they did set it, retrieve it and reconstruct the expected domain
58
- host = self._r.headers['Host']
60
+ host = to_native_string(self._r.headers['Host'], encoding='utf-8')
59
61
  parsed = urlparse(self._r.url)
60
62
  # Reconstruct the URL as we expect it
61
63
  return urlunparse([
Binary file
@@ -100,6 +100,8 @@ class StreamConsumedError(RequestException, TypeError):
100
100
  class RetryError(RequestException):
101
101
  """Custom retries logic failed"""
102
102
 
103
+ class UnrewindableBodyError(RequestException):
104
+ """Requests encountered an error when trying to rewind a body"""
103
105
 
104
106
  # Warnings
105
107
 
Binary file
@@ -10,12 +10,18 @@ This module contains the primary objects that power Requests.
10
10
  import collections
11
11
  import datetime
12
12
 
13
+ # Import encoding now, to avoid implicit import later.
14
+ # Implicit import within threads may cause LookupError when standard library is in a ZIP,
15
+ # such as in Embedded Python. See https://github.com/kennethreitz/requests/issues/3578.
16
+ import encodings.idna
17
+
13
18
  from io import BytesIO, UnsupportedOperation
14
19
  from .hooks import default_hooks
15
20
  from .structures import CaseInsensitiveDict
16
21
 
17
22
  from .auth import HTTPBasicAuth
18
23
  from .cookies import cookiejar_from_dict, get_cookie_header, _copy_cookie_jar
24
+ from .packages import idna
19
25
  from .packages.urllib3.fields import RequestField
20
26
  from .packages.urllib3.filepost import encode_multipart_formdata
21
27
  from .packages.urllib3.util import parse_url
@@ -24,11 +30,11 @@ from .packages.urllib3.exceptions import (
24
30
  from .exceptions import (
25
31
  HTTPError, MissingSchema, InvalidURL, ChunkedEncodingError,
26
32
  ContentDecodingError, ConnectionError, StreamConsumedError)
33
+ from ._internal_utils import to_native_string
27
34
  from .utils import (
28
35
  guess_filename, get_auth_from_url, requote_uri,
29
36
  stream_decode_response_unicode, to_key_val_list, parse_header_links,
30
- iter_slices, guess_json_utf, super_len, to_native_string,
31
- check_header_validity)
37
+ iter_slices, guess_json_utf, super_len, check_header_validity)
32
38
  from .compat import (
33
39
  cookielib, urlunparse, urlsplit, urlencode, str, bytes, StringIO,
34
40
  is_py2, chardet, builtin_str, basestring)
@@ -285,6 +291,8 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin):
285
291
  self.body = None
286
292
  #: dictionary of callback hooks, for internal usage.
287
293
  self.hooks = default_hooks()
294
+ #: integer denoting starting position of a readable file-like body.
295
+ self._body_position = None
288
296
 
289
297
  def prepare(self, method=None, url=None, headers=None, files=None,
290
298
  data=None, params=None, auth=None, cookies=None, hooks=None, json=None):
@@ -314,6 +322,7 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin):
314
322
  p._cookies = _copy_cookie_jar(self._cookies)
315
323
  p.body = self.body
316
324
  p.hooks = self.hooks
325
+ p._body_position = self._body_position
317
326
  return p
318
327
 
319
328
  def prepare_method(self, method):
@@ -358,8 +367,8 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin):
358
367
 
359
368
  # Only want to apply IDNA to the hostname
360
369
  try:
361
- host = host.encode('idna').decode('utf-8')
362
- except UnicodeError:
370
+ host = idna.encode(host, uts46=True).decode('utf-8')
371
+ except (UnicodeError, idna.IDNAError):
363
372
  raise InvalidURL('URL has an invalid label.')
364
373
 
365
374
  # Carefully reconstruct the network location
@@ -419,7 +428,6 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin):
419
428
  # Nottin' on you.
420
429
  body = None
421
430
  content_type = None
422
- length = None
423
431
 
424
432
  if not data and json is not None:
425
433
  # urllib3 requires a bytes-like body. Python 2's json.dumps
@@ -431,7 +439,7 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin):
431
439
 
432
440
  is_stream = all([
433
441
  hasattr(data, '__iter__'),
434
- not isinstance(data, (basestring, list, tuple, dict))
442
+ not isinstance(data, (basestring, list, tuple, collections.Mapping))
435
443
  ])
436
444
 
437
445
  try:
@@ -442,6 +450,17 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin):
442
450
  if is_stream:
443
451
  body = data
444
452
 
453
+ if getattr(body, 'tell', None) is not None:
454
+ # Record the current file position before reading.
455
+ # This will allow us to rewind a file in the event
456
+ # of a redirect.
457
+ try:
458
+ self._body_position = body.tell()
459
+ except (IOError, OSError):
460
+ # This differentiates from None, allowing us to catch
461
+ # a failed `tell()` later when trying to rewind the body
462
+ self._body_position = object()
463
+
445
464
  if files:
446
465
  raise NotImplementedError('Streamed bodies and files are mutually exclusive.')
447
466
 
@@ -470,17 +489,16 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin):
470
489
  self.body = body
471
490
 
472
491
  def prepare_content_length(self, body):
473
- if hasattr(body, 'seek') and hasattr(body, 'tell'):
474
- curr_pos = body.tell()
475
- body.seek(0, 2)
476
- end_pos = body.tell()
477
- self.headers['Content-Length'] = builtin_str(max(0, end_pos - curr_pos))
478
- body.seek(curr_pos, 0)
479
- elif body is not None:
480
- l = super_len(body)
481
- if l:
482
- self.headers['Content-Length'] = builtin_str(l)
483
- elif (self.method not in ('GET', 'HEAD')) and (self.headers.get('Content-Length') is None):
492
+ """Prepare Content-Length header based on request method and body"""
493
+ if body is not None:
494
+ length = super_len(body)
495
+ if length:
496
+ # If length exists, set it. Otherwise, we fallback
497
+ # to Transfer-Encoding: chunked.
498
+ self.headers['Content-Length'] = builtin_str(length)
499
+ elif self.method not in ('GET', 'HEAD') and self.headers.get('Content-Length') is None:
500
+ # Set Content-Length to 0 for methods that can have a body
501
+ # but don't provide one. (i.e. not GET or HEAD)
484
502
  self.headers['Content-Length'] = '0'
485
503
 
486
504
  def prepare_auth(self, auth, url=''):
@@ -744,18 +762,14 @@ class Response(object):
744
762
 
745
763
  if self._content is False:
746
764
  # Read the contents.
747
- try:
748
- if self._content_consumed:
749
- raise RuntimeError(
750
- 'The content for this response was already consumed')
751
-
752
- if self.status_code == 0:
753
- self._content = None
754
- else:
755
- self._content = bytes().join(self.iter_content(CONTENT_CHUNK_SIZE)) or bytes()
765
+ if self._content_consumed:
766
+ raise RuntimeError(
767
+ 'The content for this response was already consumed')
756
768
 
757
- except AttributeError:
769
+ if self.status_code == 0:
758
770
  self._content = None
771
+ else:
772
+ self._content = bytes().join(self.iter_content(CONTENT_CHUNK_SIZE)) or bytes()
759
773
 
760
774
  self._content_consumed = True
761
775
  # don't need to release the connection; that's been handled by urllib3
@@ -804,6 +818,7 @@ class Response(object):
804
818
  """Returns the json-encoded content of a response, if any.
805
819
 
806
820
  :param \*\*kwargs: Optional arguments that ``json.loads`` takes.
821
+ :raises ValueError: If the response body does not contain valid json.
807
822
  """
808
823
 
809
824
  if not self.encoding and self.content and len(self.content) > 3:
@@ -848,7 +863,14 @@ class Response(object):
848
863
 
849
864
  http_error_msg = ''
850
865
  if isinstance(self.reason, bytes):
851
- reason = self.reason.decode('utf-8', 'ignore')
866
+ # We attempt to decode utf-8 first because some servers
867
+ # choose to localize their reason strings. If the string
868
+ # isn't utf-8, we fall back to iso-8859-1 for all other
869
+ # encodings. (See PR #3538)
870
+ try:
871
+ reason = self.reason.decode('utf-8')
872
+ except UnicodeDecodeError:
873
+ reason = self.reason.decode('iso-8859-1')
852
874
  else:
853
875
  reason = self.reason
854
876
 
@@ -870,4 +892,6 @@ class Response(object):
870
892
  if not self._content_consumed:
871
893
  self.raw.close()
872
894
 
873
- return self.raw.release_conn()
895
+ release_conn = getattr(self.raw, 'release_conn', None)
896
+ if release_conn is not None:
897
+ release_conn()
Binary file
@@ -34,3 +34,9 @@ try:
34
34
  except ImportError:
35
35
  import chardet
36
36
  sys.modules['%s.chardet' % __name__] = chardet
37
+
38
+ try:
39
+ from . import idna
40
+ except ImportError:
41
+ import idna
42
+ sys.modules['%s.idna' % __name__] = idna
@@ -0,0 +1 @@
1
+ from .core import *
@@ -0,0 +1,118 @@
1
+ from .core import encode, decode, alabel, ulabel, IDNAError
2
+ import codecs
3
+ import re
4
+
5
+ _unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]')
6
+
7
+ class Codec(codecs.Codec):
8
+
9
+ def encode(self, data, errors='strict'):
10
+
11
+ if errors != 'strict':
12
+ raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
13
+
14
+ if not data:
15
+ return "", 0
16
+
17
+ return encode(data), len(data)
18
+
19
+ def decode(self, data, errors='strict'):
20
+
21
+ if errors != 'strict':
22
+ raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
23
+
24
+ if not data:
25
+ return u"", 0
26
+
27
+ return decode(data), len(data)
28
+
29
+ class IncrementalEncoder(codecs.BufferedIncrementalEncoder):
30
+ def _buffer_encode(self, data, errors, final):
31
+ if errors != 'strict':
32
+ raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
33
+
34
+ if not data:
35
+ return ("", 0)
36
+
37
+ labels = _unicode_dots_re.split(data)
38
+ trailing_dot = u''
39
+ if labels:
40
+ if not labels[-1]:
41
+ trailing_dot = '.'
42
+ del labels[-1]
43
+ elif not final:
44
+ # Keep potentially unfinished label until the next call
45
+ del labels[-1]
46
+ if labels:
47
+ trailing_dot = '.'
48
+
49
+ result = []
50
+ size = 0
51
+ for label in labels:
52
+ result.append(alabel(label))
53
+ if size:
54
+ size += 1
55
+ size += len(label)
56
+
57
+ # Join with U+002E
58
+ result = ".".join(result) + trailing_dot
59
+ size += len(trailing_dot)
60
+ return (result, size)
61
+
62
+ class IncrementalDecoder(codecs.BufferedIncrementalDecoder):
63
+ def _buffer_decode(self, data, errors, final):
64
+ if errors != 'strict':
65
+ raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
66
+
67
+ if not data:
68
+ return (u"", 0)
69
+
70
+ # IDNA allows decoding to operate on Unicode strings, too.
71
+ if isinstance(data, unicode):
72
+ labels = _unicode_dots_re.split(data)
73
+ else:
74
+ # Must be ASCII string
75
+ data = str(data)
76
+ unicode(data, "ascii")
77
+ labels = data.split(".")
78
+
79
+ trailing_dot = u''
80
+ if labels:
81
+ if not labels[-1]:
82
+ trailing_dot = u'.'
83
+ del labels[-1]
84
+ elif not final:
85
+ # Keep potentially unfinished label until the next call
86
+ del labels[-1]
87
+ if labels:
88
+ trailing_dot = u'.'
89
+
90
+ result = []
91
+ size = 0
92
+ for label in labels:
93
+ result.append(ulabel(label))
94
+ if size:
95
+ size += 1
96
+ size += len(label)
97
+
98
+ result = u".".join(result) + trailing_dot
99
+ size += len(trailing_dot)
100
+ return (result, size)
101
+
102
+
103
+ class StreamWriter(Codec, codecs.StreamWriter):
104
+ pass
105
+
106
+ class StreamReader(Codec, codecs.StreamReader):
107
+ pass
108
+
109
+ def getregentry():
110
+ return codecs.CodecInfo(
111
+ name='idna',
112
+ encode=Codec().encode,
113
+ decode=Codec().decode,
114
+ incrementalencoder=IncrementalEncoder,
115
+ incrementaldecoder=IncrementalDecoder,
116
+ streamwriter=StreamWriter,
117
+ streamreader=StreamReader,
118
+ )
@@ -0,0 +1,12 @@
1
+ from .core import *
2
+ from .codec import *
3
+
4
+ def ToASCII(label):
5
+ return encode(label)
6
+
7
+ def ToUnicode(label):
8
+ return decode(label)
9
+
10
+ def nameprep(s):
11
+ raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol")
12
+