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.
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
+