quarchpy 2.1.14.dev3__py2.py3-none-any.whl → 2.1.14.dev5__py2.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.
- quarchpy/.idea/.name +1 -0
- quarchpy/.idea/workspace.xml +70 -11
- quarchpy/__pycache__/_version.cpython-311.pyc +0 -0
- quarchpy/__pycache__/run.cpython-311.pyc +0 -0
- quarchpy/_version.py +1 -1
- quarchpy/_version.py.bak +1 -0
- quarchpy/connection_specific/__pycache__/connection_QIS.cpython-311.pyc +0 -0
- quarchpy/connection_specific/connection_QIS.py +22 -9
- quarchpy/connection_specific/connection_QIS.py.bak +35 -17
- quarchpy/connection_specific/connection_ReST.py +26 -16
- quarchpy/debug/__pycache__/module_debug.cpython-311.pyc +0 -0
- quarchpy/debug/__pycache__/simple_terminal.cpython-311.pyc +0 -0
- quarchpy/debug/__pycache__/upgrade_quarchpy.cpython-311.pyc +0 -0
- quarchpy/device/__pycache__/scanDevices.cpython-311.pyc +0 -0
- quarchpy/device/scanDevices.py +2 -4
- quarchpy/device/scanDevices.py.bak +657 -0
- quarchpy/qis/qisFuncs.py +25 -42
- quarchpy/qis/qisFuncs.py.bak +213 -0
- quarchpy/qps/__pycache__/qpsFuncs.cpython-311.pyc +0 -0
- quarchpy/qps/qpsFuncs.py +18 -22
- quarchpy/qps/qpsFuncs.py.bak +224 -0
- quarchpy/venv/.gitignore +2 -0
- quarchpy/venv/Include/Python-ast.h +535 -0
- quarchpy/venv/Include/Python.h +181 -0
- quarchpy/venv/Include/abstract.h +1396 -0
- quarchpy/venv/Include/asdl.h +45 -0
- quarchpy/venv/Include/ast.h +13 -0
- quarchpy/venv/Include/bitset.h +32 -0
- quarchpy/venv/Include/boolobject.h +36 -0
- quarchpy/venv/Include/bufferobject.h +33 -0
- quarchpy/venv/Include/bytearrayobject.h +57 -0
- quarchpy/venv/Include/bytes_methods.h +75 -0
- quarchpy/venv/Include/bytesobject.h +27 -0
- quarchpy/venv/Include/cStringIO.h +73 -0
- quarchpy/venv/Include/cellobject.h +28 -0
- quarchpy/venv/Include/ceval.h +154 -0
- quarchpy/venv/Include/classobject.h +83 -0
- quarchpy/venv/Include/cobject.h +89 -0
- quarchpy/venv/Include/code.h +116 -0
- quarchpy/venv/Include/codecs.h +212 -0
- quarchpy/venv/Include/compile.h +40 -0
- quarchpy/venv/Include/complexobject.h +66 -0
- quarchpy/venv/Include/datetime.h +239 -0
- quarchpy/venv/Include/descrobject.h +94 -0
- quarchpy/venv/Include/dictobject.h +160 -0
- quarchpy/venv/Include/dtoa.h +15 -0
- quarchpy/venv/Include/enumobject.h +17 -0
- quarchpy/venv/Include/errcode.h +37 -0
- quarchpy/venv/Include/eval.h +25 -0
- quarchpy/venv/Include/fileobject.h +97 -0
- quarchpy/venv/Include/floatobject.h +140 -0
- quarchpy/venv/Include/frameobject.h +89 -0
- quarchpy/venv/Include/funcobject.h +76 -0
- quarchpy/venv/Include/genobject.h +40 -0
- quarchpy/venv/Include/graminit.h +87 -0
- quarchpy/venv/Include/grammar.h +94 -0
- quarchpy/venv/Include/import.h +71 -0
- quarchpy/venv/Include/intobject.h +84 -0
- quarchpy/venv/Include/intrcheck.h +15 -0
- quarchpy/venv/Include/iterobject.h +23 -0
- quarchpy/venv/Include/listobject.h +68 -0
- quarchpy/venv/Include/longintrepr.h +103 -0
- quarchpy/venv/Include/longobject.h +135 -0
- quarchpy/venv/Include/marshal.h +25 -0
- quarchpy/venv/Include/memoryobject.h +74 -0
- quarchpy/venv/Include/metagrammar.h +18 -0
- quarchpy/venv/Include/methodobject.h +93 -0
- quarchpy/venv/Include/modsupport.h +134 -0
- quarchpy/venv/Include/moduleobject.h +24 -0
- quarchpy/venv/Include/node.h +41 -0
- quarchpy/venv/Include/object.h +1046 -0
- quarchpy/venv/Include/objimpl.h +369 -0
- quarchpy/venv/Include/opcode.h +171 -0
- quarchpy/venv/Include/osdefs.h +63 -0
- quarchpy/venv/Include/parsetok.h +64 -0
- quarchpy/venv/Include/patchlevel.h +43 -0
- quarchpy/venv/Include/pgen.h +18 -0
- quarchpy/venv/Include/pgenheaders.h +43 -0
- quarchpy/venv/Include/py_curses.h +177 -0
- quarchpy/venv/Include/pyarena.h +62 -0
- quarchpy/venv/Include/pycapsule.h +56 -0
- quarchpy/venv/Include/pyconfig.h +770 -0
- quarchpy/venv/Include/pyctype.h +31 -0
- quarchpy/venv/Include/pydebug.h +41 -0
- quarchpy/venv/Include/pyerrors.h +329 -0
- quarchpy/venv/Include/pyexpat.h +50 -0
- quarchpy/venv/Include/pyfpe.h +176 -0
- quarchpy/venv/Include/pygetopt.h +18 -0
- quarchpy/venv/Include/pymacconfig.h +102 -0
- quarchpy/venv/Include/pymactoolbox.h +232 -0
- quarchpy/venv/Include/pymath.h +214 -0
- quarchpy/venv/Include/pymem.h +122 -0
- quarchpy/venv/Include/pyport.h +950 -0
- quarchpy/venv/Include/pystate.h +200 -0
- quarchpy/venv/Include/pystrcmp.h +23 -0
- quarchpy/venv/Include/pystrtod.h +45 -0
- quarchpy/venv/Include/pythonrun.h +181 -0
- quarchpy/venv/Include/pythread.h +41 -0
- quarchpy/venv/Include/rangeobject.h +28 -0
- quarchpy/venv/Include/setobject.h +99 -0
- quarchpy/venv/Include/sliceobject.h +50 -0
- quarchpy/venv/Include/stringobject.h +210 -0
- quarchpy/venv/Include/structmember.h +99 -0
- quarchpy/venv/Include/structseq.h +41 -0
- quarchpy/venv/Include/symtable.h +98 -0
- quarchpy/venv/Include/sysmodule.h +31 -0
- quarchpy/venv/Include/timefuncs.h +26 -0
- quarchpy/venv/Include/token.h +85 -0
- quarchpy/venv/Include/traceback.h +31 -0
- quarchpy/venv/Include/tupleobject.h +61 -0
- quarchpy/venv/Include/ucnhash.h +33 -0
- quarchpy/venv/Include/unicodeobject.h +1413 -0
- quarchpy/venv/Include/warnings.h +23 -0
- quarchpy/venv/Include/weakrefobject.h +82 -0
- quarchpy/venv/Lib/os.py +742 -0
- quarchpy/venv/Lib/os.pyc +0 -0
- quarchpy/venv/Lib/site-packages/_virtualenv.pth +1 -0
- quarchpy/venv/Lib/site-packages/_virtualenv.py +130 -0
- quarchpy/venv/Lib/site-packages/_virtualenv.pyc +0 -0
- quarchpy/venv/Lib/site-packages/easy_install.py +5 -0
- quarchpy/venv/Lib/site-packages/pip/__init__.py +18 -0
- quarchpy/venv/Lib/site-packages/pip/__main__.py +26 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/__init__.py +17 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/build_env.py +242 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/cache.py +346 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/cli/__init__.py +4 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/cli/autocompletion.py +164 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/cli/base_command.py +260 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py +971 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/cli/command_context.py +36 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/cli/main.py +75 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/cli/main_parser.py +96 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/cli/parser.py +285 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/cli/progress_bars.py +280 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/cli/req_command.py +436 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/cli/spinners.py +173 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/cli/status_codes.py +8 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/commands/__init__.py +123 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/commands/cache.py +234 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/commands/check.py +51 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/commands/completion.py +98 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/commands/configuration.py +280 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/commands/debug.py +230 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/commands/download.py +143 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/commands/freeze.py +116 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/commands/hash.py +63 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/commands/help.py +46 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/commands/install.py +737 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/commands/list.py +327 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/commands/search.py +169 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/commands/show.py +186 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/commands/uninstall.py +95 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/commands/wheel.py +198 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/configuration.py +407 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/distributions/__init__.py +24 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/distributions/base.py +46 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/distributions/installed.py +25 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/distributions/sdist.py +105 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/distributions/wheel.py +37 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/exceptions.py +391 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/index/__init__.py +2 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/index/collector.py +667 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/index/package_finder.py +1015 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/locations.py +193 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/main.py +16 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/models/__init__.py +2 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/models/candidate.py +39 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/models/direct_url.py +243 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/models/format_control.py +92 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/models/index.py +34 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/models/link.py +246 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/models/scheme.py +31 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/models/search_scope.py +135 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/models/selection_prefs.py +50 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/models/target_python.py +117 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/models/wheel.py +78 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/network/__init__.py +2 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/network/auth.py +310 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/network/cache.py +79 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/network/download.py +202 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py +231 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/network/session.py +428 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/network/utils.py +97 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/network/xmlrpc.py +53 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/operations/__init__.py +0 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/operations/build/__init__.py +0 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/operations/build/metadata.py +38 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py +77 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/operations/build/wheel.py +47 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py +113 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/operations/check.py +155 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/operations/freeze.py +277 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/operations/install/__init__.py +2 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py +52 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/operations/install/legacy.py +130 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/operations/install/wheel.py +846 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/operations/prepare.py +608 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/pyproject.py +196 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/req/__init__.py +103 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/req/constructors.py +476 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/req/req_file.py +574 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/req/req_install.py +907 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/req/req_set.py +204 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/req/req_tracker.py +151 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/req/req_uninstall.py +657 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/resolution/__init__.py +0 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/resolution/base.py +21 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py +0 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py +473 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py +0 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py +156 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py +604 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py +504 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py +101 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py +174 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py +84 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py +201 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py +296 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/self_outdated_check.py +197 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/__init__.py +0 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/appdirs.py +44 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/compat.py +293 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py +178 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/datetime.py +14 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/deprecation.py +104 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py +126 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/distutils_args.py +48 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/encoding.py +41 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/entrypoints.py +31 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/filesystem.py +224 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/filetypes.py +26 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/glibc.py +98 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/hashes.py +169 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/inject_securetransport.py +36 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/logging.py +399 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/misc.py +962 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/models.py +44 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/packaging.py +95 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/parallel.py +107 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/pkg_resources.py +44 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py +181 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/subprocess.py +299 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/temp_dir.py +284 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/typing.py +38 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/unpacking.py +281 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/urls.py +55 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/virtualenv.py +119 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/utils/wheel.py +225 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/vcs/__init__.py +15 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/vcs/bazaar.py +123 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/vcs/git.py +454 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/vcs/mercurial.py +172 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/vcs/subversion.py +340 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py +735 -0
- quarchpy/venv/Lib/site-packages/pip/_internal/wheel_builder.py +362 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/__init__.py +114 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/appdirs.py +633 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py +11 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py +57 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py +133 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py +39 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py +2 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py +146 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py +33 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/compat.py +29 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py +376 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py +80 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py +135 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py +188 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py +29 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/certifi/__init__.py +3 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/certifi/__main__.py +12 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem +4606 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/certifi/core.py +60 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/__init__.py +39 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/big5freq.py +386 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/big5prober.py +47 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/chardistribution.py +233 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py +106 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/charsetprober.py +145 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py +1 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py +85 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py +88 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/compat.py +34 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/cp949prober.py +49 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/enums.py +76 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/escprober.py +101 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/escsm.py +246 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py +92 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py +195 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/euckrprober.py +47 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py +387 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/euctwprober.py +46 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py +283 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py +46 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py +292 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/jisfreq.py +325 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/jpcntx.py +233 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py +228 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/langcyrillicmodel.py +333 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py +225 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py +200 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py +225 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py +199 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py +193 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/latin1prober.py +145 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py +91 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py +54 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/mbcssm.py +572 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py +132 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py +73 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/sjisprober.py +92 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/universaldetector.py +286 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/utf8prober.py +82 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/version.py +9 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/colorama/__init__.py +6 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/colorama/ansi.py +102 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py +258 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/colorama/initialise.py +80 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/colorama/win32.py +152 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/colorama/winterm.py +169 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/contextlib2.py +518 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/__init__.py +23 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/_backport/__init__.py +6 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/_backport/misc.py +41 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/_backport/shutil.py +764 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg +84 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py +786 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/_backport/tarfile.py +2607 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/compat.py +1120 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/database.py +1339 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/index.py +516 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/locators.py +1302 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/manifest.py +393 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/markers.py +131 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/metadata.py +1056 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/resources.py +355 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/scripts.py +419 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/t32.exe +0 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/t64.exe +0 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/util.py +1761 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/version.py +736 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/w32.exe +0 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/w64.exe +0 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/wheel.py +1018 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/distro.py +1230 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/__init__.py +35 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/_ihatexml.py +289 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/_inputstream.py +918 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/_tokenizer.py +1735 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__init__.py +5 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/_trie/_base.py +40 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/_trie/py.py +67 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/_utils.py +159 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/constants.py +2946 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/filters/__init__.py +0 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py +29 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/filters/base.py +12 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py +73 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/filters/lint.py +93 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/filters/optionaltags.py +207 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/filters/sanitizer.py +916 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py +38 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/html5parser.py +2795 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/serializer.py +409 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py +30 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py +54 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/sax.py +50 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py +88 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/base.py +417 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/dom.py +239 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree.py +343 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py +392 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py +154 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/base.py +252 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/dom.py +43 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree.py +131 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py +215 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py +69 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/idna/__init__.py +2 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/idna/codec.py +118 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/idna/compat.py +12 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/idna/core.py +400 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/idna/idnadata.py +2050 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/idna/intranges.py +53 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/idna/package_data.py +2 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/idna/uts46data.py +8357 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/ipaddress.py +2420 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/msgpack/__init__.py +54 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/msgpack/_version.py +1 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/msgpack/exceptions.py +48 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/msgpack/ext.py +191 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/msgpack/fallback.py +1063 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/__about__.py +27 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/__init__.py +26 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/_compat.py +38 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/_structures.py +86 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/_typing.py +48 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/markers.py +328 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/requirements.py +151 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/specifiers.py +864 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/tags.py +852 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/utils.py +67 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/version.py +556 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/__init__.py +6 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/_in_process.py +280 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/build.py +124 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/check.py +203 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/colorlog.py +115 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/compat.py +34 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/dirtools.py +44 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/envbuild.py +167 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/meta.py +92 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/wrappers.py +327 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py +3296 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/pkg_resources/py31compat.py +23 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/progress/__init__.py +177 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/progress/bar.py +91 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/progress/counter.py +41 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/progress/spinner.py +43 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/pyparsing.py +7107 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/requests/__init__.py +144 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/requests/__version__.py +14 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/requests/_internal_utils.py +42 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/requests/adapters.py +533 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/requests/api.py +161 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/requests/auth.py +305 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/requests/certs.py +18 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/requests/compat.py +76 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/requests/cookies.py +549 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/requests/exceptions.py +123 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/requests/help.py +119 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/requests/hooks.py +34 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/requests/models.py +956 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/requests/packages.py +16 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/requests/sessions.py +781 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/requests/status_codes.py +123 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/requests/structures.py +105 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/requests/utils.py +988 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/resolvelib/__init__.py +26 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__init__.py +0 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py +6 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/resolvelib/providers.py +119 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/resolvelib/reporters.py +37 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers.py +454 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/resolvelib/structs.py +149 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/retrying.py +267 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/six.py +982 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/toml/__init__.py +25 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/toml/decoder.py +1057 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/toml/encoder.py +304 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/toml/ordered.py +15 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/toml/tz.py +24 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/__init__.py +85 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/_collections.py +337 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/_version.py +2 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/connection.py +535 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py +1067 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py +0 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py +36 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py +0 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py +519 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py +396 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py +314 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py +121 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py +509 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py +920 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py +216 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/exceptions.py +313 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/fields.py +274 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/filepost.py +98 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py +5 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py +0 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py +51 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/packages/six.py +1021 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py +22 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py +160 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py +536 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/request.py +170 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/response.py +821 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py +49 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/connection.py +150 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/proxy.py +56 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/queue.py +22 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/request.py +143 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/response.py +107 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py +601 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py +474 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/ssltransport.py +221 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py +268 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/url.py +430 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/wait.py +153 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/vendor.txt +24 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/webencodings/__init__.py +342 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/webencodings/labels.py +231 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/webencodings/mklabels.py +59 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/webencodings/tests.py +153 -0
- quarchpy/venv/Lib/site-packages/pip/_vendor/webencodings/x_user_defined.py +325 -0
- quarchpy/venv/Lib/site-packages/pip-20.3.4.dist-info/INSTALLER +1 -0
- quarchpy/venv/Lib/site-packages/pip-20.3.4.dist-info/LICENSE.txt +20 -0
- quarchpy/venv/Lib/site-packages/pip-20.3.4.dist-info/METADATA +94 -0
- quarchpy/venv/Lib/site-packages/pip-20.3.4.dist-info/RECORD +812 -0
- quarchpy/venv/Lib/site-packages/pip-20.3.4.dist-info/WHEEL +6 -0
- quarchpy/venv/Lib/site-packages/pip-20.3.4.dist-info/entry_points.txt +5 -0
- quarchpy/venv/Lib/site-packages/pip-20.3.4.dist-info/top_level.txt +1 -0
- quarchpy/venv/Lib/site-packages/pip-20.3.4.virtualenv +0 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/__init__.py +3296 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/__init__.pyc +0 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/__init__.py +0 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/__init__.pyc +0 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/appdirs.py +608 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/appdirs.pyc +0 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.py +21 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.pyc +0 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.py +14 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.pyc +0 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/_compat.py +30 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/_compat.pyc +0 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.py +68 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.pyc +0 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/markers.py +301 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/markers.pyc +0 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.py +127 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.pyc +0 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py +774 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.pyc +0 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/utils.py +14 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/version.py +393 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/version.pyc +0 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing.py +5742 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing.pyc +0 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/six.py +868 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/six.pyc +0 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/extern/__init__.py +73 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/extern/__init__.pyc +0 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/py31compat.py +23 -0
- quarchpy/venv/Lib/site-packages/pkg_resources/py31compat.pyc +0 -0
- quarchpy/venv/Lib/site-packages/setuptools/__init__.py +245 -0
- quarchpy/venv/Lib/site-packages/setuptools/_deprecation_warning.py +7 -0
- quarchpy/venv/Lib/site-packages/setuptools/_imp.py +73 -0
- quarchpy/venv/Lib/site-packages/setuptools/_vendor/__init__.py +0 -0
- quarchpy/venv/Lib/site-packages/setuptools/_vendor/ordered_set.py +488 -0
- quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/__about__.py +27 -0
- quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/__init__.py +26 -0
- quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/_compat.py +31 -0
- quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/_structures.py +68 -0
- quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/markers.py +296 -0
- quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/requirements.py +138 -0
- quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py +749 -0
- quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/tags.py +404 -0
- quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/utils.py +57 -0
- quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/version.py +420 -0
- quarchpy/venv/Lib/site-packages/setuptools/_vendor/pyparsing.py +5742 -0
- quarchpy/venv/Lib/site-packages/setuptools/_vendor/six.py +868 -0
- quarchpy/venv/Lib/site-packages/setuptools/archive_util.py +173 -0
- quarchpy/venv/Lib/site-packages/setuptools/build_meta.py +264 -0
- quarchpy/venv/Lib/site-packages/setuptools/cli-32.exe +0 -0
- quarchpy/venv/Lib/site-packages/setuptools/cli-64.exe +0 -0
- quarchpy/venv/Lib/site-packages/setuptools/cli.exe +0 -0
- quarchpy/venv/Lib/site-packages/setuptools/command/__init__.py +17 -0
- quarchpy/venv/Lib/site-packages/setuptools/command/alias.py +80 -0
- quarchpy/venv/Lib/site-packages/setuptools/command/bdist_egg.py +502 -0
- quarchpy/venv/Lib/site-packages/setuptools/command/bdist_rpm.py +43 -0
- quarchpy/venv/Lib/site-packages/setuptools/command/bdist_wininst.py +21 -0
- quarchpy/venv/Lib/site-packages/setuptools/command/build_clib.py +98 -0
- quarchpy/venv/Lib/site-packages/setuptools/command/build_ext.py +327 -0
- quarchpy/venv/Lib/site-packages/setuptools/command/build_py.py +270 -0
- quarchpy/venv/Lib/site-packages/setuptools/command/develop.py +221 -0
- quarchpy/venv/Lib/site-packages/setuptools/command/dist_info.py +36 -0
- quarchpy/venv/Lib/site-packages/setuptools/command/easy_install.py +2347 -0
- quarchpy/venv/Lib/site-packages/setuptools/command/egg_info.py +717 -0
- quarchpy/venv/Lib/site-packages/setuptools/command/install.py +125 -0
- quarchpy/venv/Lib/site-packages/setuptools/command/install_egg_info.py +62 -0
- quarchpy/venv/Lib/site-packages/setuptools/command/install_lib.py +121 -0
- quarchpy/venv/Lib/site-packages/setuptools/command/install_scripts.py +65 -0
- quarchpy/venv/Lib/site-packages/setuptools/command/launcher manifest.xml +15 -0
- quarchpy/venv/Lib/site-packages/setuptools/command/py36compat.py +136 -0
- quarchpy/venv/Lib/site-packages/setuptools/command/register.py +18 -0
- quarchpy/venv/Lib/site-packages/setuptools/command/rotate.py +66 -0
- quarchpy/venv/Lib/site-packages/setuptools/command/saveopts.py +22 -0
- quarchpy/venv/Lib/site-packages/setuptools/command/sdist.py +252 -0
- quarchpy/venv/Lib/site-packages/setuptools/command/setopt.py +149 -0
- quarchpy/venv/Lib/site-packages/setuptools/command/test.py +279 -0
- quarchpy/venv/Lib/site-packages/setuptools/command/upload.py +17 -0
- quarchpy/venv/Lib/site-packages/setuptools/command/upload_docs.py +206 -0
- quarchpy/venv/Lib/site-packages/setuptools/config.py +659 -0
- quarchpy/venv/Lib/site-packages/setuptools/dep_util.py +23 -0
- quarchpy/venv/Lib/site-packages/setuptools/depends.py +176 -0
- quarchpy/venv/Lib/site-packages/setuptools/dist.py +1274 -0
- quarchpy/venv/Lib/site-packages/setuptools/errors.py +16 -0
- quarchpy/venv/Lib/site-packages/setuptools/extension.py +57 -0
- quarchpy/venv/Lib/site-packages/setuptools/extern/__init__.py +73 -0
- quarchpy/venv/Lib/site-packages/setuptools/glob.py +174 -0
- quarchpy/venv/Lib/site-packages/setuptools/gui-32.exe +0 -0
- quarchpy/venv/Lib/site-packages/setuptools/gui-64.exe +0 -0
- quarchpy/venv/Lib/site-packages/setuptools/gui.exe +0 -0
- quarchpy/venv/Lib/site-packages/setuptools/installer.py +150 -0
- quarchpy/venv/Lib/site-packages/setuptools/launch.py +35 -0
- quarchpy/venv/Lib/site-packages/setuptools/lib2to3_ex.py +62 -0
- quarchpy/venv/Lib/site-packages/setuptools/monkey.py +179 -0
- quarchpy/venv/Lib/site-packages/setuptools/msvc.py +1679 -0
- quarchpy/venv/Lib/site-packages/setuptools/namespaces.py +107 -0
- quarchpy/venv/Lib/site-packages/setuptools/package_index.py +1136 -0
- quarchpy/venv/Lib/site-packages/setuptools/py27compat.py +60 -0
- quarchpy/venv/Lib/site-packages/setuptools/py31compat.py +32 -0
- quarchpy/venv/Lib/site-packages/setuptools/py33compat.py +59 -0
- quarchpy/venv/Lib/site-packages/setuptools/py34compat.py +13 -0
- quarchpy/venv/Lib/site-packages/setuptools/sandbox.py +491 -0
- quarchpy/venv/Lib/site-packages/setuptools/script (dev).tmpl +6 -0
- quarchpy/venv/Lib/site-packages/setuptools/script.tmpl +3 -0
- quarchpy/venv/Lib/site-packages/setuptools/site-patch.py +74 -0
- quarchpy/venv/Lib/site-packages/setuptools/ssl_support.py +260 -0
- quarchpy/venv/Lib/site-packages/setuptools/unicode_utils.py +44 -0
- quarchpy/venv/Lib/site-packages/setuptools/version.py +6 -0
- quarchpy/venv/Lib/site-packages/setuptools/wheel.py +220 -0
- quarchpy/venv/Lib/site-packages/setuptools/windows_support.py +29 -0
- quarchpy/venv/Lib/site-packages/setuptools-44.1.1.dist-info/INSTALLER +1 -0
- quarchpy/venv/Lib/site-packages/setuptools-44.1.1.dist-info/LICENSE +19 -0
- quarchpy/venv/Lib/site-packages/setuptools-44.1.1.dist-info/METADATA +86 -0
- quarchpy/venv/Lib/site-packages/setuptools-44.1.1.dist-info/RECORD +207 -0
- quarchpy/venv/Lib/site-packages/setuptools-44.1.1.dist-info/WHEEL +6 -0
- quarchpy/venv/Lib/site-packages/setuptools-44.1.1.dist-info/dependency_links.txt +2 -0
- quarchpy/venv/Lib/site-packages/setuptools-44.1.1.dist-info/entry_points.txt +69 -0
- quarchpy/venv/Lib/site-packages/setuptools-44.1.1.dist-info/top_level.txt +3 -0
- quarchpy/venv/Lib/site-packages/setuptools-44.1.1.dist-info/zip-safe +1 -0
- quarchpy/venv/Lib/site-packages/setuptools-44.1.1.virtualenv +0 -0
- quarchpy/venv/Lib/site-packages/wheel/__init__.py +1 -0
- quarchpy/venv/Lib/site-packages/wheel/__main__.py +19 -0
- quarchpy/venv/Lib/site-packages/wheel/bdist_wheel.py +492 -0
- quarchpy/venv/Lib/site-packages/wheel/cli/__init__.py +88 -0
- quarchpy/venv/Lib/site-packages/wheel/cli/convert.py +269 -0
- quarchpy/venv/Lib/site-packages/wheel/cli/pack.py +82 -0
- quarchpy/venv/Lib/site-packages/wheel/cli/unpack.py +25 -0
- quarchpy/venv/Lib/site-packages/wheel/macosx_libfile.py +428 -0
- quarchpy/venv/Lib/site-packages/wheel/metadata.py +133 -0
- quarchpy/venv/Lib/site-packages/wheel/pkginfo.py +43 -0
- quarchpy/venv/Lib/site-packages/wheel/util.py +46 -0
- quarchpy/venv/Lib/site-packages/wheel/vendored/__init__.py +0 -0
- quarchpy/venv/Lib/site-packages/wheel/vendored/packaging/__init__.py +0 -0
- quarchpy/venv/Lib/site-packages/wheel/vendored/packaging/_typing.py +48 -0
- quarchpy/venv/Lib/site-packages/wheel/vendored/packaging/tags.py +866 -0
- quarchpy/venv/Lib/site-packages/wheel/wheelfile.py +181 -0
- quarchpy/venv/Lib/site-packages/wheel-0.37.1.dist-info/INSTALLER +1 -0
- quarchpy/venv/Lib/site-packages/wheel-0.37.1.dist-info/LICENSE.txt +22 -0
- quarchpy/venv/Lib/site-packages/wheel-0.37.1.dist-info/METADATA +69 -0
- quarchpy/venv/Lib/site-packages/wheel-0.37.1.dist-info/RECORD +49 -0
- quarchpy/venv/Lib/site-packages/wheel-0.37.1.dist-info/WHEEL +6 -0
- quarchpy/venv/Lib/site-packages/wheel-0.37.1.dist-info/entry_points.txt +6 -0
- quarchpy/venv/Lib/site-packages/wheel-0.37.1.dist-info/top_level.txt +1 -0
- quarchpy/venv/Lib/site-packages/wheel-0.37.1.virtualenv +0 -0
- quarchpy/venv/Lib/site.py +190 -0
- quarchpy/venv/Lib/site.pyc +0 -0
- quarchpy/venv/Scripts/activate +83 -0
- quarchpy/venv/Scripts/activate.bat +39 -0
- quarchpy/venv/Scripts/activate.fish +100 -0
- quarchpy/venv/Scripts/activate.nu +41 -0
- quarchpy/venv/Scripts/activate.ps1 +60 -0
- quarchpy/venv/Scripts/activate_this.py +32 -0
- quarchpy/venv/Scripts/deactivate.bat +19 -0
- quarchpy/venv/Scripts/deactivate.nu +11 -0
- quarchpy/venv/Scripts/easy_install-2.7.exe +0 -0
- quarchpy/venv/Scripts/easy_install.exe +0 -0
- quarchpy/venv/Scripts/easy_install2.7.exe +0 -0
- quarchpy/venv/Scripts/easy_install2.exe +0 -0
- quarchpy/venv/Scripts/pip-2.7.exe +0 -0
- quarchpy/venv/Scripts/pip.exe +0 -0
- quarchpy/venv/Scripts/pip2.7.exe +0 -0
- quarchpy/venv/Scripts/pip2.exe +0 -0
- quarchpy/venv/Scripts/pydoc.bat +1 -0
- quarchpy/venv/Scripts/python.exe +0 -0
- quarchpy/venv/Scripts/python27.dll +0 -0
- quarchpy/venv/Scripts/pythonw.exe +0 -0
- quarchpy/venv/Scripts/wheel-2.7.exe +0 -0
- quarchpy/venv/Scripts/wheel.exe +0 -0
- quarchpy/venv/Scripts/wheel2.7.exe +0 -0
- quarchpy/venv/Scripts/wheel2.exe +0 -0
- quarchpy/venv/libs/_bsddb.lib +0 -0
- quarchpy/venv/libs/_ctypes.lib +0 -0
- quarchpy/venv/libs/_ctypes_test.lib +0 -0
- quarchpy/venv/libs/_elementtree.lib +0 -0
- quarchpy/venv/libs/_hashlib.lib +0 -0
- quarchpy/venv/libs/_msi.lib +0 -0
- quarchpy/venv/libs/_multiprocessing.lib +0 -0
- quarchpy/venv/libs/_socket.lib +0 -0
- quarchpy/venv/libs/_sqlite3.lib +0 -0
- quarchpy/venv/libs/_ssl.lib +0 -0
- quarchpy/venv/libs/_testcapi.lib +0 -0
- quarchpy/venv/libs/_tkinter.lib +0 -0
- quarchpy/venv/libs/bz2.lib +0 -0
- quarchpy/venv/libs/libpython27.a +0 -0
- quarchpy/venv/libs/pyexpat.lib +0 -0
- quarchpy/venv/libs/python27.lib +0 -0
- quarchpy/venv/libs/select.lib +0 -0
- quarchpy/venv/libs/unicodedata.lib +0 -0
- quarchpy/venv/libs/winsound.lib +0 -0
- quarchpy/venv/pyvenv.cfg +8 -0
- {quarchpy-2.1.14.dev3.dist-info → quarchpy-2.1.14.dev5.dist-info}/METADATA +1 -1
- quarchpy-2.1.14.dev5.dist-info/RECORD +1219 -0
- quarchpy-2.1.14.dev3.dist-info/RECORD +0 -535
- {quarchpy-2.1.14.dev3.dist-info → quarchpy-2.1.14.dev5.dist-info}/WHEEL +0 -0
- {quarchpy-2.1.14.dev3.dist-info → quarchpy-2.1.14.dev5.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,396 @@
|
|
1
|
+
"""
|
2
|
+
Low-level helpers for the SecureTransport bindings.
|
3
|
+
|
4
|
+
These are Python functions that are not directly related to the high-level APIs
|
5
|
+
but are necessary to get them to work. They include a whole bunch of low-level
|
6
|
+
CoreFoundation messing about and memory management. The concerns in this module
|
7
|
+
are almost entirely about trying to avoid memory leaks and providing
|
8
|
+
appropriate and useful assistance to the higher-level code.
|
9
|
+
"""
|
10
|
+
import base64
|
11
|
+
import ctypes
|
12
|
+
import itertools
|
13
|
+
import os
|
14
|
+
import re
|
15
|
+
import ssl
|
16
|
+
import struct
|
17
|
+
import tempfile
|
18
|
+
|
19
|
+
from .bindings import CFConst, CoreFoundation, Security
|
20
|
+
|
21
|
+
# This regular expression is used to grab PEM data out of a PEM bundle.
|
22
|
+
_PEM_CERTS_RE = re.compile(
|
23
|
+
b"-----BEGIN CERTIFICATE-----\n(.*?)\n-----END CERTIFICATE-----", re.DOTALL
|
24
|
+
)
|
25
|
+
|
26
|
+
|
27
|
+
def _cf_data_from_bytes(bytestring):
|
28
|
+
"""
|
29
|
+
Given a bytestring, create a CFData object from it. This CFData object must
|
30
|
+
be CFReleased by the caller.
|
31
|
+
"""
|
32
|
+
return CoreFoundation.CFDataCreate(
|
33
|
+
CoreFoundation.kCFAllocatorDefault, bytestring, len(bytestring)
|
34
|
+
)
|
35
|
+
|
36
|
+
|
37
|
+
def _cf_dictionary_from_tuples(tuples):
|
38
|
+
"""
|
39
|
+
Given a list of Python tuples, create an associated CFDictionary.
|
40
|
+
"""
|
41
|
+
dictionary_size = len(tuples)
|
42
|
+
|
43
|
+
# We need to get the dictionary keys and values out in the same order.
|
44
|
+
keys = (t[0] for t in tuples)
|
45
|
+
values = (t[1] for t in tuples)
|
46
|
+
cf_keys = (CoreFoundation.CFTypeRef * dictionary_size)(*keys)
|
47
|
+
cf_values = (CoreFoundation.CFTypeRef * dictionary_size)(*values)
|
48
|
+
|
49
|
+
return CoreFoundation.CFDictionaryCreate(
|
50
|
+
CoreFoundation.kCFAllocatorDefault,
|
51
|
+
cf_keys,
|
52
|
+
cf_values,
|
53
|
+
dictionary_size,
|
54
|
+
CoreFoundation.kCFTypeDictionaryKeyCallBacks,
|
55
|
+
CoreFoundation.kCFTypeDictionaryValueCallBacks,
|
56
|
+
)
|
57
|
+
|
58
|
+
|
59
|
+
def _cfstr(py_bstr):
|
60
|
+
"""
|
61
|
+
Given a Python binary data, create a CFString.
|
62
|
+
The string must be CFReleased by the caller.
|
63
|
+
"""
|
64
|
+
c_str = ctypes.c_char_p(py_bstr)
|
65
|
+
cf_str = CoreFoundation.CFStringCreateWithCString(
|
66
|
+
CoreFoundation.kCFAllocatorDefault,
|
67
|
+
c_str,
|
68
|
+
CFConst.kCFStringEncodingUTF8,
|
69
|
+
)
|
70
|
+
return cf_str
|
71
|
+
|
72
|
+
|
73
|
+
def _create_cfstring_array(lst):
|
74
|
+
"""
|
75
|
+
Given a list of Python binary data, create an associated CFMutableArray.
|
76
|
+
The array must be CFReleased by the caller.
|
77
|
+
|
78
|
+
Raises an ssl.SSLError on failure.
|
79
|
+
"""
|
80
|
+
cf_arr = None
|
81
|
+
try:
|
82
|
+
cf_arr = CoreFoundation.CFArrayCreateMutable(
|
83
|
+
CoreFoundation.kCFAllocatorDefault,
|
84
|
+
0,
|
85
|
+
ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks),
|
86
|
+
)
|
87
|
+
if not cf_arr:
|
88
|
+
raise MemoryError("Unable to allocate memory!")
|
89
|
+
for item in lst:
|
90
|
+
cf_str = _cfstr(item)
|
91
|
+
if not cf_str:
|
92
|
+
raise MemoryError("Unable to allocate memory!")
|
93
|
+
try:
|
94
|
+
CoreFoundation.CFArrayAppendValue(cf_arr, cf_str)
|
95
|
+
finally:
|
96
|
+
CoreFoundation.CFRelease(cf_str)
|
97
|
+
except BaseException as e:
|
98
|
+
if cf_arr:
|
99
|
+
CoreFoundation.CFRelease(cf_arr)
|
100
|
+
raise ssl.SSLError("Unable to allocate array: %s" % (e,))
|
101
|
+
return cf_arr
|
102
|
+
|
103
|
+
|
104
|
+
def _cf_string_to_unicode(value):
|
105
|
+
"""
|
106
|
+
Creates a Unicode string from a CFString object. Used entirely for error
|
107
|
+
reporting.
|
108
|
+
|
109
|
+
Yes, it annoys me quite a lot that this function is this complex.
|
110
|
+
"""
|
111
|
+
value_as_void_p = ctypes.cast(value, ctypes.POINTER(ctypes.c_void_p))
|
112
|
+
|
113
|
+
string = CoreFoundation.CFStringGetCStringPtr(
|
114
|
+
value_as_void_p, CFConst.kCFStringEncodingUTF8
|
115
|
+
)
|
116
|
+
if string is None:
|
117
|
+
buffer = ctypes.create_string_buffer(1024)
|
118
|
+
result = CoreFoundation.CFStringGetCString(
|
119
|
+
value_as_void_p, buffer, 1024, CFConst.kCFStringEncodingUTF8
|
120
|
+
)
|
121
|
+
if not result:
|
122
|
+
raise OSError("Error copying C string from CFStringRef")
|
123
|
+
string = buffer.value
|
124
|
+
if string is not None:
|
125
|
+
string = string.decode("utf-8")
|
126
|
+
return string
|
127
|
+
|
128
|
+
|
129
|
+
def _assert_no_error(error, exception_class=None):
|
130
|
+
"""
|
131
|
+
Checks the return code and throws an exception if there is an error to
|
132
|
+
report
|
133
|
+
"""
|
134
|
+
if error == 0:
|
135
|
+
return
|
136
|
+
|
137
|
+
cf_error_string = Security.SecCopyErrorMessageString(error, None)
|
138
|
+
output = _cf_string_to_unicode(cf_error_string)
|
139
|
+
CoreFoundation.CFRelease(cf_error_string)
|
140
|
+
|
141
|
+
if output is None or output == u"":
|
142
|
+
output = u"OSStatus %s" % error
|
143
|
+
|
144
|
+
if exception_class is None:
|
145
|
+
exception_class = ssl.SSLError
|
146
|
+
|
147
|
+
raise exception_class(output)
|
148
|
+
|
149
|
+
|
150
|
+
def _cert_array_from_pem(pem_bundle):
|
151
|
+
"""
|
152
|
+
Given a bundle of certs in PEM format, turns them into a CFArray of certs
|
153
|
+
that can be used to validate a cert chain.
|
154
|
+
"""
|
155
|
+
# Normalize the PEM bundle's line endings.
|
156
|
+
pem_bundle = pem_bundle.replace(b"\r\n", b"\n")
|
157
|
+
|
158
|
+
der_certs = [
|
159
|
+
base64.b64decode(match.group(1)) for match in _PEM_CERTS_RE.finditer(pem_bundle)
|
160
|
+
]
|
161
|
+
if not der_certs:
|
162
|
+
raise ssl.SSLError("No root certificates specified")
|
163
|
+
|
164
|
+
cert_array = CoreFoundation.CFArrayCreateMutable(
|
165
|
+
CoreFoundation.kCFAllocatorDefault,
|
166
|
+
0,
|
167
|
+
ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks),
|
168
|
+
)
|
169
|
+
if not cert_array:
|
170
|
+
raise ssl.SSLError("Unable to allocate memory!")
|
171
|
+
|
172
|
+
try:
|
173
|
+
for der_bytes in der_certs:
|
174
|
+
certdata = _cf_data_from_bytes(der_bytes)
|
175
|
+
if not certdata:
|
176
|
+
raise ssl.SSLError("Unable to allocate memory!")
|
177
|
+
cert = Security.SecCertificateCreateWithData(
|
178
|
+
CoreFoundation.kCFAllocatorDefault, certdata
|
179
|
+
)
|
180
|
+
CoreFoundation.CFRelease(certdata)
|
181
|
+
if not cert:
|
182
|
+
raise ssl.SSLError("Unable to build cert object!")
|
183
|
+
|
184
|
+
CoreFoundation.CFArrayAppendValue(cert_array, cert)
|
185
|
+
CoreFoundation.CFRelease(cert)
|
186
|
+
except Exception:
|
187
|
+
# We need to free the array before the exception bubbles further.
|
188
|
+
# We only want to do that if an error occurs: otherwise, the caller
|
189
|
+
# should free.
|
190
|
+
CoreFoundation.CFRelease(cert_array)
|
191
|
+
|
192
|
+
return cert_array
|
193
|
+
|
194
|
+
|
195
|
+
def _is_cert(item):
|
196
|
+
"""
|
197
|
+
Returns True if a given CFTypeRef is a certificate.
|
198
|
+
"""
|
199
|
+
expected = Security.SecCertificateGetTypeID()
|
200
|
+
return CoreFoundation.CFGetTypeID(item) == expected
|
201
|
+
|
202
|
+
|
203
|
+
def _is_identity(item):
|
204
|
+
"""
|
205
|
+
Returns True if a given CFTypeRef is an identity.
|
206
|
+
"""
|
207
|
+
expected = Security.SecIdentityGetTypeID()
|
208
|
+
return CoreFoundation.CFGetTypeID(item) == expected
|
209
|
+
|
210
|
+
|
211
|
+
def _temporary_keychain():
|
212
|
+
"""
|
213
|
+
This function creates a temporary Mac keychain that we can use to work with
|
214
|
+
credentials. This keychain uses a one-time password and a temporary file to
|
215
|
+
store the data. We expect to have one keychain per socket. The returned
|
216
|
+
SecKeychainRef must be freed by the caller, including calling
|
217
|
+
SecKeychainDelete.
|
218
|
+
|
219
|
+
Returns a tuple of the SecKeychainRef and the path to the temporary
|
220
|
+
directory that contains it.
|
221
|
+
"""
|
222
|
+
# Unfortunately, SecKeychainCreate requires a path to a keychain. This
|
223
|
+
# means we cannot use mkstemp to use a generic temporary file. Instead,
|
224
|
+
# we're going to create a temporary directory and a filename to use there.
|
225
|
+
# This filename will be 8 random bytes expanded into base64. We also need
|
226
|
+
# some random bytes to password-protect the keychain we're creating, so we
|
227
|
+
# ask for 40 random bytes.
|
228
|
+
random_bytes = os.urandom(40)
|
229
|
+
filename = base64.b16encode(random_bytes[:8]).decode("utf-8")
|
230
|
+
password = base64.b16encode(random_bytes[8:]) # Must be valid UTF-8
|
231
|
+
tempdirectory = tempfile.mkdtemp()
|
232
|
+
|
233
|
+
keychain_path = os.path.join(tempdirectory, filename).encode("utf-8")
|
234
|
+
|
235
|
+
# We now want to create the keychain itself.
|
236
|
+
keychain = Security.SecKeychainRef()
|
237
|
+
status = Security.SecKeychainCreate(
|
238
|
+
keychain_path, len(password), password, False, None, ctypes.byref(keychain)
|
239
|
+
)
|
240
|
+
_assert_no_error(status)
|
241
|
+
|
242
|
+
# Having created the keychain, we want to pass it off to the caller.
|
243
|
+
return keychain, tempdirectory
|
244
|
+
|
245
|
+
|
246
|
+
def _load_items_from_file(keychain, path):
|
247
|
+
"""
|
248
|
+
Given a single file, loads all the trust objects from it into arrays and
|
249
|
+
the keychain.
|
250
|
+
Returns a tuple of lists: the first list is a list of identities, the
|
251
|
+
second a list of certs.
|
252
|
+
"""
|
253
|
+
certificates = []
|
254
|
+
identities = []
|
255
|
+
result_array = None
|
256
|
+
|
257
|
+
with open(path, "rb") as f:
|
258
|
+
raw_filedata = f.read()
|
259
|
+
|
260
|
+
try:
|
261
|
+
filedata = CoreFoundation.CFDataCreate(
|
262
|
+
CoreFoundation.kCFAllocatorDefault, raw_filedata, len(raw_filedata)
|
263
|
+
)
|
264
|
+
result_array = CoreFoundation.CFArrayRef()
|
265
|
+
result = Security.SecItemImport(
|
266
|
+
filedata, # cert data
|
267
|
+
None, # Filename, leaving it out for now
|
268
|
+
None, # What the type of the file is, we don't care
|
269
|
+
None, # what's in the file, we don't care
|
270
|
+
0, # import flags
|
271
|
+
None, # key params, can include passphrase in the future
|
272
|
+
keychain, # The keychain to insert into
|
273
|
+
ctypes.byref(result_array), # Results
|
274
|
+
)
|
275
|
+
_assert_no_error(result)
|
276
|
+
|
277
|
+
# A CFArray is not very useful to us as an intermediary
|
278
|
+
# representation, so we are going to extract the objects we want
|
279
|
+
# and then free the array. We don't need to keep hold of keys: the
|
280
|
+
# keychain already has them!
|
281
|
+
result_count = CoreFoundation.CFArrayGetCount(result_array)
|
282
|
+
for index in range(result_count):
|
283
|
+
item = CoreFoundation.CFArrayGetValueAtIndex(result_array, index)
|
284
|
+
item = ctypes.cast(item, CoreFoundation.CFTypeRef)
|
285
|
+
|
286
|
+
if _is_cert(item):
|
287
|
+
CoreFoundation.CFRetain(item)
|
288
|
+
certificates.append(item)
|
289
|
+
elif _is_identity(item):
|
290
|
+
CoreFoundation.CFRetain(item)
|
291
|
+
identities.append(item)
|
292
|
+
finally:
|
293
|
+
if result_array:
|
294
|
+
CoreFoundation.CFRelease(result_array)
|
295
|
+
|
296
|
+
CoreFoundation.CFRelease(filedata)
|
297
|
+
|
298
|
+
return (identities, certificates)
|
299
|
+
|
300
|
+
|
301
|
+
def _load_client_cert_chain(keychain, *paths):
|
302
|
+
"""
|
303
|
+
Load certificates and maybe keys from a number of files. Has the end goal
|
304
|
+
of returning a CFArray containing one SecIdentityRef, and then zero or more
|
305
|
+
SecCertificateRef objects, suitable for use as a client certificate trust
|
306
|
+
chain.
|
307
|
+
"""
|
308
|
+
# Ok, the strategy.
|
309
|
+
#
|
310
|
+
# This relies on knowing that macOS will not give you a SecIdentityRef
|
311
|
+
# unless you have imported a key into a keychain. This is a somewhat
|
312
|
+
# artificial limitation of macOS (for example, it doesn't necessarily
|
313
|
+
# affect iOS), but there is nothing inside Security.framework that lets you
|
314
|
+
# get a SecIdentityRef without having a key in a keychain.
|
315
|
+
#
|
316
|
+
# So the policy here is we take all the files and iterate them in order.
|
317
|
+
# Each one will use SecItemImport to have one or more objects loaded from
|
318
|
+
# it. We will also point at a keychain that macOS can use to work with the
|
319
|
+
# private key.
|
320
|
+
#
|
321
|
+
# Once we have all the objects, we'll check what we actually have. If we
|
322
|
+
# already have a SecIdentityRef in hand, fab: we'll use that. Otherwise,
|
323
|
+
# we'll take the first certificate (which we assume to be our leaf) and
|
324
|
+
# ask the keychain to give us a SecIdentityRef with that cert's associated
|
325
|
+
# key.
|
326
|
+
#
|
327
|
+
# We'll then return a CFArray containing the trust chain: one
|
328
|
+
# SecIdentityRef and then zero-or-more SecCertificateRef objects. The
|
329
|
+
# responsibility for freeing this CFArray will be with the caller. This
|
330
|
+
# CFArray must remain alive for the entire connection, so in practice it
|
331
|
+
# will be stored with a single SSLSocket, along with the reference to the
|
332
|
+
# keychain.
|
333
|
+
certificates = []
|
334
|
+
identities = []
|
335
|
+
|
336
|
+
# Filter out bad paths.
|
337
|
+
paths = (path for path in paths if path)
|
338
|
+
|
339
|
+
try:
|
340
|
+
for file_path in paths:
|
341
|
+
new_identities, new_certs = _load_items_from_file(keychain, file_path)
|
342
|
+
identities.extend(new_identities)
|
343
|
+
certificates.extend(new_certs)
|
344
|
+
|
345
|
+
# Ok, we have everything. The question is: do we have an identity? If
|
346
|
+
# not, we want to grab one from the first cert we have.
|
347
|
+
if not identities:
|
348
|
+
new_identity = Security.SecIdentityRef()
|
349
|
+
status = Security.SecIdentityCreateWithCertificate(
|
350
|
+
keychain, certificates[0], ctypes.byref(new_identity)
|
351
|
+
)
|
352
|
+
_assert_no_error(status)
|
353
|
+
identities.append(new_identity)
|
354
|
+
|
355
|
+
# We now want to release the original certificate, as we no longer
|
356
|
+
# need it.
|
357
|
+
CoreFoundation.CFRelease(certificates.pop(0))
|
358
|
+
|
359
|
+
# We now need to build a new CFArray that holds the trust chain.
|
360
|
+
trust_chain = CoreFoundation.CFArrayCreateMutable(
|
361
|
+
CoreFoundation.kCFAllocatorDefault,
|
362
|
+
0,
|
363
|
+
ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks),
|
364
|
+
)
|
365
|
+
for item in itertools.chain(identities, certificates):
|
366
|
+
# ArrayAppendValue does a CFRetain on the item. That's fine,
|
367
|
+
# because the finally block will release our other refs to them.
|
368
|
+
CoreFoundation.CFArrayAppendValue(trust_chain, item)
|
369
|
+
|
370
|
+
return trust_chain
|
371
|
+
finally:
|
372
|
+
for obj in itertools.chain(identities, certificates):
|
373
|
+
CoreFoundation.CFRelease(obj)
|
374
|
+
|
375
|
+
|
376
|
+
TLS_PROTOCOL_VERSIONS = {
|
377
|
+
"SSLv2": (0, 2),
|
378
|
+
"SSLv3": (3, 0),
|
379
|
+
"TLSv1": (3, 1),
|
380
|
+
"TLSv1.1": (3, 2),
|
381
|
+
"TLSv1.2": (3, 3),
|
382
|
+
}
|
383
|
+
|
384
|
+
|
385
|
+
def _build_tls_unknown_ca_alert(version):
|
386
|
+
"""
|
387
|
+
Builds a TLS alert record for an unknown CA.
|
388
|
+
"""
|
389
|
+
ver_maj, ver_min = TLS_PROTOCOL_VERSIONS[version]
|
390
|
+
severity_fatal = 0x02
|
391
|
+
description_unknown_ca = 0x30
|
392
|
+
msg = struct.pack(">BB", severity_fatal, description_unknown_ca)
|
393
|
+
msg_len = len(msg)
|
394
|
+
record_type_alert = 0x15
|
395
|
+
record = struct.pack(">BBBH", record_type_alert, ver_maj, ver_min, msg_len) + msg
|
396
|
+
return record
|
@@ -0,0 +1,314 @@
|
|
1
|
+
"""
|
2
|
+
This module provides a pool manager that uses Google App Engine's
|
3
|
+
`URLFetch Service <https://cloud.google.com/appengine/docs/python/urlfetch>`_.
|
4
|
+
|
5
|
+
Example usage::
|
6
|
+
|
7
|
+
from pip._vendor.urllib3 import PoolManager
|
8
|
+
from pip._vendor.urllib3.contrib.appengine import AppEngineManager, is_appengine_sandbox
|
9
|
+
|
10
|
+
if is_appengine_sandbox():
|
11
|
+
# AppEngineManager uses AppEngine's URLFetch API behind the scenes
|
12
|
+
http = AppEngineManager()
|
13
|
+
else:
|
14
|
+
# PoolManager uses a socket-level API behind the scenes
|
15
|
+
http = PoolManager()
|
16
|
+
|
17
|
+
r = http.request('GET', 'https://google.com/')
|
18
|
+
|
19
|
+
There are `limitations <https://cloud.google.com/appengine/docs/python/\
|
20
|
+
urlfetch/#Python_Quotas_and_limits>`_ to the URLFetch service and it may not be
|
21
|
+
the best choice for your application. There are three options for using
|
22
|
+
urllib3 on Google App Engine:
|
23
|
+
|
24
|
+
1. You can use :class:`AppEngineManager` with URLFetch. URLFetch is
|
25
|
+
cost-effective in many circumstances as long as your usage is within the
|
26
|
+
limitations.
|
27
|
+
2. You can use a normal :class:`~urllib3.PoolManager` by enabling sockets.
|
28
|
+
Sockets also have `limitations and restrictions
|
29
|
+
<https://cloud.google.com/appengine/docs/python/sockets/\
|
30
|
+
#limitations-and-restrictions>`_ and have a lower free quota than URLFetch.
|
31
|
+
To use sockets, be sure to specify the following in your ``app.yaml``::
|
32
|
+
|
33
|
+
env_variables:
|
34
|
+
GAE_USE_SOCKETS_HTTPLIB : 'true'
|
35
|
+
|
36
|
+
3. If you are using `App Engine Flexible
|
37
|
+
<https://cloud.google.com/appengine/docs/flexible/>`_, you can use the standard
|
38
|
+
:class:`PoolManager` without any configuration or special environment variables.
|
39
|
+
"""
|
40
|
+
|
41
|
+
from __future__ import absolute_import
|
42
|
+
|
43
|
+
import io
|
44
|
+
import logging
|
45
|
+
import warnings
|
46
|
+
|
47
|
+
from ..exceptions import (
|
48
|
+
HTTPError,
|
49
|
+
HTTPWarning,
|
50
|
+
MaxRetryError,
|
51
|
+
ProtocolError,
|
52
|
+
SSLError,
|
53
|
+
TimeoutError,
|
54
|
+
)
|
55
|
+
from ..packages.six.moves.urllib.parse import urljoin
|
56
|
+
from ..request import RequestMethods
|
57
|
+
from ..response import HTTPResponse
|
58
|
+
from ..util.retry import Retry
|
59
|
+
from ..util.timeout import Timeout
|
60
|
+
from . import _appengine_environ
|
61
|
+
|
62
|
+
try:
|
63
|
+
from google.appengine.api import urlfetch
|
64
|
+
except ImportError:
|
65
|
+
urlfetch = None
|
66
|
+
|
67
|
+
|
68
|
+
log = logging.getLogger(__name__)
|
69
|
+
|
70
|
+
|
71
|
+
class AppEnginePlatformWarning(HTTPWarning):
|
72
|
+
pass
|
73
|
+
|
74
|
+
|
75
|
+
class AppEnginePlatformError(HTTPError):
|
76
|
+
pass
|
77
|
+
|
78
|
+
|
79
|
+
class AppEngineManager(RequestMethods):
|
80
|
+
"""
|
81
|
+
Connection manager for Google App Engine sandbox applications.
|
82
|
+
|
83
|
+
This manager uses the URLFetch service directly instead of using the
|
84
|
+
emulated httplib, and is subject to URLFetch limitations as described in
|
85
|
+
the App Engine documentation `here
|
86
|
+
<https://cloud.google.com/appengine/docs/python/urlfetch>`_.
|
87
|
+
|
88
|
+
Notably it will raise an :class:`AppEnginePlatformError` if:
|
89
|
+
* URLFetch is not available.
|
90
|
+
* If you attempt to use this on App Engine Flexible, as full socket
|
91
|
+
support is available.
|
92
|
+
* If a request size is more than 10 megabytes.
|
93
|
+
* If a response size is more than 32 megabytes.
|
94
|
+
* If you use an unsupported request method such as OPTIONS.
|
95
|
+
|
96
|
+
Beyond those cases, it will raise normal urllib3 errors.
|
97
|
+
"""
|
98
|
+
|
99
|
+
def __init__(
|
100
|
+
self,
|
101
|
+
headers=None,
|
102
|
+
retries=None,
|
103
|
+
validate_certificate=True,
|
104
|
+
urlfetch_retries=True,
|
105
|
+
):
|
106
|
+
if not urlfetch:
|
107
|
+
raise AppEnginePlatformError(
|
108
|
+
"URLFetch is not available in this environment."
|
109
|
+
)
|
110
|
+
|
111
|
+
warnings.warn(
|
112
|
+
"urllib3 is using URLFetch on Google App Engine sandbox instead "
|
113
|
+
"of sockets. To use sockets directly instead of URLFetch see "
|
114
|
+
"https://urllib3.readthedocs.io/en/latest/reference/urllib3.contrib.html.",
|
115
|
+
AppEnginePlatformWarning,
|
116
|
+
)
|
117
|
+
|
118
|
+
RequestMethods.__init__(self, headers)
|
119
|
+
self.validate_certificate = validate_certificate
|
120
|
+
self.urlfetch_retries = urlfetch_retries
|
121
|
+
|
122
|
+
self.retries = retries or Retry.DEFAULT
|
123
|
+
|
124
|
+
def __enter__(self):
|
125
|
+
return self
|
126
|
+
|
127
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
128
|
+
# Return False to re-raise any potential exceptions
|
129
|
+
return False
|
130
|
+
|
131
|
+
def urlopen(
|
132
|
+
self,
|
133
|
+
method,
|
134
|
+
url,
|
135
|
+
body=None,
|
136
|
+
headers=None,
|
137
|
+
retries=None,
|
138
|
+
redirect=True,
|
139
|
+
timeout=Timeout.DEFAULT_TIMEOUT,
|
140
|
+
**response_kw
|
141
|
+
):
|
142
|
+
|
143
|
+
retries = self._get_retries(retries, redirect)
|
144
|
+
|
145
|
+
try:
|
146
|
+
follow_redirects = redirect and retries.redirect != 0 and retries.total
|
147
|
+
response = urlfetch.fetch(
|
148
|
+
url,
|
149
|
+
payload=body,
|
150
|
+
method=method,
|
151
|
+
headers=headers or {},
|
152
|
+
allow_truncated=False,
|
153
|
+
follow_redirects=self.urlfetch_retries and follow_redirects,
|
154
|
+
deadline=self._get_absolute_timeout(timeout),
|
155
|
+
validate_certificate=self.validate_certificate,
|
156
|
+
)
|
157
|
+
except urlfetch.DeadlineExceededError as e:
|
158
|
+
raise TimeoutError(self, e)
|
159
|
+
|
160
|
+
except urlfetch.InvalidURLError as e:
|
161
|
+
if "too large" in str(e):
|
162
|
+
raise AppEnginePlatformError(
|
163
|
+
"URLFetch request too large, URLFetch only "
|
164
|
+
"supports requests up to 10mb in size.",
|
165
|
+
e,
|
166
|
+
)
|
167
|
+
raise ProtocolError(e)
|
168
|
+
|
169
|
+
except urlfetch.DownloadError as e:
|
170
|
+
if "Too many redirects" in str(e):
|
171
|
+
raise MaxRetryError(self, url, reason=e)
|
172
|
+
raise ProtocolError(e)
|
173
|
+
|
174
|
+
except urlfetch.ResponseTooLargeError as e:
|
175
|
+
raise AppEnginePlatformError(
|
176
|
+
"URLFetch response too large, URLFetch only supports"
|
177
|
+
"responses up to 32mb in size.",
|
178
|
+
e,
|
179
|
+
)
|
180
|
+
|
181
|
+
except urlfetch.SSLCertificateError as e:
|
182
|
+
raise SSLError(e)
|
183
|
+
|
184
|
+
except urlfetch.InvalidMethodError as e:
|
185
|
+
raise AppEnginePlatformError(
|
186
|
+
"URLFetch does not support method: %s" % method, e
|
187
|
+
)
|
188
|
+
|
189
|
+
http_response = self._urlfetch_response_to_http_response(
|
190
|
+
response, retries=retries, **response_kw
|
191
|
+
)
|
192
|
+
|
193
|
+
# Handle redirect?
|
194
|
+
redirect_location = redirect and http_response.get_redirect_location()
|
195
|
+
if redirect_location:
|
196
|
+
# Check for redirect response
|
197
|
+
if self.urlfetch_retries and retries.raise_on_redirect:
|
198
|
+
raise MaxRetryError(self, url, "too many redirects")
|
199
|
+
else:
|
200
|
+
if http_response.status == 303:
|
201
|
+
method = "GET"
|
202
|
+
|
203
|
+
try:
|
204
|
+
retries = retries.increment(
|
205
|
+
method, url, response=http_response, _pool=self
|
206
|
+
)
|
207
|
+
except MaxRetryError:
|
208
|
+
if retries.raise_on_redirect:
|
209
|
+
raise MaxRetryError(self, url, "too many redirects")
|
210
|
+
return http_response
|
211
|
+
|
212
|
+
retries.sleep_for_retry(http_response)
|
213
|
+
log.debug("Redirecting %s -> %s", url, redirect_location)
|
214
|
+
redirect_url = urljoin(url, redirect_location)
|
215
|
+
return self.urlopen(
|
216
|
+
method,
|
217
|
+
redirect_url,
|
218
|
+
body,
|
219
|
+
headers,
|
220
|
+
retries=retries,
|
221
|
+
redirect=redirect,
|
222
|
+
timeout=timeout,
|
223
|
+
**response_kw
|
224
|
+
)
|
225
|
+
|
226
|
+
# Check if we should retry the HTTP response.
|
227
|
+
has_retry_after = bool(http_response.getheader("Retry-After"))
|
228
|
+
if retries.is_retry(method, http_response.status, has_retry_after):
|
229
|
+
retries = retries.increment(method, url, response=http_response, _pool=self)
|
230
|
+
log.debug("Retry: %s", url)
|
231
|
+
retries.sleep(http_response)
|
232
|
+
return self.urlopen(
|
233
|
+
method,
|
234
|
+
url,
|
235
|
+
body=body,
|
236
|
+
headers=headers,
|
237
|
+
retries=retries,
|
238
|
+
redirect=redirect,
|
239
|
+
timeout=timeout,
|
240
|
+
**response_kw
|
241
|
+
)
|
242
|
+
|
243
|
+
return http_response
|
244
|
+
|
245
|
+
def _urlfetch_response_to_http_response(self, urlfetch_resp, **response_kw):
|
246
|
+
|
247
|
+
if is_prod_appengine():
|
248
|
+
# Production GAE handles deflate encoding automatically, but does
|
249
|
+
# not remove the encoding header.
|
250
|
+
content_encoding = urlfetch_resp.headers.get("content-encoding")
|
251
|
+
|
252
|
+
if content_encoding == "deflate":
|
253
|
+
del urlfetch_resp.headers["content-encoding"]
|
254
|
+
|
255
|
+
transfer_encoding = urlfetch_resp.headers.get("transfer-encoding")
|
256
|
+
# We have a full response's content,
|
257
|
+
# so let's make sure we don't report ourselves as chunked data.
|
258
|
+
if transfer_encoding == "chunked":
|
259
|
+
encodings = transfer_encoding.split(",")
|
260
|
+
encodings.remove("chunked")
|
261
|
+
urlfetch_resp.headers["transfer-encoding"] = ",".join(encodings)
|
262
|
+
|
263
|
+
original_response = HTTPResponse(
|
264
|
+
# In order for decoding to work, we must present the content as
|
265
|
+
# a file-like object.
|
266
|
+
body=io.BytesIO(urlfetch_resp.content),
|
267
|
+
msg=urlfetch_resp.header_msg,
|
268
|
+
headers=urlfetch_resp.headers,
|
269
|
+
status=urlfetch_resp.status_code,
|
270
|
+
**response_kw
|
271
|
+
)
|
272
|
+
|
273
|
+
return HTTPResponse(
|
274
|
+
body=io.BytesIO(urlfetch_resp.content),
|
275
|
+
headers=urlfetch_resp.headers,
|
276
|
+
status=urlfetch_resp.status_code,
|
277
|
+
original_response=original_response,
|
278
|
+
**response_kw
|
279
|
+
)
|
280
|
+
|
281
|
+
def _get_absolute_timeout(self, timeout):
|
282
|
+
if timeout is Timeout.DEFAULT_TIMEOUT:
|
283
|
+
return None # Defer to URLFetch's default.
|
284
|
+
if isinstance(timeout, Timeout):
|
285
|
+
if timeout._read is not None or timeout._connect is not None:
|
286
|
+
warnings.warn(
|
287
|
+
"URLFetch does not support granular timeout settings, "
|
288
|
+
"reverting to total or default URLFetch timeout.",
|
289
|
+
AppEnginePlatformWarning,
|
290
|
+
)
|
291
|
+
return timeout.total
|
292
|
+
return timeout
|
293
|
+
|
294
|
+
def _get_retries(self, retries, redirect):
|
295
|
+
if not isinstance(retries, Retry):
|
296
|
+
retries = Retry.from_int(retries, redirect=redirect, default=self.retries)
|
297
|
+
|
298
|
+
if retries.connect or retries.read or retries.redirect:
|
299
|
+
warnings.warn(
|
300
|
+
"URLFetch only supports total retries and does not "
|
301
|
+
"recognize connect, read, or redirect retry parameters.",
|
302
|
+
AppEnginePlatformWarning,
|
303
|
+
)
|
304
|
+
|
305
|
+
return retries
|
306
|
+
|
307
|
+
|
308
|
+
# Alias methods from _appengine_environ to maintain public API interface.
|
309
|
+
|
310
|
+
is_appengine = _appengine_environ.is_appengine
|
311
|
+
is_appengine_sandbox = _appengine_environ.is_appengine_sandbox
|
312
|
+
is_local_appengine = _appengine_environ.is_local_appengine
|
313
|
+
is_prod_appengine = _appengine_environ.is_prod_appengine
|
314
|
+
is_prod_appengine_mvms = _appengine_environ.is_prod_appengine_mvms
|