cli-ih 0.6.3.1__py3-none-any.whl → 0.7.1__py3-none-any.whl

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 (427) hide show
  1. cli_ih/__init__.py +1 -0
  2. cli_ih/asyncClient.py +109 -10
  3. cli_ih/client.py +110 -18
  4. cli_ih/utils.py +51 -0
  5. cli_ih-0.7.1.dist-info/METADATA +100 -0
  6. cli_ih-0.7.1.dist-info/RECORD +9 -0
  7. {cli_ih-0.6.3.1.dist-info → cli_ih-0.7.1.dist-info}/top_level.txt +0 -1
  8. cli_ih-0.6.3.1.dist-info/METADATA +0 -86
  9. cli_ih-0.6.3.1.dist-info/RECORD +0 -425
  10. venv/Lib/site-packages/__editable___cli_ih_0_6_3_1_finder.py +0 -85
  11. venv/Lib/site-packages/pip/__init__.py +0 -13
  12. venv/Lib/site-packages/pip/__main__.py +0 -24
  13. venv/Lib/site-packages/pip/__pip-runner__.py +0 -50
  14. venv/Lib/site-packages/pip/_internal/__init__.py +0 -18
  15. venv/Lib/site-packages/pip/_internal/build_env.py +0 -349
  16. venv/Lib/site-packages/pip/_internal/cache.py +0 -291
  17. venv/Lib/site-packages/pip/_internal/cli/__init__.py +0 -3
  18. venv/Lib/site-packages/pip/_internal/cli/autocompletion.py +0 -184
  19. venv/Lib/site-packages/pip/_internal/cli/base_command.py +0 -244
  20. venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py +0 -1138
  21. venv/Lib/site-packages/pip/_internal/cli/command_context.py +0 -28
  22. venv/Lib/site-packages/pip/_internal/cli/index_command.py +0 -175
  23. venv/Lib/site-packages/pip/_internal/cli/main.py +0 -80
  24. venv/Lib/site-packages/pip/_internal/cli/main_parser.py +0 -134
  25. venv/Lib/site-packages/pip/_internal/cli/parser.py +0 -298
  26. venv/Lib/site-packages/pip/_internal/cli/progress_bars.py +0 -151
  27. venv/Lib/site-packages/pip/_internal/cli/req_command.py +0 -351
  28. venv/Lib/site-packages/pip/_internal/cli/spinners.py +0 -235
  29. venv/Lib/site-packages/pip/_internal/cli/status_codes.py +0 -6
  30. venv/Lib/site-packages/pip/_internal/commands/__init__.py +0 -139
  31. venv/Lib/site-packages/pip/_internal/commands/cache.py +0 -231
  32. venv/Lib/site-packages/pip/_internal/commands/check.py +0 -66
  33. venv/Lib/site-packages/pip/_internal/commands/completion.py +0 -135
  34. venv/Lib/site-packages/pip/_internal/commands/configuration.py +0 -288
  35. venv/Lib/site-packages/pip/_internal/commands/debug.py +0 -203
  36. venv/Lib/site-packages/pip/_internal/commands/download.py +0 -145
  37. venv/Lib/site-packages/pip/_internal/commands/freeze.py +0 -107
  38. venv/Lib/site-packages/pip/_internal/commands/hash.py +0 -58
  39. venv/Lib/site-packages/pip/_internal/commands/help.py +0 -40
  40. venv/Lib/site-packages/pip/_internal/commands/index.py +0 -159
  41. venv/Lib/site-packages/pip/_internal/commands/inspect.py +0 -92
  42. venv/Lib/site-packages/pip/_internal/commands/install.py +0 -798
  43. venv/Lib/site-packages/pip/_internal/commands/list.py +0 -400
  44. venv/Lib/site-packages/pip/_internal/commands/lock.py +0 -170
  45. venv/Lib/site-packages/pip/_internal/commands/search.py +0 -178
  46. venv/Lib/site-packages/pip/_internal/commands/show.py +0 -231
  47. venv/Lib/site-packages/pip/_internal/commands/uninstall.py +0 -113
  48. venv/Lib/site-packages/pip/_internal/commands/wheel.py +0 -181
  49. venv/Lib/site-packages/pip/_internal/configuration.py +0 -397
  50. venv/Lib/site-packages/pip/_internal/distributions/__init__.py +0 -21
  51. venv/Lib/site-packages/pip/_internal/distributions/base.py +0 -55
  52. venv/Lib/site-packages/pip/_internal/distributions/installed.py +0 -33
  53. venv/Lib/site-packages/pip/_internal/distributions/sdist.py +0 -165
  54. venv/Lib/site-packages/pip/_internal/distributions/wheel.py +0 -44
  55. venv/Lib/site-packages/pip/_internal/exceptions.py +0 -881
  56. venv/Lib/site-packages/pip/_internal/index/__init__.py +0 -1
  57. venv/Lib/site-packages/pip/_internal/index/collector.py +0 -489
  58. venv/Lib/site-packages/pip/_internal/index/package_finder.py +0 -1059
  59. venv/Lib/site-packages/pip/_internal/index/sources.py +0 -287
  60. venv/Lib/site-packages/pip/_internal/locations/__init__.py +0 -441
  61. venv/Lib/site-packages/pip/_internal/locations/_distutils.py +0 -173
  62. venv/Lib/site-packages/pip/_internal/locations/_sysconfig.py +0 -215
  63. venv/Lib/site-packages/pip/_internal/locations/base.py +0 -82
  64. venv/Lib/site-packages/pip/_internal/main.py +0 -12
  65. venv/Lib/site-packages/pip/_internal/metadata/__init__.py +0 -164
  66. venv/Lib/site-packages/pip/_internal/metadata/_json.py +0 -87
  67. venv/Lib/site-packages/pip/_internal/metadata/base.py +0 -685
  68. venv/Lib/site-packages/pip/_internal/metadata/importlib/__init__.py +0 -6
  69. venv/Lib/site-packages/pip/_internal/metadata/importlib/_compat.py +0 -87
  70. venv/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py +0 -223
  71. venv/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py +0 -143
  72. venv/Lib/site-packages/pip/_internal/metadata/pkg_resources.py +0 -298
  73. venv/Lib/site-packages/pip/_internal/models/__init__.py +0 -1
  74. venv/Lib/site-packages/pip/_internal/models/candidate.py +0 -25
  75. venv/Lib/site-packages/pip/_internal/models/direct_url.py +0 -227
  76. venv/Lib/site-packages/pip/_internal/models/format_control.py +0 -78
  77. venv/Lib/site-packages/pip/_internal/models/index.py +0 -28
  78. venv/Lib/site-packages/pip/_internal/models/installation_report.py +0 -57
  79. venv/Lib/site-packages/pip/_internal/models/link.py +0 -613
  80. venv/Lib/site-packages/pip/_internal/models/pylock.py +0 -188
  81. venv/Lib/site-packages/pip/_internal/models/scheme.py +0 -25
  82. venv/Lib/site-packages/pip/_internal/models/search_scope.py +0 -126
  83. venv/Lib/site-packages/pip/_internal/models/selection_prefs.py +0 -53
  84. venv/Lib/site-packages/pip/_internal/models/target_python.py +0 -122
  85. venv/Lib/site-packages/pip/_internal/models/wheel.py +0 -141
  86. venv/Lib/site-packages/pip/_internal/network/__init__.py +0 -1
  87. venv/Lib/site-packages/pip/_internal/network/auth.py +0 -564
  88. venv/Lib/site-packages/pip/_internal/network/cache.py +0 -133
  89. venv/Lib/site-packages/pip/_internal/network/download.py +0 -342
  90. venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py +0 -213
  91. venv/Lib/site-packages/pip/_internal/network/session.py +0 -528
  92. venv/Lib/site-packages/pip/_internal/network/utils.py +0 -98
  93. venv/Lib/site-packages/pip/_internal/network/xmlrpc.py +0 -61
  94. venv/Lib/site-packages/pip/_internal/operations/__init__.py +0 -0
  95. venv/Lib/site-packages/pip/_internal/operations/build/__init__.py +0 -0
  96. venv/Lib/site-packages/pip/_internal/operations/build/build_tracker.py +0 -140
  97. venv/Lib/site-packages/pip/_internal/operations/build/metadata.py +0 -38
  98. venv/Lib/site-packages/pip/_internal/operations/build/metadata_editable.py +0 -41
  99. venv/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py +0 -73
  100. venv/Lib/site-packages/pip/_internal/operations/build/wheel.py +0 -38
  101. venv/Lib/site-packages/pip/_internal/operations/build/wheel_editable.py +0 -47
  102. venv/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py +0 -119
  103. venv/Lib/site-packages/pip/_internal/operations/check.py +0 -175
  104. venv/Lib/site-packages/pip/_internal/operations/freeze.py +0 -259
  105. venv/Lib/site-packages/pip/_internal/operations/install/__init__.py +0 -1
  106. venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py +0 -48
  107. venv/Lib/site-packages/pip/_internal/operations/install/wheel.py +0 -746
  108. venv/Lib/site-packages/pip/_internal/operations/prepare.py +0 -742
  109. venv/Lib/site-packages/pip/_internal/pyproject.py +0 -182
  110. venv/Lib/site-packages/pip/_internal/req/__init__.py +0 -105
  111. venv/Lib/site-packages/pip/_internal/req/constructors.py +0 -562
  112. venv/Lib/site-packages/pip/_internal/req/req_dependency_group.py +0 -75
  113. venv/Lib/site-packages/pip/_internal/req/req_file.py +0 -620
  114. venv/Lib/site-packages/pip/_internal/req/req_install.py +0 -937
  115. venv/Lib/site-packages/pip/_internal/req/req_set.py +0 -81
  116. venv/Lib/site-packages/pip/_internal/req/req_uninstall.py +0 -639
  117. venv/Lib/site-packages/pip/_internal/resolution/__init__.py +0 -0
  118. venv/Lib/site-packages/pip/_internal/resolution/base.py +0 -20
  119. venv/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py +0 -0
  120. venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py +0 -598
  121. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py +0 -0
  122. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py +0 -142
  123. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py +0 -582
  124. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py +0 -814
  125. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py +0 -166
  126. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py +0 -276
  127. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py +0 -85
  128. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py +0 -247
  129. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py +0 -336
  130. venv/Lib/site-packages/pip/_internal/self_outdated_check.py +0 -254
  131. venv/Lib/site-packages/pip/_internal/utils/__init__.py +0 -0
  132. venv/Lib/site-packages/pip/_internal/utils/_jaraco_text.py +0 -109
  133. venv/Lib/site-packages/pip/_internal/utils/_log.py +0 -38
  134. venv/Lib/site-packages/pip/_internal/utils/appdirs.py +0 -52
  135. venv/Lib/site-packages/pip/_internal/utils/compat.py +0 -85
  136. venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py +0 -201
  137. venv/Lib/site-packages/pip/_internal/utils/datetime.py +0 -10
  138. venv/Lib/site-packages/pip/_internal/utils/deprecation.py +0 -126
  139. venv/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py +0 -87
  140. venv/Lib/site-packages/pip/_internal/utils/egg_link.py +0 -81
  141. venv/Lib/site-packages/pip/_internal/utils/entrypoints.py +0 -88
  142. venv/Lib/site-packages/pip/_internal/utils/filesystem.py +0 -152
  143. venv/Lib/site-packages/pip/_internal/utils/filetypes.py +0 -24
  144. venv/Lib/site-packages/pip/_internal/utils/glibc.py +0 -102
  145. venv/Lib/site-packages/pip/_internal/utils/hashes.py +0 -150
  146. venv/Lib/site-packages/pip/_internal/utils/logging.py +0 -364
  147. venv/Lib/site-packages/pip/_internal/utils/misc.py +0 -765
  148. venv/Lib/site-packages/pip/_internal/utils/packaging.py +0 -44
  149. venv/Lib/site-packages/pip/_internal/utils/retry.py +0 -45
  150. venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py +0 -149
  151. venv/Lib/site-packages/pip/_internal/utils/subprocess.py +0 -248
  152. venv/Lib/site-packages/pip/_internal/utils/temp_dir.py +0 -294
  153. venv/Lib/site-packages/pip/_internal/utils/unpacking.py +0 -337
  154. venv/Lib/site-packages/pip/_internal/utils/urls.py +0 -55
  155. venv/Lib/site-packages/pip/_internal/utils/virtualenv.py +0 -105
  156. venv/Lib/site-packages/pip/_internal/utils/wheel.py +0 -132
  157. venv/Lib/site-packages/pip/_internal/vcs/__init__.py +0 -15
  158. venv/Lib/site-packages/pip/_internal/vcs/bazaar.py +0 -130
  159. venv/Lib/site-packages/pip/_internal/vcs/git.py +0 -571
  160. venv/Lib/site-packages/pip/_internal/vcs/mercurial.py +0 -186
  161. venv/Lib/site-packages/pip/_internal/vcs/subversion.py +0 -335
  162. venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py +0 -693
  163. venv/Lib/site-packages/pip/_internal/wheel_builder.py +0 -334
  164. venv/Lib/site-packages/pip/_vendor/__init__.py +0 -117
  165. venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py +0 -29
  166. venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py +0 -70
  167. venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py +0 -168
  168. venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py +0 -75
  169. venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py +0 -8
  170. venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py +0 -145
  171. venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py +0 -48
  172. venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py +0 -511
  173. venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py +0 -119
  174. venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py +0 -157
  175. venv/Lib/site-packages/pip/_vendor/cachecontrol/py.typed +0 -0
  176. venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py +0 -146
  177. venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py +0 -43
  178. venv/Lib/site-packages/pip/_vendor/certifi/__init__.py +0 -4
  179. venv/Lib/site-packages/pip/_vendor/certifi/__main__.py +0 -12
  180. venv/Lib/site-packages/pip/_vendor/certifi/core.py +0 -83
  181. venv/Lib/site-packages/pip/_vendor/certifi/py.typed +0 -0
  182. venv/Lib/site-packages/pip/_vendor/dependency_groups/__init__.py +0 -13
  183. venv/Lib/site-packages/pip/_vendor/dependency_groups/__main__.py +0 -65
  184. venv/Lib/site-packages/pip/_vendor/dependency_groups/_implementation.py +0 -209
  185. venv/Lib/site-packages/pip/_vendor/dependency_groups/_lint_dependency_groups.py +0 -59
  186. venv/Lib/site-packages/pip/_vendor/dependency_groups/_pip_wrapper.py +0 -62
  187. venv/Lib/site-packages/pip/_vendor/dependency_groups/_toml_compat.py +0 -9
  188. venv/Lib/site-packages/pip/_vendor/dependency_groups/py.typed +0 -0
  189. venv/Lib/site-packages/pip/_vendor/distlib/__init__.py +0 -33
  190. venv/Lib/site-packages/pip/_vendor/distlib/compat.py +0 -1137
  191. venv/Lib/site-packages/pip/_vendor/distlib/resources.py +0 -358
  192. venv/Lib/site-packages/pip/_vendor/distlib/scripts.py +0 -447
  193. venv/Lib/site-packages/pip/_vendor/distlib/util.py +0 -1984
  194. venv/Lib/site-packages/pip/_vendor/distro/__init__.py +0 -54
  195. venv/Lib/site-packages/pip/_vendor/distro/__main__.py +0 -4
  196. venv/Lib/site-packages/pip/_vendor/distro/distro.py +0 -1403
  197. venv/Lib/site-packages/pip/_vendor/distro/py.typed +0 -0
  198. venv/Lib/site-packages/pip/_vendor/idna/__init__.py +0 -45
  199. venv/Lib/site-packages/pip/_vendor/idna/codec.py +0 -122
  200. venv/Lib/site-packages/pip/_vendor/idna/compat.py +0 -15
  201. venv/Lib/site-packages/pip/_vendor/idna/core.py +0 -437
  202. venv/Lib/site-packages/pip/_vendor/idna/idnadata.py +0 -4243
  203. venv/Lib/site-packages/pip/_vendor/idna/intranges.py +0 -57
  204. venv/Lib/site-packages/pip/_vendor/idna/package_data.py +0 -1
  205. venv/Lib/site-packages/pip/_vendor/idna/py.typed +0 -0
  206. venv/Lib/site-packages/pip/_vendor/idna/uts46data.py +0 -8681
  207. venv/Lib/site-packages/pip/_vendor/msgpack/__init__.py +0 -55
  208. venv/Lib/site-packages/pip/_vendor/msgpack/exceptions.py +0 -48
  209. venv/Lib/site-packages/pip/_vendor/msgpack/ext.py +0 -170
  210. venv/Lib/site-packages/pip/_vendor/msgpack/fallback.py +0 -929
  211. venv/Lib/site-packages/pip/_vendor/packaging/__init__.py +0 -15
  212. venv/Lib/site-packages/pip/_vendor/packaging/_elffile.py +0 -109
  213. venv/Lib/site-packages/pip/_vendor/packaging/_manylinux.py +0 -262
  214. venv/Lib/site-packages/pip/_vendor/packaging/_musllinux.py +0 -85
  215. venv/Lib/site-packages/pip/_vendor/packaging/_parser.py +0 -353
  216. venv/Lib/site-packages/pip/_vendor/packaging/_structures.py +0 -61
  217. venv/Lib/site-packages/pip/_vendor/packaging/_tokenizer.py +0 -195
  218. venv/Lib/site-packages/pip/_vendor/packaging/licenses/__init__.py +0 -145
  219. venv/Lib/site-packages/pip/_vendor/packaging/licenses/_spdx.py +0 -759
  220. venv/Lib/site-packages/pip/_vendor/packaging/markers.py +0 -362
  221. venv/Lib/site-packages/pip/_vendor/packaging/metadata.py +0 -862
  222. venv/Lib/site-packages/pip/_vendor/packaging/py.typed +0 -0
  223. venv/Lib/site-packages/pip/_vendor/packaging/requirements.py +0 -91
  224. venv/Lib/site-packages/pip/_vendor/packaging/specifiers.py +0 -1019
  225. venv/Lib/site-packages/pip/_vendor/packaging/tags.py +0 -656
  226. venv/Lib/site-packages/pip/_vendor/packaging/utils.py +0 -163
  227. venv/Lib/site-packages/pip/_vendor/packaging/version.py +0 -582
  228. venv/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py +0 -3676
  229. venv/Lib/site-packages/pip/_vendor/platformdirs/__init__.py +0 -631
  230. venv/Lib/site-packages/pip/_vendor/platformdirs/__main__.py +0 -55
  231. venv/Lib/site-packages/pip/_vendor/platformdirs/android.py +0 -249
  232. venv/Lib/site-packages/pip/_vendor/platformdirs/api.py +0 -299
  233. venv/Lib/site-packages/pip/_vendor/platformdirs/macos.py +0 -144
  234. venv/Lib/site-packages/pip/_vendor/platformdirs/py.typed +0 -0
  235. venv/Lib/site-packages/pip/_vendor/platformdirs/unix.py +0 -272
  236. venv/Lib/site-packages/pip/_vendor/platformdirs/version.py +0 -21
  237. venv/Lib/site-packages/pip/_vendor/platformdirs/windows.py +0 -272
  238. venv/Lib/site-packages/pip/_vendor/pygments/__init__.py +0 -82
  239. venv/Lib/site-packages/pip/_vendor/pygments/__main__.py +0 -17
  240. venv/Lib/site-packages/pip/_vendor/pygments/console.py +0 -70
  241. venv/Lib/site-packages/pip/_vendor/pygments/filter.py +0 -70
  242. venv/Lib/site-packages/pip/_vendor/pygments/filters/__init__.py +0 -940
  243. venv/Lib/site-packages/pip/_vendor/pygments/formatter.py +0 -129
  244. venv/Lib/site-packages/pip/_vendor/pygments/formatters/__init__.py +0 -157
  245. venv/Lib/site-packages/pip/_vendor/pygments/formatters/_mapping.py +0 -23
  246. venv/Lib/site-packages/pip/_vendor/pygments/lexer.py +0 -963
  247. venv/Lib/site-packages/pip/_vendor/pygments/lexers/__init__.py +0 -362
  248. venv/Lib/site-packages/pip/_vendor/pygments/lexers/_mapping.py +0 -602
  249. venv/Lib/site-packages/pip/_vendor/pygments/lexers/python.py +0 -1201
  250. venv/Lib/site-packages/pip/_vendor/pygments/modeline.py +0 -43
  251. venv/Lib/site-packages/pip/_vendor/pygments/plugin.py +0 -72
  252. venv/Lib/site-packages/pip/_vendor/pygments/regexopt.py +0 -91
  253. venv/Lib/site-packages/pip/_vendor/pygments/scanner.py +0 -104
  254. venv/Lib/site-packages/pip/_vendor/pygments/sphinxext.py +0 -247
  255. venv/Lib/site-packages/pip/_vendor/pygments/style.py +0 -203
  256. venv/Lib/site-packages/pip/_vendor/pygments/styles/__init__.py +0 -61
  257. venv/Lib/site-packages/pip/_vendor/pygments/styles/_mapping.py +0 -54
  258. venv/Lib/site-packages/pip/_vendor/pygments/token.py +0 -214
  259. venv/Lib/site-packages/pip/_vendor/pygments/unistring.py +0 -153
  260. venv/Lib/site-packages/pip/_vendor/pygments/util.py +0 -324
  261. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__init__.py +0 -31
  262. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_impl.py +0 -410
  263. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py +0 -21
  264. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py +0 -389
  265. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/py.typed +0 -0
  266. venv/Lib/site-packages/pip/_vendor/requests/__init__.py +0 -179
  267. venv/Lib/site-packages/pip/_vendor/requests/__version__.py +0 -14
  268. venv/Lib/site-packages/pip/_vendor/requests/_internal_utils.py +0 -50
  269. venv/Lib/site-packages/pip/_vendor/requests/adapters.py +0 -719
  270. venv/Lib/site-packages/pip/_vendor/requests/api.py +0 -157
  271. venv/Lib/site-packages/pip/_vendor/requests/auth.py +0 -314
  272. venv/Lib/site-packages/pip/_vendor/requests/certs.py +0 -17
  273. venv/Lib/site-packages/pip/_vendor/requests/compat.py +0 -90
  274. venv/Lib/site-packages/pip/_vendor/requests/cookies.py +0 -561
  275. venv/Lib/site-packages/pip/_vendor/requests/exceptions.py +0 -151
  276. venv/Lib/site-packages/pip/_vendor/requests/help.py +0 -127
  277. venv/Lib/site-packages/pip/_vendor/requests/hooks.py +0 -33
  278. venv/Lib/site-packages/pip/_vendor/requests/models.py +0 -1039
  279. venv/Lib/site-packages/pip/_vendor/requests/packages.py +0 -25
  280. venv/Lib/site-packages/pip/_vendor/requests/sessions.py +0 -831
  281. venv/Lib/site-packages/pip/_vendor/requests/status_codes.py +0 -128
  282. venv/Lib/site-packages/pip/_vendor/requests/structures.py +0 -99
  283. venv/Lib/site-packages/pip/_vendor/requests/utils.py +0 -1086
  284. venv/Lib/site-packages/pip/_vendor/resolvelib/__init__.py +0 -27
  285. venv/Lib/site-packages/pip/_vendor/resolvelib/providers.py +0 -196
  286. venv/Lib/site-packages/pip/_vendor/resolvelib/py.typed +0 -0
  287. venv/Lib/site-packages/pip/_vendor/resolvelib/reporters.py +0 -55
  288. venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/__init__.py +0 -27
  289. venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/abstract.py +0 -47
  290. venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/criterion.py +0 -48
  291. venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/exceptions.py +0 -57
  292. venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/resolution.py +0 -622
  293. venv/Lib/site-packages/pip/_vendor/resolvelib/structs.py +0 -209
  294. venv/Lib/site-packages/pip/_vendor/rich/__init__.py +0 -177
  295. venv/Lib/site-packages/pip/_vendor/rich/__main__.py +0 -245
  296. venv/Lib/site-packages/pip/_vendor/rich/_cell_widths.py +0 -454
  297. venv/Lib/site-packages/pip/_vendor/rich/_emoji_codes.py +0 -3610
  298. venv/Lib/site-packages/pip/_vendor/rich/_emoji_replace.py +0 -32
  299. venv/Lib/site-packages/pip/_vendor/rich/_export_format.py +0 -76
  300. venv/Lib/site-packages/pip/_vendor/rich/_extension.py +0 -10
  301. venv/Lib/site-packages/pip/_vendor/rich/_fileno.py +0 -24
  302. venv/Lib/site-packages/pip/_vendor/rich/_inspect.py +0 -268
  303. venv/Lib/site-packages/pip/_vendor/rich/_log_render.py +0 -94
  304. venv/Lib/site-packages/pip/_vendor/rich/_loop.py +0 -43
  305. venv/Lib/site-packages/pip/_vendor/rich/_null_file.py +0 -69
  306. venv/Lib/site-packages/pip/_vendor/rich/_palettes.py +0 -309
  307. venv/Lib/site-packages/pip/_vendor/rich/_pick.py +0 -17
  308. venv/Lib/site-packages/pip/_vendor/rich/_ratio.py +0 -153
  309. venv/Lib/site-packages/pip/_vendor/rich/_spinners.py +0 -482
  310. venv/Lib/site-packages/pip/_vendor/rich/_stack.py +0 -16
  311. venv/Lib/site-packages/pip/_vendor/rich/_timer.py +0 -19
  312. venv/Lib/site-packages/pip/_vendor/rich/_win32_console.py +0 -661
  313. venv/Lib/site-packages/pip/_vendor/rich/_windows.py +0 -71
  314. venv/Lib/site-packages/pip/_vendor/rich/_windows_renderer.py +0 -56
  315. venv/Lib/site-packages/pip/_vendor/rich/_wrap.py +0 -93
  316. venv/Lib/site-packages/pip/_vendor/rich/abc.py +0 -33
  317. venv/Lib/site-packages/pip/_vendor/rich/align.py +0 -306
  318. venv/Lib/site-packages/pip/_vendor/rich/ansi.py +0 -241
  319. venv/Lib/site-packages/pip/_vendor/rich/bar.py +0 -93
  320. venv/Lib/site-packages/pip/_vendor/rich/box.py +0 -474
  321. venv/Lib/site-packages/pip/_vendor/rich/cells.py +0 -174
  322. venv/Lib/site-packages/pip/_vendor/rich/color.py +0 -621
  323. venv/Lib/site-packages/pip/_vendor/rich/color_triplet.py +0 -38
  324. venv/Lib/site-packages/pip/_vendor/rich/columns.py +0 -187
  325. venv/Lib/site-packages/pip/_vendor/rich/console.py +0 -2680
  326. venv/Lib/site-packages/pip/_vendor/rich/constrain.py +0 -37
  327. venv/Lib/site-packages/pip/_vendor/rich/containers.py +0 -167
  328. venv/Lib/site-packages/pip/_vendor/rich/control.py +0 -219
  329. venv/Lib/site-packages/pip/_vendor/rich/default_styles.py +0 -193
  330. venv/Lib/site-packages/pip/_vendor/rich/diagnose.py +0 -39
  331. venv/Lib/site-packages/pip/_vendor/rich/emoji.py +0 -91
  332. venv/Lib/site-packages/pip/_vendor/rich/errors.py +0 -34
  333. venv/Lib/site-packages/pip/_vendor/rich/file_proxy.py +0 -57
  334. venv/Lib/site-packages/pip/_vendor/rich/filesize.py +0 -88
  335. venv/Lib/site-packages/pip/_vendor/rich/highlighter.py +0 -232
  336. venv/Lib/site-packages/pip/_vendor/rich/json.py +0 -139
  337. venv/Lib/site-packages/pip/_vendor/rich/jupyter.py +0 -101
  338. venv/Lib/site-packages/pip/_vendor/rich/layout.py +0 -442
  339. venv/Lib/site-packages/pip/_vendor/rich/live.py +0 -400
  340. venv/Lib/site-packages/pip/_vendor/rich/live_render.py +0 -106
  341. venv/Lib/site-packages/pip/_vendor/rich/logging.py +0 -297
  342. venv/Lib/site-packages/pip/_vendor/rich/markup.py +0 -251
  343. venv/Lib/site-packages/pip/_vendor/rich/measure.py +0 -151
  344. venv/Lib/site-packages/pip/_vendor/rich/padding.py +0 -141
  345. venv/Lib/site-packages/pip/_vendor/rich/pager.py +0 -34
  346. venv/Lib/site-packages/pip/_vendor/rich/palette.py +0 -100
  347. venv/Lib/site-packages/pip/_vendor/rich/panel.py +0 -317
  348. venv/Lib/site-packages/pip/_vendor/rich/pretty.py +0 -1016
  349. venv/Lib/site-packages/pip/_vendor/rich/progress.py +0 -1715
  350. venv/Lib/site-packages/pip/_vendor/rich/progress_bar.py +0 -223
  351. venv/Lib/site-packages/pip/_vendor/rich/prompt.py +0 -400
  352. venv/Lib/site-packages/pip/_vendor/rich/protocol.py +0 -42
  353. venv/Lib/site-packages/pip/_vendor/rich/py.typed +0 -0
  354. venv/Lib/site-packages/pip/_vendor/rich/region.py +0 -10
  355. venv/Lib/site-packages/pip/_vendor/rich/repr.py +0 -149
  356. venv/Lib/site-packages/pip/_vendor/rich/rule.py +0 -130
  357. venv/Lib/site-packages/pip/_vendor/rich/scope.py +0 -86
  358. venv/Lib/site-packages/pip/_vendor/rich/screen.py +0 -54
  359. venv/Lib/site-packages/pip/_vendor/rich/segment.py +0 -752
  360. venv/Lib/site-packages/pip/_vendor/rich/spinner.py +0 -132
  361. venv/Lib/site-packages/pip/_vendor/rich/status.py +0 -131
  362. venv/Lib/site-packages/pip/_vendor/rich/style.py +0 -796
  363. venv/Lib/site-packages/pip/_vendor/rich/styled.py +0 -42
  364. venv/Lib/site-packages/pip/_vendor/rich/syntax.py +0 -985
  365. venv/Lib/site-packages/pip/_vendor/rich/table.py +0 -1006
  366. venv/Lib/site-packages/pip/_vendor/rich/terminal_theme.py +0 -153
  367. venv/Lib/site-packages/pip/_vendor/rich/text.py +0 -1361
  368. venv/Lib/site-packages/pip/_vendor/rich/theme.py +0 -115
  369. venv/Lib/site-packages/pip/_vendor/rich/themes.py +0 -5
  370. venv/Lib/site-packages/pip/_vendor/rich/traceback.py +0 -899
  371. venv/Lib/site-packages/pip/_vendor/rich/tree.py +0 -257
  372. venv/Lib/site-packages/pip/_vendor/tomli/__init__.py +0 -8
  373. venv/Lib/site-packages/pip/_vendor/tomli/_parser.py +0 -770
  374. venv/Lib/site-packages/pip/_vendor/tomli/_re.py +0 -112
  375. venv/Lib/site-packages/pip/_vendor/tomli/_types.py +0 -10
  376. venv/Lib/site-packages/pip/_vendor/tomli/py.typed +0 -1
  377. venv/Lib/site-packages/pip/_vendor/tomli_w/__init__.py +0 -4
  378. venv/Lib/site-packages/pip/_vendor/tomli_w/_writer.py +0 -229
  379. venv/Lib/site-packages/pip/_vendor/tomli_w/py.typed +0 -1
  380. venv/Lib/site-packages/pip/_vendor/truststore/__init__.py +0 -36
  381. venv/Lib/site-packages/pip/_vendor/truststore/_api.py +0 -333
  382. venv/Lib/site-packages/pip/_vendor/truststore/_macos.py +0 -571
  383. venv/Lib/site-packages/pip/_vendor/truststore/_openssl.py +0 -66
  384. venv/Lib/site-packages/pip/_vendor/truststore/_ssl_constants.py +0 -31
  385. venv/Lib/site-packages/pip/_vendor/truststore/_windows.py +0 -567
  386. venv/Lib/site-packages/pip/_vendor/truststore/py.typed +0 -0
  387. venv/Lib/site-packages/pip/_vendor/urllib3/__init__.py +0 -102
  388. venv/Lib/site-packages/pip/_vendor/urllib3/_collections.py +0 -355
  389. venv/Lib/site-packages/pip/_vendor/urllib3/_version.py +0 -2
  390. venv/Lib/site-packages/pip/_vendor/urllib3/connection.py +0 -572
  391. venv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py +0 -1140
  392. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py +0 -0
  393. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py +0 -36
  394. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py +0 -0
  395. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py +0 -519
  396. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py +0 -397
  397. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py +0 -314
  398. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py +0 -130
  399. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py +0 -518
  400. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py +0 -920
  401. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py +0 -216
  402. venv/Lib/site-packages/pip/_vendor/urllib3/exceptions.py +0 -323
  403. venv/Lib/site-packages/pip/_vendor/urllib3/fields.py +0 -274
  404. venv/Lib/site-packages/pip/_vendor/urllib3/filepost.py +0 -98
  405. venv/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py +0 -0
  406. venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py +0 -0
  407. venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py +0 -51
  408. venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py +0 -155
  409. venv/Lib/site-packages/pip/_vendor/urllib3/packages/six.py +0 -1076
  410. venv/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py +0 -540
  411. venv/Lib/site-packages/pip/_vendor/urllib3/request.py +0 -191
  412. venv/Lib/site-packages/pip/_vendor/urllib3/response.py +0 -879
  413. venv/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py +0 -49
  414. venv/Lib/site-packages/pip/_vendor/urllib3/util/connection.py +0 -149
  415. venv/Lib/site-packages/pip/_vendor/urllib3/util/proxy.py +0 -57
  416. venv/Lib/site-packages/pip/_vendor/urllib3/util/queue.py +0 -22
  417. venv/Lib/site-packages/pip/_vendor/urllib3/util/request.py +0 -137
  418. venv/Lib/site-packages/pip/_vendor/urllib3/util/response.py +0 -107
  419. venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py +0 -622
  420. venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py +0 -504
  421. venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py +0 -159
  422. venv/Lib/site-packages/pip/_vendor/urllib3/util/ssltransport.py +0 -221
  423. venv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py +0 -271
  424. venv/Lib/site-packages/pip/_vendor/urllib3/util/url.py +0 -435
  425. venv/Lib/site-packages/pip/_vendor/urllib3/util/wait.py +0 -152
  426. venv/Lib/site-packages/pip/py.typed +0 -4
  427. {cli_ih-0.6.3.1.dist-info → cli_ih-0.7.1.dist-info}/WHEEL +0 -0
