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
43from pip._vendor import urllib3
44
45from .exceptions import RequestsDependencyWarning
46
47charset_normalizer_version = None
48chardet_version = None
49
50
51def check_compatibility(urllib3_version, chardet_version, charset_normalizer_version):
52 urllib3_version = urllib3_version.split(".")
53 assert urllib3_version != ["dev"] # Verify urllib3 isn't installed from git.
54
55 # Sometimes, urllib3 only reports its version as 16.1.
56 if len(urllib3_version) == 2:
57 urllib3_version.append("0")
58
59 # Check urllib3 for compatibility.
60 major, minor, patch = urllib3_version # noqa: F811
61 major, minor, patch = int(major), int(minor), int(patch)
62 # urllib3 >= 1.21.1
63 assert major >= 1
64 if major == 1:
65 assert minor >= 21
66
67 # Check charset_normalizer for compatibility.
68 if chardet_version:
69 major, minor, patch = chardet_version.split(".")[:3]
70 major, minor, patch = int(major), int(minor), int(patch)
71 # chardet_version >= 3.0.2, < 8.0.0
72 assert (3, 0, 2) <= (major, minor, patch) < (8, 0, 0)
73 elif charset_normalizer_version:
74 major, minor, patch = charset_normalizer_version.split(".")[:3]
75 major, minor, patch = int(major), int(minor), int(patch)
76 # charset_normalizer >= 2.0.0 < 4.0.0
77 assert (2, 0, 0) <= (major, minor, patch) < (4, 0, 0)
78 else:
79 # pip does not need or use character detection
80 pass
81
82
83def _check_cryptography(cryptography_version):
84 # cryptography < 1.3.4
85 try:
86 cryptography_version = list(map(int, cryptography_version.split(".")))
87 except ValueError:
88 return
89
90 if cryptography_version < [1, 3, 4]:
91 warning = (
92 f"Old version of cryptography ({cryptography_version}) may cause slowdown."
93 )
94 warnings.warn(warning, RequestsDependencyWarning)
95
96
97# Check imported dependencies for compatibility.
98try:
99 check_compatibility(
100 urllib3.__version__, chardet_version, charset_normalizer_version
101 )
102except (AssertionError, ValueError):
103 warnings.warn(
104 f"urllib3 ({urllib3.__version__}) or chardet "
105 f"({chardet_version})/charset_normalizer ({charset_normalizer_version}) "
106 "doesn't match a supported version!",
107 RequestsDependencyWarning,
108 )
109
110# Attempt to enable urllib3's fallback for SNI support
111# if the standard library doesn't support SNI or the
112# 'ssl' library isn't available.
113try:
114 # Note: This logic prevents upgrading cryptography on Windows, if imported
115 # as part of pip.
116 from pip._internal.utils.compat import WINDOWS
117 if not WINDOWS:
118 raise ImportError("pip internals: don't import cryptography on Windows")
119 try:
120 import ssl
121 except ImportError:
122 ssl = None
123
124 if not getattr(ssl, "HAS_SNI", False):
125 from pip._vendor.urllib3.contrib import pyopenssl
126
127 pyopenssl.inject_into_urllib3()
128
129 # Check cryptography version
130 from cryptography import __version__ as cryptography_version
131
132 _check_cryptography(cryptography_version)
133except ImportError:
134 pass
135
136# urllib3's DependencyWarnings should be silenced.
137from pip._vendor.urllib3.exceptions import DependencyWarning
138
139warnings.simplefilter("ignore", DependencyWarning)
140
141# Set default logging handler to avoid "No handler found" warnings.
142import logging
143from logging import NullHandler
144
145from . import packages, utils
146from .__version__ import (
147 __author__,
148 __author_email__,
149 __build__,
150 __cake__,
151 __copyright__,
152 __description__,
153 __license__,
154 __title__,
155 __url__,
156 __version__,
157)
158from .api import delete, get, head, options, patch, post, put, request
159from .exceptions import (
160 ConnectionError,
161 ConnectTimeout,
162 FileModeWarning,
163 HTTPError,
164 JSONDecodeError,
165 ReadTimeout,
166 RequestException,
167 Timeout,
168 TooManyRedirects,
169 URLRequired,
170)
171from .models import PreparedRequest, Request, Response
172from .sessions import Session, session
173from .status_codes import codes
174
175logging.getLogger(__name__).addHandler(NullHandler())
176
177# FileModeWarnings go off per the default.
178warnings.simplefilter("default", FileModeWarning, append=True)