1# __
2# /__) _ _ _ _ _/ _
3# / ( (- (/ (/ (- _) / _)
4# /
5
6"""
7Requests HTTP Library
8~~~~~~~~~~~~~~~~~~~~~
9
10Requests is an HTTP library, written in Python, for human beings.
11Basic GET usage:
12
13 >>> import requests
14 >>> r = requests.get('https://www.python.org')
15 >>> r.status_code
16 200
17 >>> b'Python is a programming language' in r.content
18 True
19
20... or POST:
21
22 >>> payload = dict(key1='value1', key2='value2')
23 >>> r = requests.post('https://httpbin.org/post', data=payload)
24 >>> print(r.text)
25 {
26 ...
27 "form": {
28 "key1": "value1",
29 "key2": "value2"
30 },
31 ...
32 }
33
34The other HTTP methods are supported - see `requests.api`. Full documentation
35is at <https://requests.readthedocs.io>.
36
37:copyright: (c) 2017 by Kenneth Reitz.
38:license: Apache 2.0, see LICENSE for more details.
39"""
40
41import warnings
42
43import urllib3
44
45from .exceptions import RequestsDependencyWarning
46
47try:
48 from charset_normalizer import __version__ as charset_normalizer_version
49except ImportError:
50 charset_normalizer_version = None
51
52try:
53 from chardet import __version__ as chardet_version
54except ImportError:
55 chardet_version = None
56
57
58def check_compatibility(urllib3_version, chardet_version, charset_normalizer_version):
59 urllib3_version = urllib3_version.split(".")
60 assert urllib3_version != ["dev"] # Verify urllib3 isn't installed from git.
61
62 # Sometimes, urllib3 only reports its version as 16.1.
63 if len(urllib3_version) == 2:
64 urllib3_version.append("0")
65
66 # Check urllib3 for compatibility.
67 major, minor, patch = urllib3_version # noqa: F811
68 major, minor, patch = int(major), int(minor), int(patch)
69 # urllib3 >= 1.21.1
70 assert major >= 1
71 if major == 1:
72 assert minor >= 21
73
74 # Check charset_normalizer for compatibility.
75 if chardet_version:
76 major, minor, patch = chardet_version.split(".")[:3]
77 major, minor, patch = int(major), int(minor), int(patch)
78 # chardet_version >= 3.0.2, < 6.0.0
79 assert (3, 0, 2) <= (major, minor, patch) < (6, 0, 0)
80 elif charset_normalizer_version:
81 major, minor, patch = charset_normalizer_version.split(".")[:3]
82 major, minor, patch = int(major), int(minor), int(patch)
83 # charset_normalizer >= 2.0.0 < 4.0.0
84 assert (2, 0, 0) <= (major, minor, patch) < (4, 0, 0)
85 else:
86 warnings.warn(
87 "Unable to find acceptable character detection dependency "
88 "(chardet or charset_normalizer).",
89 RequestsDependencyWarning,
90 )
91
92
93def _check_cryptography(cryptography_version):
94 # cryptography < 1.3.4
95 try:
96 cryptography_version = list(map(int, cryptography_version.split(".")))
97 except ValueError:
98 return
99
100 if cryptography_version < [1, 3, 4]:
101 warning = "Old version of cryptography ({}) may cause slowdown.".format(
102 cryptography_version
103 )
104 warnings.warn(warning, RequestsDependencyWarning)
105
106
107# Check imported dependencies for compatibility.
108try:
109 check_compatibility(
110 urllib3.__version__, chardet_version, charset_normalizer_version
111 )
112except (AssertionError, ValueError):
113 warnings.warn(
114 "urllib3 ({}) or chardet ({})/charset_normalizer ({}) doesn't match a supported "
115 "version!".format(
116 urllib3.__version__, chardet_version, charset_normalizer_version
117 ),
118 RequestsDependencyWarning,
119 )
120
121# Attempt to enable urllib3's fallback for SNI support
122# if the standard library doesn't support SNI or the
123# 'ssl' library isn't available.
124try:
125 try:
126 import ssl
127 except ImportError:
128 ssl = None
129
130 if not getattr(ssl, "HAS_SNI", False):
131 from urllib3.contrib import pyopenssl
132
133 pyopenssl.inject_into_urllib3()
134
135 # Check cryptography version
136 from cryptography import __version__ as cryptography_version
137
138 _check_cryptography(cryptography_version)
139except ImportError:
140 pass
141
142# urllib3's DependencyWarnings should be silenced.
143from urllib3.exceptions import DependencyWarning
144
145warnings.simplefilter("ignore", DependencyWarning)
146
147# Set default logging handler to avoid "No handler found" warnings.
148import logging
149from logging import NullHandler
150
151from . import packages, utils
152from .__version__ import (
153 __author__,
154 __author_email__,
155 __build__,
156 __cake__,
157 __copyright__,
158 __description__,
159 __license__,
160 __title__,
161 __url__,
162 __version__,
163)
164from .api import delete, get, head, options, patch, post, put, request
165from .exceptions import (
166 ConnectionError,
167 ConnectTimeout,
168 FileModeWarning,
169 HTTPError,
170 JSONDecodeError,
171 ReadTimeout,
172 RequestException,
173 Timeout,
174 TooManyRedirects,
175 URLRequired,
176)
177from .models import PreparedRequest, Request, Response
178from .sessions import Session, session
179from .status_codes import codes
180
181logging.getLogger(__name__).addHandler(NullHandler())
182
183# FileModeWarnings go off per the default.
184warnings.simplefilter("default", FileModeWarning, append=True)