snowflake-connector-python 3.16.0__cp313-cp313-win_amd64.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.
- snowflake/connector/__init__.py +96 -0
- snowflake/connector/_query_context_cache.py +276 -0
- snowflake/connector/_sql_util.py +48 -0
- snowflake/connector/_utils.py +70 -0
- snowflake/connector/arrow_context.py +203 -0
- snowflake/connector/auth/__init__.py +53 -0
- snowflake/connector/auth/_auth.py +586 -0
- snowflake/connector/auth/_http_server.py +220 -0
- snowflake/connector/auth/_oauth_base.py +400 -0
- snowflake/connector/auth/by_plugin.py +219 -0
- snowflake/connector/auth/default.py +36 -0
- snowflake/connector/auth/idtoken.py +72 -0
- snowflake/connector/auth/keypair.py +222 -0
- snowflake/connector/auth/no_auth.py +39 -0
- snowflake/connector/auth/oauth.py +49 -0
- snowflake/connector/auth/oauth_code.py +479 -0
- snowflake/connector/auth/oauth_credentials.py +66 -0
- snowflake/connector/auth/okta.py +335 -0
- snowflake/connector/auth/pat.py +39 -0
- snowflake/connector/auth/usrpwdmfa.py +69 -0
- snowflake/connector/auth/webbrowser.py +502 -0
- snowflake/connector/auth/workload_identity.py +94 -0
- snowflake/connector/azure_storage_client.py +276 -0
- snowflake/connector/backoff_policies.py +141 -0
- snowflake/connector/bind_upload_agent.py +89 -0
- snowflake/connector/cache.py +696 -0
- snowflake/connector/compat.py +127 -0
- snowflake/connector/config_manager.py +496 -0
- snowflake/connector/connection.py +2273 -0
- snowflake/connector/connection_diagnostic.py +776 -0
- snowflake/connector/constants.py +442 -0
- snowflake/connector/converter.py +785 -0
- snowflake/connector/converter_issue23517.py +87 -0
- snowflake/connector/converter_null.py +14 -0
- snowflake/connector/converter_snowsql.py +205 -0
- snowflake/connector/cursor.py +1951 -0
- snowflake/connector/dbapi.py +53 -0
- snowflake/connector/description.py +19 -0
- snowflake/connector/direct_file_operation_utils.py +88 -0
- snowflake/connector/encryption_util.py +220 -0
- snowflake/connector/errorcode.py +91 -0
- snowflake/connector/errors.py +615 -0
- snowflake/connector/externals_utils/__init__.py +0 -0
- snowflake/connector/externals_utils/externals_setup.py +27 -0
- snowflake/connector/feature.py +4 -0
- snowflake/connector/file_compression_type.py +118 -0
- snowflake/connector/file_lock.py +72 -0
- snowflake/connector/file_transfer_agent.py +1215 -0
- snowflake/connector/file_util.py +153 -0
- snowflake/connector/gcs_storage_client.py +474 -0
- snowflake/connector/gzip_decoder.py +85 -0
- snowflake/connector/local_storage_client.py +90 -0
- snowflake/connector/log_configuration.py +60 -0
- snowflake/connector/logging_utils/__init__.py +0 -0
- snowflake/connector/logging_utils/filters.py +72 -0
- snowflake/connector/nanoarrow_arrow_iterator.cp313-win_amd64.pyd +0 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +60 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +29 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +19 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +26 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +21 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +23 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +557 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +98 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +125 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +115 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +1005 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +127 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +47 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +46 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.cpp +83 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.hpp +35 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +97 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +72 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +73 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +28 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +30 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +35 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +17 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +23 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +45 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.cpp +71 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.hpp +56 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +209 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +75 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +30 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +46 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +29 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +8 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +95 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +57 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +36 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +34 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +48 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +19 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +26 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +36 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +31 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +346 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +145 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +14 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +65 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +68 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +101 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +127 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +45 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +1908 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +215 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +125 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +7 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +55 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +148 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +31 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +8 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +144 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +162 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +97 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +239 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +14 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +210 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +84 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +84 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +20 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +51 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +206 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +118 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +19 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +52 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +2 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +25 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +67 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +162 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +898 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +190 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +6 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +52 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +3204 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +3217 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +3618 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +379 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +256 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +512 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +350 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +33273 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +397 -0
- snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +100 -0
- snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +49 -0
- snowflake/connector/network.py +1297 -0
- snowflake/connector/ocsp_asn1crypto.py +447 -0
- snowflake/connector/ocsp_snowflake.py +1883 -0
- snowflake/connector/options.py +131 -0
- snowflake/connector/pandas_tools.py +732 -0
- snowflake/connector/proxy.py +43 -0
- snowflake/connector/py.typed +0 -0
- snowflake/connector/result_batch.py +786 -0
- snowflake/connector/result_set.py +319 -0
- snowflake/connector/s3_storage_client.py +605 -0
- snowflake/connector/secret_detector.py +181 -0
- snowflake/connector/sf_dirs.py +64 -0
- snowflake/connector/sfbinaryformat.py +35 -0
- snowflake/connector/sfdatetime.py +345 -0
- snowflake/connector/snow_logging.py +144 -0
- snowflake/connector/sqlstate.py +9 -0
- snowflake/connector/ssd_internal_keys.py +30 -0
- snowflake/connector/ssl_wrap_socket.py +134 -0
- snowflake/connector/storage_client.py +478 -0
- snowflake/connector/telemetry.py +249 -0
- snowflake/connector/telemetry_oob.py +543 -0
- snowflake/connector/test_util.py +30 -0
- snowflake/connector/time_util.py +159 -0
- snowflake/connector/token_cache.py +402 -0
- snowflake/connector/tool/__init__.py +0 -0
- snowflake/connector/tool/dump_certs.py +57 -0
- snowflake/connector/tool/dump_ocsp_response.py +139 -0
- snowflake/connector/tool/dump_ocsp_response_cache.py +194 -0
- snowflake/connector/tool/probe_connection.py +69 -0
- snowflake/connector/url_util.py +49 -0
- snowflake/connector/util_text.py +301 -0
- snowflake/connector/vendored/__init__.py +3 -0
- snowflake/connector/vendored/requests/LICENSE +175 -0
- snowflake/connector/vendored/requests/__init__.py +169 -0
- snowflake/connector/vendored/requests/__version__.py +14 -0
- snowflake/connector/vendored/requests/_internal_utils.py +50 -0
- snowflake/connector/vendored/requests/adapters.py +537 -0
- snowflake/connector/vendored/requests/api.py +157 -0
- snowflake/connector/vendored/requests/auth.py +315 -0
- snowflake/connector/vendored/requests/certs.py +17 -0
- snowflake/connector/vendored/requests/compat.py +79 -0
- snowflake/connector/vendored/requests/cookies.py +561 -0
- snowflake/connector/vendored/requests/exceptions.py +140 -0
- snowflake/connector/vendored/requests/help.py +134 -0
- snowflake/connector/vendored/requests/hooks.py +33 -0
- snowflake/connector/vendored/requests/models.py +1033 -0
- snowflake/connector/vendored/requests/sessions.py +833 -0
- snowflake/connector/vendored/requests/status_codes.py +128 -0
- snowflake/connector/vendored/requests/structures.py +99 -0
- snowflake/connector/vendored/requests/utils.py +1093 -0
- snowflake/connector/vendored/urllib3/LICENSE.txt +21 -0
- snowflake/connector/vendored/urllib3/__init__.py +85 -0
- snowflake/connector/vendored/urllib3/_collections.py +355 -0
- snowflake/connector/vendored/urllib3/_version.py +2 -0
- snowflake/connector/vendored/urllib3/connection.py +572 -0
- snowflake/connector/vendored/urllib3/connectionpool.py +1137 -0
- snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
- snowflake/connector/vendored/urllib3/contrib/_appengine_environ.py +36 -0
- snowflake/connector/vendored/urllib3/contrib/_securetransport/__init__.py +0 -0
- snowflake/connector/vendored/urllib3/contrib/_securetransport/bindings.py +519 -0
- snowflake/connector/vendored/urllib3/contrib/_securetransport/low_level.py +397 -0
- snowflake/connector/vendored/urllib3/contrib/appengine.py +314 -0
- snowflake/connector/vendored/urllib3/contrib/ntlmpool.py +130 -0
- snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +509 -0
- snowflake/connector/vendored/urllib3/contrib/securetransport.py +920 -0
- snowflake/connector/vendored/urllib3/contrib/socks.py +216 -0
- snowflake/connector/vendored/urllib3/exceptions.py +323 -0
- snowflake/connector/vendored/urllib3/fields.py +274 -0
- snowflake/connector/vendored/urllib3/filepost.py +98 -0
- snowflake/connector/vendored/urllib3/packages/__init__.py +0 -0
- snowflake/connector/vendored/urllib3/packages/backports/__init__.py +0 -0
- snowflake/connector/vendored/urllib3/packages/backports/makefile.py +51 -0
- snowflake/connector/vendored/urllib3/packages/backports/weakref_finalize.py +155 -0
- snowflake/connector/vendored/urllib3/packages/six.py +1076 -0
- snowflake/connector/vendored/urllib3/poolmanager.py +540 -0
- snowflake/connector/vendored/urllib3/request.py +191 -0
- snowflake/connector/vendored/urllib3/response.py +885 -0
- snowflake/connector/vendored/urllib3/util/__init__.py +49 -0
- snowflake/connector/vendored/urllib3/util/connection.py +156 -0
- snowflake/connector/vendored/urllib3/util/proxy.py +57 -0
- snowflake/connector/vendored/urllib3/util/queue.py +22 -0
- snowflake/connector/vendored/urllib3/util/request.py +146 -0
- snowflake/connector/vendored/urllib3/util/response.py +107 -0
- snowflake/connector/vendored/urllib3/util/retry.py +620 -0
- snowflake/connector/vendored/urllib3/util/ssl_.py +495 -0
- snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +159 -0
- snowflake/connector/vendored/urllib3/util/ssltransport.py +221 -0
- snowflake/connector/vendored/urllib3/util/timeout.py +271 -0
- snowflake/connector/vendored/urllib3/util/url.py +435 -0
- snowflake/connector/vendored/urllib3/util/wait.py +152 -0
- snowflake/connector/version.py +3 -0
- snowflake/connector/wif_util.py +407 -0
- snowflake_connector_python-3.16.0.dist-info/METADATA +1475 -0
- snowflake_connector_python-3.16.0.dist-info/RECORD +246 -0
- snowflake_connector_python-3.16.0.dist-info/WHEEL +5 -0
- snowflake_connector_python-3.16.0.dist-info/entry_points.txt +4 -0
- snowflake_connector_python-3.16.0.dist-info/licenses/LICENSE.txt +202 -0
- snowflake_connector_python-3.16.0.dist-info/licenses/NOTICE +8 -0
- snowflake_connector_python-3.16.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2008-2020 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Python HTTP library with thread-safe connection pooling, file post support, user friendly, and more
|
|
3
|
+
"""
|
|
4
|
+
from __future__ import absolute_import
|
|
5
|
+
|
|
6
|
+
# Set default logging handler to avoid "No handler found" warnings.
|
|
7
|
+
import logging
|
|
8
|
+
import warnings
|
|
9
|
+
from logging import NullHandler
|
|
10
|
+
|
|
11
|
+
from . import exceptions
|
|
12
|
+
from ._version import __version__
|
|
13
|
+
from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool, connection_from_url
|
|
14
|
+
from .filepost import encode_multipart_formdata
|
|
15
|
+
from .poolmanager import PoolManager, ProxyManager, proxy_from_url
|
|
16
|
+
from .response import HTTPResponse
|
|
17
|
+
from .util.request import make_headers
|
|
18
|
+
from .util.retry import Retry
|
|
19
|
+
from .util.timeout import Timeout
|
|
20
|
+
from .util.url import get_host
|
|
21
|
+
|
|
22
|
+
__author__ = "Andrey Petrov (andrey.petrov@shazow.net)"
|
|
23
|
+
__license__ = "MIT"
|
|
24
|
+
__version__ = __version__
|
|
25
|
+
|
|
26
|
+
__all__ = (
|
|
27
|
+
"HTTPConnectionPool",
|
|
28
|
+
"HTTPSConnectionPool",
|
|
29
|
+
"PoolManager",
|
|
30
|
+
"ProxyManager",
|
|
31
|
+
"HTTPResponse",
|
|
32
|
+
"Retry",
|
|
33
|
+
"Timeout",
|
|
34
|
+
"add_stderr_logger",
|
|
35
|
+
"connection_from_url",
|
|
36
|
+
"disable_warnings",
|
|
37
|
+
"encode_multipart_formdata",
|
|
38
|
+
"get_host",
|
|
39
|
+
"make_headers",
|
|
40
|
+
"proxy_from_url",
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
logging.getLogger(__name__).addHandler(NullHandler())
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def add_stderr_logger(level=logging.DEBUG):
|
|
47
|
+
"""
|
|
48
|
+
Helper for quickly adding a StreamHandler to the logger. Useful for
|
|
49
|
+
debugging.
|
|
50
|
+
|
|
51
|
+
Returns the handler after adding it.
|
|
52
|
+
"""
|
|
53
|
+
# This method needs to be in this __init__.py to get the __name__ correct
|
|
54
|
+
# even if urllib3 is vendored within another package.
|
|
55
|
+
logger = logging.getLogger(__name__)
|
|
56
|
+
handler = logging.StreamHandler()
|
|
57
|
+
handler.setFormatter(logging.Formatter("%(asctime)s %(levelname)s %(message)s"))
|
|
58
|
+
logger.addHandler(handler)
|
|
59
|
+
logger.setLevel(level)
|
|
60
|
+
logger.debug("Added a stderr logging handler to logger: %s", __name__)
|
|
61
|
+
return handler
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
# ... Clean up.
|
|
65
|
+
del NullHandler
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
# All warning filters *must* be appended unless you're really certain that they
|
|
69
|
+
# shouldn't be: otherwise, it's very hard for users to use most Python
|
|
70
|
+
# mechanisms to silence them.
|
|
71
|
+
# SecurityWarning's always go off by default.
|
|
72
|
+
warnings.simplefilter("always", exceptions.SecurityWarning, append=True)
|
|
73
|
+
# SubjectAltNameWarning's should go off once per host
|
|
74
|
+
warnings.simplefilter("default", exceptions.SubjectAltNameWarning, append=True)
|
|
75
|
+
# InsecurePlatformWarning's don't vary between requests, so we keep it default.
|
|
76
|
+
warnings.simplefilter("default", exceptions.InsecurePlatformWarning, append=True)
|
|
77
|
+
# SNIMissingWarnings should go off only once.
|
|
78
|
+
warnings.simplefilter("default", exceptions.SNIMissingWarning, append=True)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def disable_warnings(category=exceptions.HTTPWarning):
|
|
82
|
+
"""
|
|
83
|
+
Helper for quickly disabling all urllib3 warnings.
|
|
84
|
+
"""
|
|
85
|
+
warnings.simplefilter("ignore", category)
|
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
from __future__ import absolute_import
|
|
2
|
+
|
|
3
|
+
try:
|
|
4
|
+
from collections.abc import Mapping, MutableMapping
|
|
5
|
+
except ImportError:
|
|
6
|
+
from collections import Mapping, MutableMapping
|
|
7
|
+
try:
|
|
8
|
+
from threading import RLock
|
|
9
|
+
except ImportError: # Platform-specific: No threads available
|
|
10
|
+
|
|
11
|
+
class RLock:
|
|
12
|
+
def __enter__(self):
|
|
13
|
+
pass
|
|
14
|
+
|
|
15
|
+
def __exit__(self, exc_type, exc_value, traceback):
|
|
16
|
+
pass
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
from collections import OrderedDict
|
|
20
|
+
|
|
21
|
+
from .exceptions import InvalidHeader
|
|
22
|
+
from .packages import six
|
|
23
|
+
from .packages.six import iterkeys, itervalues
|
|
24
|
+
|
|
25
|
+
__all__ = ["RecentlyUsedContainer", "HTTPHeaderDict"]
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
_Null = object()
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class RecentlyUsedContainer(MutableMapping):
|
|
32
|
+
"""
|
|
33
|
+
Provides a thread-safe dict-like container which maintains up to
|
|
34
|
+
``maxsize`` keys while throwing away the least-recently-used keys beyond
|
|
35
|
+
``maxsize``.
|
|
36
|
+
|
|
37
|
+
:param maxsize:
|
|
38
|
+
Maximum number of recent elements to retain.
|
|
39
|
+
|
|
40
|
+
:param dispose_func:
|
|
41
|
+
Every time an item is evicted from the container,
|
|
42
|
+
``dispose_func(value)`` is called. Callback which will get called
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
ContainerCls = OrderedDict
|
|
46
|
+
|
|
47
|
+
def __init__(self, maxsize=10, dispose_func=None):
|
|
48
|
+
self._maxsize = maxsize
|
|
49
|
+
self.dispose_func = dispose_func
|
|
50
|
+
|
|
51
|
+
self._container = self.ContainerCls()
|
|
52
|
+
self.lock = RLock()
|
|
53
|
+
|
|
54
|
+
def __getitem__(self, key):
|
|
55
|
+
# Re-insert the item, moving it to the end of the eviction line.
|
|
56
|
+
with self.lock:
|
|
57
|
+
item = self._container.pop(key)
|
|
58
|
+
self._container[key] = item
|
|
59
|
+
return item
|
|
60
|
+
|
|
61
|
+
def __setitem__(self, key, value):
|
|
62
|
+
evicted_value = _Null
|
|
63
|
+
with self.lock:
|
|
64
|
+
# Possibly evict the existing value of 'key'
|
|
65
|
+
evicted_value = self._container.get(key, _Null)
|
|
66
|
+
self._container[key] = value
|
|
67
|
+
|
|
68
|
+
# If we didn't evict an existing value, we might have to evict the
|
|
69
|
+
# least recently used item from the beginning of the container.
|
|
70
|
+
if len(self._container) > self._maxsize:
|
|
71
|
+
_key, evicted_value = self._container.popitem(last=False)
|
|
72
|
+
|
|
73
|
+
if self.dispose_func and evicted_value is not _Null:
|
|
74
|
+
self.dispose_func(evicted_value)
|
|
75
|
+
|
|
76
|
+
def __delitem__(self, key):
|
|
77
|
+
with self.lock:
|
|
78
|
+
value = self._container.pop(key)
|
|
79
|
+
|
|
80
|
+
if self.dispose_func:
|
|
81
|
+
self.dispose_func(value)
|
|
82
|
+
|
|
83
|
+
def __len__(self):
|
|
84
|
+
with self.lock:
|
|
85
|
+
return len(self._container)
|
|
86
|
+
|
|
87
|
+
def __iter__(self):
|
|
88
|
+
raise NotImplementedError(
|
|
89
|
+
"Iteration over this class is unlikely to be threadsafe."
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
def clear(self):
|
|
93
|
+
with self.lock:
|
|
94
|
+
# Copy pointers to all values, then wipe the mapping
|
|
95
|
+
values = list(itervalues(self._container))
|
|
96
|
+
self._container.clear()
|
|
97
|
+
|
|
98
|
+
if self.dispose_func:
|
|
99
|
+
for value in values:
|
|
100
|
+
self.dispose_func(value)
|
|
101
|
+
|
|
102
|
+
def keys(self):
|
|
103
|
+
with self.lock:
|
|
104
|
+
return list(iterkeys(self._container))
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class HTTPHeaderDict(MutableMapping):
|
|
108
|
+
"""
|
|
109
|
+
:param headers:
|
|
110
|
+
An iterable of field-value pairs. Must not contain multiple field names
|
|
111
|
+
when compared case-insensitively.
|
|
112
|
+
|
|
113
|
+
:param kwargs:
|
|
114
|
+
Additional field-value pairs to pass in to ``dict.update``.
|
|
115
|
+
|
|
116
|
+
A ``dict`` like container for storing HTTP Headers.
|
|
117
|
+
|
|
118
|
+
Field names are stored and compared case-insensitively in compliance with
|
|
119
|
+
RFC 7230. Iteration provides the first case-sensitive key seen for each
|
|
120
|
+
case-insensitive pair.
|
|
121
|
+
|
|
122
|
+
Using ``__setitem__`` syntax overwrites fields that compare equal
|
|
123
|
+
case-insensitively in order to maintain ``dict``'s api. For fields that
|
|
124
|
+
compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add``
|
|
125
|
+
in a loop.
|
|
126
|
+
|
|
127
|
+
If multiple fields that are equal case-insensitively are passed to the
|
|
128
|
+
constructor or ``.update``, the behavior is undefined and some will be
|
|
129
|
+
lost.
|
|
130
|
+
|
|
131
|
+
>>> headers = HTTPHeaderDict()
|
|
132
|
+
>>> headers.add('Set-Cookie', 'foo=bar')
|
|
133
|
+
>>> headers.add('set-cookie', 'baz=quxx')
|
|
134
|
+
>>> headers['content-length'] = '7'
|
|
135
|
+
>>> headers['SET-cookie']
|
|
136
|
+
'foo=bar, baz=quxx'
|
|
137
|
+
>>> headers['Content-Length']
|
|
138
|
+
'7'
|
|
139
|
+
"""
|
|
140
|
+
|
|
141
|
+
def __init__(self, headers=None, **kwargs):
|
|
142
|
+
super(HTTPHeaderDict, self).__init__()
|
|
143
|
+
self._container = OrderedDict()
|
|
144
|
+
if headers is not None:
|
|
145
|
+
if isinstance(headers, HTTPHeaderDict):
|
|
146
|
+
self._copy_from(headers)
|
|
147
|
+
else:
|
|
148
|
+
self.extend(headers)
|
|
149
|
+
if kwargs:
|
|
150
|
+
self.extend(kwargs)
|
|
151
|
+
|
|
152
|
+
def __setitem__(self, key, val):
|
|
153
|
+
self._container[key.lower()] = [key, val]
|
|
154
|
+
return self._container[key.lower()]
|
|
155
|
+
|
|
156
|
+
def __getitem__(self, key):
|
|
157
|
+
val = self._container[key.lower()]
|
|
158
|
+
return ", ".join(val[1:])
|
|
159
|
+
|
|
160
|
+
def __delitem__(self, key):
|
|
161
|
+
del self._container[key.lower()]
|
|
162
|
+
|
|
163
|
+
def __contains__(self, key):
|
|
164
|
+
return key.lower() in self._container
|
|
165
|
+
|
|
166
|
+
def __eq__(self, other):
|
|
167
|
+
if not isinstance(other, Mapping) and not hasattr(other, "keys"):
|
|
168
|
+
return False
|
|
169
|
+
if not isinstance(other, type(self)):
|
|
170
|
+
other = type(self)(other)
|
|
171
|
+
return dict((k.lower(), v) for k, v in self.itermerged()) == dict(
|
|
172
|
+
(k.lower(), v) for k, v in other.itermerged()
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
def __ne__(self, other):
|
|
176
|
+
return not self.__eq__(other)
|
|
177
|
+
|
|
178
|
+
if six.PY2: # Python 2
|
|
179
|
+
iterkeys = MutableMapping.iterkeys
|
|
180
|
+
itervalues = MutableMapping.itervalues
|
|
181
|
+
|
|
182
|
+
__marker = object()
|
|
183
|
+
|
|
184
|
+
def __len__(self):
|
|
185
|
+
return len(self._container)
|
|
186
|
+
|
|
187
|
+
def __iter__(self):
|
|
188
|
+
# Only provide the originally cased names
|
|
189
|
+
for vals in self._container.values():
|
|
190
|
+
yield vals[0]
|
|
191
|
+
|
|
192
|
+
def pop(self, key, default=__marker):
|
|
193
|
+
"""D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
|
|
194
|
+
If key is not found, d is returned if given, otherwise KeyError is raised.
|
|
195
|
+
"""
|
|
196
|
+
# Using the MutableMapping function directly fails due to the private marker.
|
|
197
|
+
# Using ordinary dict.pop would expose the internal structures.
|
|
198
|
+
# So let's reinvent the wheel.
|
|
199
|
+
try:
|
|
200
|
+
value = self[key]
|
|
201
|
+
except KeyError:
|
|
202
|
+
if default is self.__marker:
|
|
203
|
+
raise
|
|
204
|
+
return default
|
|
205
|
+
else:
|
|
206
|
+
del self[key]
|
|
207
|
+
return value
|
|
208
|
+
|
|
209
|
+
def discard(self, key):
|
|
210
|
+
try:
|
|
211
|
+
del self[key]
|
|
212
|
+
except KeyError:
|
|
213
|
+
pass
|
|
214
|
+
|
|
215
|
+
def add(self, key, val):
|
|
216
|
+
"""Adds a (name, value) pair, doesn't overwrite the value if it already
|
|
217
|
+
exists.
|
|
218
|
+
|
|
219
|
+
>>> headers = HTTPHeaderDict(foo='bar')
|
|
220
|
+
>>> headers.add('Foo', 'baz')
|
|
221
|
+
>>> headers['foo']
|
|
222
|
+
'bar, baz'
|
|
223
|
+
"""
|
|
224
|
+
key_lower = key.lower()
|
|
225
|
+
new_vals = [key, val]
|
|
226
|
+
# Keep the common case aka no item present as fast as possible
|
|
227
|
+
vals = self._container.setdefault(key_lower, new_vals)
|
|
228
|
+
if new_vals is not vals:
|
|
229
|
+
vals.append(val)
|
|
230
|
+
|
|
231
|
+
def extend(self, *args, **kwargs):
|
|
232
|
+
"""Generic import function for any type of header-like object.
|
|
233
|
+
Adapted version of MutableMapping.update in order to insert items
|
|
234
|
+
with self.add instead of self.__setitem__
|
|
235
|
+
"""
|
|
236
|
+
if len(args) > 1:
|
|
237
|
+
raise TypeError(
|
|
238
|
+
"extend() takes at most 1 positional "
|
|
239
|
+
"arguments ({0} given)".format(len(args))
|
|
240
|
+
)
|
|
241
|
+
other = args[0] if len(args) >= 1 else ()
|
|
242
|
+
|
|
243
|
+
if isinstance(other, HTTPHeaderDict):
|
|
244
|
+
for key, val in other.iteritems():
|
|
245
|
+
self.add(key, val)
|
|
246
|
+
elif isinstance(other, Mapping):
|
|
247
|
+
for key in other:
|
|
248
|
+
self.add(key, other[key])
|
|
249
|
+
elif hasattr(other, "keys"):
|
|
250
|
+
for key in other.keys():
|
|
251
|
+
self.add(key, other[key])
|
|
252
|
+
else:
|
|
253
|
+
for key, value in other:
|
|
254
|
+
self.add(key, value)
|
|
255
|
+
|
|
256
|
+
for key, value in kwargs.items():
|
|
257
|
+
self.add(key, value)
|
|
258
|
+
|
|
259
|
+
def getlist(self, key, default=__marker):
|
|
260
|
+
"""Returns a list of all the values for the named field. Returns an
|
|
261
|
+
empty list if the key doesn't exist."""
|
|
262
|
+
try:
|
|
263
|
+
vals = self._container[key.lower()]
|
|
264
|
+
except KeyError:
|
|
265
|
+
if default is self.__marker:
|
|
266
|
+
return []
|
|
267
|
+
return default
|
|
268
|
+
else:
|
|
269
|
+
return vals[1:]
|
|
270
|
+
|
|
271
|
+
def _prepare_for_method_change(self):
|
|
272
|
+
"""
|
|
273
|
+
Remove content-specific header fields before changing the request
|
|
274
|
+
method to GET or HEAD according to RFC 9110, Section 15.4.
|
|
275
|
+
"""
|
|
276
|
+
content_specific_headers = [
|
|
277
|
+
"Content-Encoding",
|
|
278
|
+
"Content-Language",
|
|
279
|
+
"Content-Location",
|
|
280
|
+
"Content-Type",
|
|
281
|
+
"Content-Length",
|
|
282
|
+
"Digest",
|
|
283
|
+
"Last-Modified",
|
|
284
|
+
]
|
|
285
|
+
for header in content_specific_headers:
|
|
286
|
+
self.discard(header)
|
|
287
|
+
return self
|
|
288
|
+
|
|
289
|
+
# Backwards compatibility for httplib
|
|
290
|
+
getheaders = getlist
|
|
291
|
+
getallmatchingheaders = getlist
|
|
292
|
+
iget = getlist
|
|
293
|
+
|
|
294
|
+
# Backwards compatibility for http.cookiejar
|
|
295
|
+
get_all = getlist
|
|
296
|
+
|
|
297
|
+
def __repr__(self):
|
|
298
|
+
return "%s(%s)" % (type(self).__name__, dict(self.itermerged()))
|
|
299
|
+
|
|
300
|
+
def _copy_from(self, other):
|
|
301
|
+
for key in other:
|
|
302
|
+
val = other.getlist(key)
|
|
303
|
+
if isinstance(val, list):
|
|
304
|
+
# Don't need to convert tuples
|
|
305
|
+
val = list(val)
|
|
306
|
+
self._container[key.lower()] = [key] + val
|
|
307
|
+
|
|
308
|
+
def copy(self):
|
|
309
|
+
clone = type(self)()
|
|
310
|
+
clone._copy_from(self)
|
|
311
|
+
return clone
|
|
312
|
+
|
|
313
|
+
def iteritems(self):
|
|
314
|
+
"""Iterate over all header lines, including duplicate ones."""
|
|
315
|
+
for key in self:
|
|
316
|
+
vals = self._container[key.lower()]
|
|
317
|
+
for val in vals[1:]:
|
|
318
|
+
yield vals[0], val
|
|
319
|
+
|
|
320
|
+
def itermerged(self):
|
|
321
|
+
"""Iterate over all headers, merging duplicate ones together."""
|
|
322
|
+
for key in self:
|
|
323
|
+
val = self._container[key.lower()]
|
|
324
|
+
yield val[0], ", ".join(val[1:])
|
|
325
|
+
|
|
326
|
+
def items(self):
|
|
327
|
+
return list(self.iteritems())
|
|
328
|
+
|
|
329
|
+
@classmethod
|
|
330
|
+
def from_httplib(cls, message): # Python 2
|
|
331
|
+
"""Read headers from a Python 2 httplib message object."""
|
|
332
|
+
# python2.7 does not expose a proper API for exporting multiheaders
|
|
333
|
+
# efficiently. This function re-reads raw lines from the message
|
|
334
|
+
# object and extracts the multiheaders properly.
|
|
335
|
+
obs_fold_continued_leaders = (" ", "\t")
|
|
336
|
+
headers = []
|
|
337
|
+
|
|
338
|
+
for line in message.headers:
|
|
339
|
+
if line.startswith(obs_fold_continued_leaders):
|
|
340
|
+
if not headers:
|
|
341
|
+
# We received a header line that starts with OWS as described
|
|
342
|
+
# in RFC-7230 S3.2.4. This indicates a multiline header, but
|
|
343
|
+
# there exists no previous header to which we can attach it.
|
|
344
|
+
raise InvalidHeader(
|
|
345
|
+
"Header continuation with no previous header: %s" % line
|
|
346
|
+
)
|
|
347
|
+
else:
|
|
348
|
+
key, value = headers[-1]
|
|
349
|
+
headers[-1] = (key, value + " " + line.strip())
|
|
350
|
+
continue
|
|
351
|
+
|
|
352
|
+
key, value = line.split(":", 1)
|
|
353
|
+
headers.append((key, value.strip()))
|
|
354
|
+
|
|
355
|
+
return cls(headers)
|