@@ -1,879 +0,0 @@
1
- from __future__ import absolute_import
2
-
3
- import io
4
- import logging
5
- import sys
6
- import warnings
7
- import zlib
8
- from contextlib import contextmanager
9
- from socket import error as SocketError
10
- from socket import timeout as SocketTimeout
11
-
12
- brotli = None
13
-
14
- from . import util
15
- from ._collections import HTTPHeaderDict
16
- from .connection import BaseSSLError, HTTPException
17
- from .exceptions import (
18
- BodyNotHttplibCompatible,
19
- DecodeError,
20
- HTTPError,
21
- IncompleteRead,
22
- InvalidChunkLength,
23
- InvalidHeader,
24
- ProtocolError,
25
- ReadTimeoutError,
26
- ResponseNotChunked,
27
- SSLError,
28
- )
29
- from .packages import six
30
- from .util.response import is_fp_closed, is_response_to_head
31
-
32
- log = logging.getLogger(__name__)
33
-
34
-
35
- class DeflateDecoder(object):
36
- def __init__(self):
37
- self._first_try = True
38
- self._data = b""
39
- self._obj = zlib.decompressobj()
40
-
41
- def __getattr__(self, name):
42
- return getattr(self._obj, name)
43
-
44
- def decompress(self, data):
45
- if not data:
46
- return data
47
-
48
- if not self._first_try:
49
- return self._obj.decompress(data)
50
-
51
- self._data += data
52
- try:
53
- decompressed = self._obj.decompress(data)
54
- if decompressed:
55
- self._first_try = False
56
- self._data = None
57
- return decompressed
58
- except zlib.error:
59
- self._first_try = False
60
- self._obj = zlib.decompressobj(-zlib.MAX_WBITS)
61
- try:
62
- return self.decompress(self._data)
63
- finally:
64
- self._data = None
65
-
66
-
67
- class GzipDecoderState(object):
68
-
69
- FIRST_MEMBER = 0
70
- OTHER_MEMBERS = 1
71
- SWALLOW_DATA = 2
72
-
73
-
74
- class GzipDecoder(object):
75
- def __init__(self):
76
- self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS)
77
- self._state = GzipDecoderState.FIRST_MEMBER
78
-
79
- def __getattr__(self, name):
80
- return getattr(self._obj, name)
81
-
82
- def decompress(self, data):
83
- ret = bytearray()
84
- if self._state == GzipDecoderState.SWALLOW_DATA or not data:
85
- return bytes(ret)
86
- while True:
87
- try:
88
- ret += self._obj.decompress(data)
89
- except zlib.error:
90
- previous_state = self._state
91
- # Ignore data after the first error
92
- self._state = GzipDecoderState.SWALLOW_DATA
93
- if previous_state == GzipDecoderState.OTHER_MEMBERS:
94
- # Allow trailing garbage acceptable in other gzip clients
95
- return bytes(ret)
96
- raise
97
- data = self._obj.unused_data
98
- if not data:
99
- return bytes(ret)
100
- self._state = GzipDecoderState.OTHER_MEMBERS
101
- self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS)
102
-
103
-
104
- if brotli is not None:
105
-
106
- class BrotliDecoder(object):
107
- # Supports both 'brotlipy' and 'Brotli' packages
108
- # since they share an import name. The top branches
109
- # are for 'brotlipy' and bottom branches for 'Brotli'
110
- def __init__(self):
111
- self._obj = brotli.Decompressor()
112
- if hasattr(self._obj, "decompress"):
113
- self.decompress = self._obj.decompress
114
- else:
115
- self.decompress = self._obj.process
116
-
117
- def flush(self):
118
- if hasattr(self._obj, "flush"):
119
- return self._obj.flush()
120
- return b""
121
-
122
-
123
- class MultiDecoder(object):
124
- """
125
- From RFC7231:
126
- If one or more encodings have been applied to a representation, the
127
- sender that applied the encodings MUST generate a Content-Encoding
128
- header field that lists the content codings in the order in which
129
- they were applied.
130
- """
131
-
132
- def __init__(self, modes):
133
- self._decoders = [_get_decoder(m.strip()) for m in modes.split(",")]
134
-
135
- def flush(self):
136
- return self._decoders[0].flush()
137
-
138
- def decompress(self, data):
139
- for d in reversed(self._decoders):
140
- data = d.decompress(data)
141
- return data
142
-
143
-
144
- def _get_decoder(mode):
145
- if "," in mode:
146
- return MultiDecoder(mode)
147
-
148
- if mode == "gzip":
149
- return GzipDecoder()
150
-
151
- if brotli is not None and mode == "br":
152
- return BrotliDecoder()
153
-
154
- return DeflateDecoder()
155
-
156
-
157
- class HTTPResponse(io.IOBase):
158
- """
159
- HTTP Response container.
160
-
161
- Backwards-compatible with :class:`http.client.HTTPResponse` but the response ``body`` is
162
- loaded and decoded on-demand when the ``data`` property is accessed. This
163
- class is also compatible with the Python standard library's :mod:`io`
164
- module, and can hence be treated as a readable object in the context of that
165
- framework.
166
-
167
- Extra parameters for behaviour not present in :class:`http.client.HTTPResponse`:
168
-
169
- :param preload_content:
170
- If True, the response's body will be preloaded during construction.
171
-
172
- :param decode_content:
173
- If True, will attempt to decode the body based on the
174
- 'content-encoding' header.
175
-
176
- :param original_response:
177
- When this HTTPResponse wrapper is generated from an :class:`http.client.HTTPResponse`
178
- object, it's convenient to include the original for debug purposes. It's
179
- otherwise unused.
180
-
181
- :param retries:
182
- The retries contains the last :class:`~urllib3.util.retry.Retry` that
183
- was used during the request.
184
-
185
- :param enforce_content_length:
186
- Enforce content length checking. Body returned by server must match
187
- value of Content-Length header, if present. Otherwise, raise error.
188
- """
189
-
190
- CONTENT_DECODERS = ["gzip", "deflate"]
191
- if brotli is not None:
192
- CONTENT_DECODERS += ["br"]
193
- REDIRECT_STATUSES = [301, 302, 303, 307, 308]
194
-
195
- def __init__(
196
- self,
197
- body="",
198
- headers=None,
199
- status=0,
200
- version=0,
201
- reason=None,
202
- strict=0,
203
- preload_content=True,
204
- decode_content=True,
205
- original_response=None,
206
- pool=None,
207
- connection=None,
208
- msg=None,
209
- retries=None,
210
- enforce_content_length=False,
211
- request_method=None,
212
- request_url=None,
213
- auto_close=True,
214
- ):
215
-
216
- if isinstance(headers, HTTPHeaderDict):
217
- self.headers = headers
218
- else:
219
- self.headers = HTTPHeaderDict(headers)
220
- self.status = status
221
- self.version = version
222
- self.reason = reason
223
- self.strict = strict
224
- self.decode_content = decode_content
225
- self.retries = retries
226
- self.enforce_content_length = enforce_content_length
227
- self.auto_close = auto_close
228
-
229
- self._decoder = None
230
- self._body = None
231
- self._fp = None
232
- self._original_response = original_response
233
- self._fp_bytes_read = 0
234
- self.msg = msg
235
- self._request_url = request_url
236
-
237
- if body and isinstance(body, (six.string_types, bytes)):
238
- self._body = body
239
-
240
- self._pool = pool
241
- self._connection = connection
242
-
243
- if hasattr(body, "read"):
244
- self._fp = body
245
-
246
- # Are we using the chunked-style of transfer encoding?
247
- self.chunked = False
248
- self.chunk_left = None
249
- tr_enc = self.headers.get("transfer-encoding", "").lower()
250
- # Don't incur the penalty of creating a list and then discarding it
251
- encodings = (enc.strip() for enc in tr_enc.split(","))
252
- if "chunked" in encodings:
253
- self.chunked = True
254
-
255
- # Determine length of response
256
- self.length_remaining = self._init_length(request_method)
257
-
258
- # If requested, preload the body.
259
- if preload_content and not self._body:
260
- self._body = self.read(decode_content=decode_content)
261
-
262
- def get_redirect_location(self):
263
- """
264
- Should we redirect and where to?
265
-
266
- :returns: Truthy redirect location string if we got a redirect status
267
- code and valid location. ``None`` if redirect status and no
268
- location. ``False`` if not a redirect status code.
269
- """
270
- if self.status in self.REDIRECT_STATUSES:
271
- return self.headers.get("location")
272
-
273
- return False
274
-
275
- def release_conn(self):
276
- if not self._pool or not self._connection:
277
- return
278
-
279
- self._pool._put_conn(self._connection)
280
- self._connection = None
281
-
282
- def drain_conn(self):
283
- """
284
- Read and discard any remaining HTTP response data in the response connection.
285
-
286
- Unread data in the HTTPResponse connection blocks the connection from being released back to the pool.
287
- """
288
- try:
289
- self.read()
290
- except (HTTPError, SocketError, BaseSSLError, HTTPException):
291
- pass
292
-
293
- @property
294
- def data(self):
295
- # For backwards-compat with earlier urllib3 0.4 and earlier.
296
- if self._body:
297
- return self._body
298
-
299
- if self._fp:
300
- return self.read(cache_content=True)
301
-
302
- @property
303
- def connection(self):
304
- return self._connection
305
-
306
- def isclosed(self):
307
- return is_fp_closed(self._fp)
308
-
309
- def tell(self):
310
- """
311
- Obtain the number of bytes pulled over the wire so far. May differ from
312
- the amount of content returned by :meth:``urllib3.response.HTTPResponse.read``
313
- if bytes are encoded on the wire (e.g, compressed).
314
- """
315
- return self._fp_bytes_read
316
-
317
- def _init_length(self, request_method):
318
- """
319
- Set initial length value for Response content if available.
320
- """
321
- length = self.headers.get("content-length")
322
-
323
- if length is not None:
324
- if self.chunked:
325
- # This Response will fail with an IncompleteRead if it can't be
326
- # received as chunked. This method falls back to attempt reading
327
- # the response before raising an exception.
328
- log.warning(
329
- "Received response with both Content-Length and "
330
- "Transfer-Encoding set. This is expressly forbidden "
331
- "by RFC 7230 sec 3.3.2. Ignoring Content-Length and "
332
- "attempting to process response as Transfer-Encoding: "
333
- "chunked."
334
- )
335
- return None
336
-
337
- try:
338
- # RFC 7230 section 3.3.2 specifies multiple content lengths can
339
- # be sent in a single Content-Length header
340
- # (e.g. Content-Length: 42, 42). This line ensures the values
341
- # are all valid ints and that as long as the `set` length is 1,
342
- # all values are the same. Otherwise, the header is invalid.
343
- lengths = set([int(val) for val in length.split(",")])
344
- if len(lengths) > 1:
345
- raise InvalidHeader(
346
- "Content-Length contained multiple "
347
- "unmatching values (%s)" % length
348
- )
349
- length = lengths.pop()
350
- except ValueError:
351
- length = None
352
- else:
353
- if length < 0:
354
- length = None
355
-
356
- # Convert status to int for comparison
357
- # In some cases, httplib returns a status of "_UNKNOWN"
358
- try:
359
- status = int(self.status)
360
- except ValueError:
361
- status = 0
362
-
363
- # Check for responses that shouldn't include a body
364
- if status in (204, 304) or 100 <= status < 200 or request_method == "HEAD":
365
- length = 0
366
-
367
- return length
368
-
369
- def _init_decoder(self):
370
- """
371
- Set-up the _decoder attribute if necessary.
372
- """
373
- # Note: content-encoding value should be case-insensitive, per RFC 7230
374
- # Section 3.2
375
- content_encoding = self.headers.get("content-encoding", "").lower()
376
- if self._decoder is None:
377
- if content_encoding in self.CONTENT_DECODERS:
378
- self._decoder = _get_decoder(content_encoding)
379
- elif "," in content_encoding:
380
- encodings = [
381
- e.strip()
382
- for e in content_encoding.split(",")
383
- if e.strip() in self.CONTENT_DECODERS
384
- ]
385
- if len(encodings):
386
- self._decoder = _get_decoder(content_encoding)
387
-
388
- DECODER_ERROR_CLASSES = (IOError, zlib.error)
389
- if brotli is not None:
390
- DECODER_ERROR_CLASSES += (brotli.error,)
391
-
392
- def _decode(self, data, decode_content, flush_decoder):
393
- """
394
- Decode the data passed in and potentially flush the decoder.
395
- """
396
- if not decode_content:
397
- return data
398
-
399
- try:
400
- if self._decoder:
401
- data = self._decoder.decompress(data)
402
- except self.DECODER_ERROR_CLASSES as e:
403
- content_encoding = self.headers.get("content-encoding", "").lower()
404
- raise DecodeError(
405
- "Received response with content-encoding: %s, but "
406
- "failed to decode it." % content_encoding,
407
- e,
408
- )
409
- if flush_decoder:
410
- data += self._flush_decoder()
411
-
412
- return data
413
-
414
- def _flush_decoder(self):
415
- """
416
- Flushes the decoder. Should only be called if the decoder is actually
417
- being used.
418
- """
419
- if self._decoder:
420
- buf = self._decoder.decompress(b"")
421
- return buf + self._decoder.flush()
422
-
423
- return b""
424
-
425
- @contextmanager
426
- def _error_catcher(self):
427
- """
428
- Catch low-level python exceptions, instead re-raising urllib3
429
- variants, so that low-level exceptions are not leaked in the
430
- high-level api.
431
-
432
- On exit, release the connection back to the pool.
433
- """
434
- clean_exit = False
435
-
436
- try:
437
- try:
438
- yield
439
-
440
- except SocketTimeout:
441
- # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but
442
- # there is yet no clean way to get at it from this context.
443
- raise ReadTimeoutError(self._pool, None, "Read timed out.")
444
-
445
- except BaseSSLError as e:
446
- # FIXME: Is there a better way to differentiate between SSLErrors?
447
- if "read operation timed out" not in str(e):
448
- # SSL errors related to framing/MAC get wrapped and reraised here
449
- raise SSLError(e)
450
-
451
- raise ReadTimeoutError(self._pool, None, "Read timed out.")
452
-
453
- except (HTTPException, SocketError) as e:
454
- # This includes IncompleteRead.
455
- raise ProtocolError("Connection broken: %r" % e, e)
456
-
457
- # If no exception is thrown, we should avoid cleaning up
458
- # unnecessarily.
459
- clean_exit = True
460
- finally:
461
- # If we didn't terminate cleanly, we need to throw away our
462
- # connection.
463
- if not clean_exit:
464
- # The response may not be closed but we're not going to use it
465
- # anymore so close it now to ensure that the connection is
466
- # released back to the pool.
467
- if self._original_response:
468
- self._original_response.close()
469
-
470
- # Closing the response may not actually be sufficient to close
471
- # everything, so if we have a hold of the connection close that
472
- # too.
473
- if self._connection:
474
- self._connection.close()
475
-
476
- # If we hold the original response but it's closed now, we should
477
- # return the connection back to the pool.
478
- if self._original_response and self._original_response.isclosed():
479
- self.release_conn()
480
-
481
- def _fp_read(self, amt):
482
- """
483
- Read a response with the thought that reading the number of bytes
484
- larger than can fit in a 32-bit int at a time via SSL in some
485
- known cases leads to an overflow error that has to be prevented
486
- if `amt` or `self.length_remaining` indicate that a problem may
487
- happen.
488
-
489
- The known cases:
490
- * 3.8 <= CPython < 3.9.7 because of a bug
491
- https://github.com/urllib3/urllib3/issues/2513#issuecomment-1152559900.
492
- * urllib3 injected with pyOpenSSL-backed SSL-support.
493
- * CPython < 3.10 only when `amt` does not fit 32-bit int.
494
- """
495
- assert self._fp
496
- c_int_max = 2 ** 31 - 1
497
- if (
498
- (
499
- (amt and amt > c_int_max)
500
- or (self.length_remaining and self.length_remaining > c_int_max)
501
- )
502
- and not util.IS_SECURETRANSPORT
503
- and (util.IS_PYOPENSSL or sys.version_info < (3, 10))
504
- ):
505
- buffer = io.BytesIO()
506
- # Besides `max_chunk_amt` being a maximum chunk size, it
507
- # affects memory overhead of reading a response by this
508
- # method in CPython.
509
- # `c_int_max` equal to 2 GiB - 1 byte is the actual maximum
510
- # chunk size that does not lead to an overflow error, but
511
- # 256 MiB is a compromise.
512
- max_chunk_amt = 2 ** 28
513
- while amt is None or amt != 0:
514
- if amt is not None:
515
- chunk_amt = min(amt, max_chunk_amt)
516
- amt -= chunk_amt
517
- else:
518
- chunk_amt = max_chunk_amt
519
- data = self._fp.read(chunk_amt)
520
- if not data:
521
- break
522
- buffer.write(data)
523
- del data # to reduce peak memory usage by `max_chunk_amt`.
524
- return buffer.getvalue()
525
- else:
526
- # StringIO doesn't like amt=None
527
- return self._fp.read(amt) if amt is not None else self._fp.read()
528
-
529
- def read(self, amt=None, decode_content=None, cache_content=False):
530
- """
531
- Similar to :meth:`http.client.HTTPResponse.read`, but with two additional
532
- parameters: ``decode_content`` and ``cache_content``.
533
-
534
- :param amt:
535
- How much of the content to read. If specified, caching is skipped
536
- because it doesn't make sense to cache partial content as the full
537
- response.
538
-
539
- :param decode_content:
540
- If True, will attempt to decode the body based on the
541
- 'content-encoding' header.
542
-
543
- :param cache_content:
544
- If True, will save the returned data such that the same result is
545
- returned despite of the state of the underlying file object. This
546
- is useful if you want the ``.data`` property to continue working
547
- after having ``.read()`` the file object. (Overridden if ``amt`` is
548
- set.)
549
- """
550
- self._init_decoder()
551
- if decode_content is None:
552
- decode_content = self.decode_content
553
-
554
- if self._fp is None:
555
- return
556
-
557
- flush_decoder = False
558
- fp_closed = getattr(self._fp, "closed", False)
559
-
560
- with self._error_catcher():
561
- data = self._fp_read(amt) if not fp_closed else b""
562
- if amt is None:
563
- flush_decoder = True
564
- else:
565
- cache_content = False
566
- if (
567
- amt != 0 and not data
568
- ): # Platform-specific: Buggy versions of Python.
569
- # Close the connection when no data is returned
570
- #
571
- # This is redundant to what httplib/http.client _should_
572
- # already do. However, versions of python released before
573
- # December 15, 2012 (http://bugs.python.org/issue16298) do
574
- # not properly close the connection in all cases. There is
575
- # no harm in redundantly calling close.
576
- self._fp.close()
577
- flush_decoder = True
578
- if self.enforce_content_length and self.length_remaining not in (
579
- 0,
580
- None,
581
- ):
582
- # This is an edge case that httplib failed to cover due
583
- # to concerns of backward compatibility. We're
584
- # addressing it here to make sure IncompleteRead is
585
- # raised during streaming, so all calls with incorrect
586
- # Content-Length are caught.
587
- raise IncompleteRead(self._fp_bytes_read, self.length_remaining)
588
-
589
- if data:
590
- self._fp_bytes_read += len(data)
591
- if self.length_remaining is not None:
592
- self.length_remaining -= len(data)
593
-
594
- data = self._decode(data, decode_content, flush_decoder)
595
-
596
- if cache_content:
597
- self._body = data
598
-
599
- return data
600
-
601
- def stream(self, amt=2 ** 16, decode_content=None):
602
- """
603
- A generator wrapper for the read() method. A call will block until
604
- ``amt`` bytes have been read from the connection or until the
605
- connection is closed.
606
-
607
- :param amt:
608
- How much of the content to read. The generator will return up to
609
- much data per iteration, but may return less. This is particularly
610
- likely when using compressed data. However, the empty string will
611
- never be returned.
612
-
613
- :param decode_content:
614
- If True, will attempt to decode the body based on the
615
- 'content-encoding' header.
616
- """
617
- if self.chunked and self.supports_chunked_reads():
618
- for line in self.read_chunked(amt, decode_content=decode_content):
619
- yield line
620
- else:
621
- while not is_fp_closed(self._fp):
622
- data = self.read(amt=amt, decode_content=decode_content)
623
-
624
- if data:
625
- yield data
626
-
627
- @classmethod
628
- def from_httplib(ResponseCls, r, **response_kw):
629
- """
630
- Given an :class:`http.client.HTTPResponse` instance ``r``, return a
631
- corresponding :class:`urllib3.response.HTTPResponse` object.
632
-
633
- Remaining parameters are passed to the HTTPResponse constructor, along
634
- with ``original_response=r``.
635
- """
636
- headers = r.msg
637
-
638
- if not isinstance(headers, HTTPHeaderDict):
639
- if six.PY2:
640
- # Python 2.7
641
- headers = HTTPHeaderDict.from_httplib(headers)
642
- else:
643
- headers = HTTPHeaderDict(headers.items())
644
-
645
- # HTTPResponse objects in Python 3 don't have a .strict attribute
646
- strict = getattr(r, "strict", 0)
647
- resp = ResponseCls(
648
- body=r,
649
- headers=headers,
650
- status=r.status,
651
- version=r.version,
652
- reason=r.reason,
653
- strict=strict,
654
- original_response=r,
655
- **response_kw
656
- )
657
- return resp
658
-
659
- # Backwards-compatibility methods for http.client.HTTPResponse
660
- def getheaders(self):
661
- warnings.warn(
662
- "HTTPResponse.getheaders() is deprecated and will be removed "
663
- "in urllib3 v2.1.0. Instead access HTTPResponse.headers directly.",
664
- category=DeprecationWarning,
665
- stacklevel=2,
666
- )
667
- return self.headers
668
-
669
- def getheader(self, name, default=None):
670
- warnings.warn(
671
- "HTTPResponse.getheader() is deprecated and will be removed "
672
- "in urllib3 v2.1.0. Instead use HTTPResponse.headers.get(name, default).",
673
- category=DeprecationWarning,
674
- stacklevel=2,
675
- )
676
- return self.headers.get(name, default)
677
-
678
- # Backwards compatibility for http.cookiejar
679
- def info(self):
680
- return self.headers
681
-
682
- # Overrides from io.IOBase
683
- def close(self):
684
- if not self.closed:
685
- self._fp.close()
686
-
687
- if self._connection:
688
- self._connection.close()
689
-
690
- if not self.auto_close:
691
- io.IOBase.close(self)
692
-
693
- @property
694
- def closed(self):
695
- if not self.auto_close:
696
- return io.IOBase.closed.__get__(self)
697
- elif self._fp is None:
698
- return True
699
- elif hasattr(self._fp, "isclosed"):
700
- return self._fp.isclosed()
701
- elif hasattr(self._fp, "closed"):
702
- return self._fp.closed
703
- else:
704
- return True
705
-
706
- def fileno(self):
707
- if self._fp is None:
708
- raise IOError("HTTPResponse has no file to get a fileno from")
709
- elif hasattr(self._fp, "fileno"):
710
- return self._fp.fileno()
711
- else:
712
- raise IOError(
713
- "The file-like object this HTTPResponse is wrapped "
714
- "around has no file descriptor"
715
- )
716
-
717
- def flush(self):
718
- if (
719
- self._fp is not None
720
- and hasattr(self._fp, "flush")
721
- and not getattr(self._fp, "closed", False)
722
- ):
723
- return self._fp.flush()
724
-
725
- def readable(self):
726
- # This method is required for `io` module compatibility.
727
- return True
728
-
729
- def readinto(self, b):
730
- # This method is required for `io` module compatibility.
731
- temp = self.read(len(b))
732
- if len(temp) == 0:
733
- return 0
734
- else:
735
- b[: len(temp)] = temp
736
- return len(temp)
737
-
738
- def supports_chunked_reads(self):
739
- """
740
- Checks if the underlying file-like object looks like a
741
- :class:`http.client.HTTPResponse` object. We do this by testing for
742
- the fp attribute. If it is present we assume it returns raw chunks as
743
- processed by read_chunked().
744
- """
745
- return hasattr(self._fp, "fp")
746
-
747
- def _update_chunk_length(self):
748
- # First, we'll figure out length of a chunk and then
749
- # we'll try to read it from socket.
750
- if self.chunk_left is not None:
751
- return
752
- line = self._fp.fp.readline()
753
- line = line.split(b";", 1)[0]
754
- try:
755
- self.chunk_left = int(line, 16)
756
- except ValueError:
757
- # Invalid chunked protocol response, abort.
758
- self.close()
759
- raise InvalidChunkLength(self, line)
760
-
761
- def _handle_chunk(self, amt):
762
- returned_chunk = None
763
- if amt is None:
764
- chunk = self._fp._safe_read(self.chunk_left)
765
- returned_chunk = chunk
766
- self._fp._safe_read(2) # Toss the CRLF at the end of the chunk.
767
- self.chunk_left = None
768
- elif amt < self.chunk_left:
769
- value = self._fp._safe_read(amt)
770
- self.chunk_left = self.chunk_left - amt
771
- returned_chunk = value
772
- elif amt == self.chunk_left:
773
- value = self._fp._safe_read(amt)
774
- self._fp._safe_read(2) # Toss the CRLF at the end of the chunk.
775
- self.chunk_left = None
776
- returned_chunk = value
777
- else: # amt > self.chunk_left
778
- returned_chunk = self._fp._safe_read(self.chunk_left)
779
- self._fp._safe_read(2) # Toss the CRLF at the end of the chunk.
780
- self.chunk_left = None
781
- return returned_chunk
782
-
783
- def read_chunked(self, amt=None, decode_content=None):
784
- """
785
- Similar to :meth:`HTTPResponse.read`, but with an additional
786
- parameter: ``decode_content``.
787
-
788
- :param amt:
789
- How much of the content to read. If specified, caching is skipped
790
- because it doesn't make sense to cache partial content as the full
791
- response.
792
-
793
- :param decode_content:
794
- If True, will attempt to decode the body based on the
795
- 'content-encoding' header.
796
- """
797
- self._init_decoder()
798
- # FIXME: Rewrite this method and make it a class with a better structured logic.
799
- if not self.chunked:
800
- raise ResponseNotChunked(
801
- "Response is not chunked. "
802
- "Header 'transfer-encoding: chunked' is missing."
803
- )
804
- if not self.supports_chunked_reads():
805
- raise BodyNotHttplibCompatible(
806
- "Body should be http.client.HTTPResponse like. "
807
- "It should have have an fp attribute which returns raw chunks."
808
- )
809
-
810
- with self._error_catcher():
811
- # Don't bother reading the body of a HEAD request.
812
- if self._original_response and is_response_to_head(self._original_response):
813
- self._original_response.close()
814
- return
815
-
816
- # If a response is already read and closed
817
- # then return immediately.
818
- if self._fp.fp is None:
819
- return
820
-
821
- while True:
822
- self._update_chunk_length()
823
- if self.chunk_left == 0:
824
- break
825
- chunk = self._handle_chunk(amt)
826
- decoded = self._decode(
827
- chunk, decode_content=decode_content, flush_decoder=False
828
- )
829
- if decoded:
830
- yield decoded
831
-
832
- if decode_content:
833
- # On CPython and PyPy, we should never need to flush the
834
- # decoder. However, on Jython we *might* need to, so
835
- # lets defensively do it anyway.
836
- decoded = self._flush_decoder()
837
- if decoded: # Platform-specific: Jython.
838
- yield decoded
839
-
840
- # Chunk content ends with \r\n: discard it.
841
- while True:
842
- line = self._fp.fp.readline()
843
- if not line:
844
- # Some sites may not end with '\r\n'.
845
- break
846
- if line == b"\r\n":
847
- break
848
-
849
- # We read everything; close the "file".
850
- if self._original_response:
851
- self._original_response.close()
852
-
853
- def geturl(self):
854
- """
855
- Returns the URL that was the source of this response.
856
- If the request that generated this response redirected, this method
857
- will return the final redirect location.
858
- """
859
- if self.retries is not None and len(self.retries.history):
860
- return self.retries.history[-1].redirect_location
861
- else:
862
- return self._request_url
863
-
864
- def __iter__(self):
865
- buffer = []
866
- for chunk in self.stream(decode_content=True):
867
- if b"\n" in chunk:
868
- chunk = chunk.split(b"\n")
869
- yield b"".join(buffer) + chunk[0] + b"\n"
870
- for x in chunk[1:-1]:
871
- yield x + b"\n"
872
- if chunk[-1]:
873
- buffer = [chunk[-1]]
874
- else:
875
- buffer = []
876
- else:
877
- buffer.append(chunk)
878
- if buffer:
879
- yield b"".join(buffer)