Updated DB_Helper by adding firebase methods.
This commit is contained in:
		
							parent
							
								
									485cc3bbba
								
							
						
					
					
						commit
						c82121d036
					
				
					 1810 changed files with 537281 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -0,0 +1,15 @@
 | 
			
		|||
# -*- coding: utf-8 -*-
 | 
			
		||||
"""
 | 
			
		||||
requests-toolbelt.adapters
 | 
			
		||||
==========================
 | 
			
		||||
 | 
			
		||||
See http://toolbelt.rtfd.org/ for documentation
 | 
			
		||||
 | 
			
		||||
:copyright: (c) 2014 by Ian Cordasco and Cory Benfield
 | 
			
		||||
:license: Apache v2.0, see LICENSE for more details
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
from .ssl import SSLAdapter
 | 
			
		||||
from .source import SourceAddressAdapter
 | 
			
		||||
 | 
			
		||||
__all__ = ['SSLAdapter', 'SourceAddressAdapter']
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										147
									
								
								venv/Lib/site-packages/requests_toolbelt/adapters/appengine.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								venv/Lib/site-packages/requests_toolbelt/adapters/appengine.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,147 @@
 | 
			
		|||
# -*- coding: utf-8 -*-
 | 
			
		||||
"""The App Engine Transport Adapter for requests.
 | 
			
		||||
 | 
			
		||||
.. versionadded:: 0.6.0
 | 
			
		||||
 | 
			
		||||
This requires a version of requests >= 2.10.0 and Python 2.
 | 
			
		||||
 | 
			
		||||
There are two ways to use this library:
 | 
			
		||||
 | 
			
		||||
#. If you're using requests directly, you can use code like:
 | 
			
		||||
 | 
			
		||||
   .. code-block:: python
 | 
			
		||||
 | 
			
		||||
       >>> import requests
 | 
			
		||||
       >>> import ssl
 | 
			
		||||
       >>> import requests.packages.urllib3.contrib.appengine as ul_appengine
 | 
			
		||||
       >>> from requests_toolbelt.adapters import appengine
 | 
			
		||||
       >>> s = requests.Session()
 | 
			
		||||
       >>> if ul_appengine.is_appengine_sandbox():
 | 
			
		||||
       ...    s.mount('http://', appengine.AppEngineAdapter())
 | 
			
		||||
       ...    s.mount('https://', appengine.AppEngineAdapter())
 | 
			
		||||
 | 
			
		||||
#. If you depend on external libraries which use requests, you can use code
 | 
			
		||||
   like:
 | 
			
		||||
 | 
			
		||||
   .. code-block:: python
 | 
			
		||||
 | 
			
		||||
       >>> from requests_toolbelt.adapters import appengine
 | 
			
		||||
       >>> appengine.monkeypatch()
 | 
			
		||||
 | 
			
		||||
which will ensure all requests.Session objects use AppEngineAdapter properly.
 | 
			
		||||
"""
 | 
			
		||||
import requests
 | 
			
		||||
from requests import adapters
 | 
			
		||||
from requests import sessions
 | 
			
		||||
 | 
			
		||||
from .. import exceptions as exc
 | 
			
		||||
from .._compat import gaecontrib
 | 
			
		||||
from .._compat import timeout
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class AppEngineAdapter(adapters.HTTPAdapter):
 | 
			
		||||
    """The transport adapter for Requests to use urllib3's GAE support.
 | 
			
		||||
 | 
			
		||||
    Implements Requests's HTTPAdapter API.
 | 
			
		||||
 | 
			
		||||
    When deploying to Google's App Engine service, some of Requests'
 | 
			
		||||
    functionality is broken. There is underlying support for GAE in urllib3.
 | 
			
		||||
    This functionality, however, is opt-in and needs to be enabled explicitly
 | 
			
		||||
    for Requests to be able to use it.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    def __init__(self, validate_certificate=True, *args, **kwargs):
 | 
			
		||||
        _check_version()
 | 
			
		||||
        self._validate_certificate = validate_certificate
 | 
			
		||||
        super(AppEngineAdapter, self).__init__(*args, **kwargs)
 | 
			
		||||
 | 
			
		||||
    def init_poolmanager(self, connections, maxsize, block=False):
 | 
			
		||||
        self.poolmanager = _AppEnginePoolManager(self._validate_certificate)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class _AppEnginePoolManager(object):
 | 
			
		||||
    """Implements urllib3's PoolManager API expected by requests.
 | 
			
		||||
 | 
			
		||||
    While a real PoolManager map hostnames to reusable Connections,
 | 
			
		||||
    AppEngine has no concept of a reusable connection to a host.
 | 
			
		||||
    So instead, this class constructs a small Connection per request,
 | 
			
		||||
    that is returned to the Adapter and used to access the URL.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    def __init__(self, validate_certificate=True):
 | 
			
		||||
        self.appengine_manager = gaecontrib.AppEngineManager(
 | 
			
		||||
            validate_certificate=validate_certificate)
 | 
			
		||||
 | 
			
		||||
    def connection_from_url(self, url):
 | 
			
		||||
        return _AppEngineConnection(self.appengine_manager, url)
 | 
			
		||||
 | 
			
		||||
    def clear(self):
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class _AppEngineConnection(object):
 | 
			
		||||
    """Implements urllib3's HTTPConnectionPool API's urlopen().
 | 
			
		||||
 | 
			
		||||
    This Connection's urlopen() is called with a host-relative path,
 | 
			
		||||
    so in order to properly support opening the URL, we need to store
 | 
			
		||||
    the full URL when this Connection is constructed from the PoolManager.
 | 
			
		||||
 | 
			
		||||
    This code wraps AppEngineManager.urlopen(), which exposes a different
 | 
			
		||||
    API than in the original urllib3 urlopen(), and thus needs this adapter.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    def __init__(self, appengine_manager, url):
 | 
			
		||||
        self.appengine_manager = appengine_manager
 | 
			
		||||
        self.url = url
 | 
			
		||||
 | 
			
		||||
    def urlopen(self, method, url, body=None, headers=None, retries=None,
 | 
			
		||||
                redirect=True, assert_same_host=True,
 | 
			
		||||
                timeout=timeout.Timeout.DEFAULT_TIMEOUT,
 | 
			
		||||
                pool_timeout=None, release_conn=None, **response_kw):
 | 
			
		||||
        # This function's url argument is a host-relative URL,
 | 
			
		||||
        # but the AppEngineManager expects an absolute URL.
 | 
			
		||||
        # So we saved out the self.url when the AppEngineConnection
 | 
			
		||||
        # was constructed, which we then can use down below instead.
 | 
			
		||||
 | 
			
		||||
        # We once tried to verify our assumptions here, but sometimes the
 | 
			
		||||
        # passed-in URL differs on url fragments, or "http://a.com" vs "/".
 | 
			
		||||
 | 
			
		||||
        # urllib3's App Engine adapter only uses Timeout.total, not read or
 | 
			
		||||
        # connect.
 | 
			
		||||
        if not timeout.total:
 | 
			
		||||
            timeout.total = timeout._read or timeout._connect
 | 
			
		||||
 | 
			
		||||
        # Jump through the hoops necessary to call AppEngineManager's API.
 | 
			
		||||
        return self.appengine_manager.urlopen(
 | 
			
		||||
            method,
 | 
			
		||||
            self.url,
 | 
			
		||||
            body=body,
 | 
			
		||||
            headers=headers,
 | 
			
		||||
            retries=retries,
 | 
			
		||||
            redirect=redirect,
 | 
			
		||||
            timeout=timeout,
 | 
			
		||||
            **response_kw)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def monkeypatch():
 | 
			
		||||
    """Sets up all Sessions to use AppEngineAdapter by default.
 | 
			
		||||
 | 
			
		||||
    If you don't want to deal with configuring your own Sessions,
 | 
			
		||||
    or if you use libraries that use requests directly (ie requests.post),
 | 
			
		||||
    then you may prefer to monkeypatch and auto-configure all Sessions.
 | 
			
		||||
    """
 | 
			
		||||
    _check_version()
 | 
			
		||||
    # HACK: We should consider modifying urllib3 to support this cleanly,
 | 
			
		||||
    # so that we can set a module-level variable in the sessions module,
 | 
			
		||||
    # instead of overriding an imported HTTPAdapter as is done here.
 | 
			
		||||
    sessions.HTTPAdapter = AppEngineAdapter
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _check_version():
 | 
			
		||||
    if gaecontrib is None:
 | 
			
		||||
        raise exc.VersionMismatchError(
 | 
			
		||||
            "The toolbelt requires at least Requests 2.10.0 to be "
 | 
			
		||||
            "installed. Version {0} was found instead.".format(
 | 
			
		||||
                requests.__version__
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,48 @@
 | 
			
		|||
# -*- coding: utf-8 -*-
 | 
			
		||||
"""Submodule containing the implementation for the FingerprintAdapter.
 | 
			
		||||
 | 
			
		||||
This file contains an implementation of a Transport Adapter that validates
 | 
			
		||||
the fingerprints of SSL certificates presented upon connection.
 | 
			
		||||
"""
 | 
			
		||||
from requests.adapters import HTTPAdapter
 | 
			
		||||
 | 
			
		||||
from .._compat import poolmanager
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class FingerprintAdapter(HTTPAdapter):
 | 
			
		||||
    """
 | 
			
		||||
    A HTTPS Adapter for Python Requests that verifies certificate fingerprints,
 | 
			
		||||
    instead of certificate hostnames.
 | 
			
		||||
 | 
			
		||||
    Example usage:
 | 
			
		||||
 | 
			
		||||
    .. code-block:: python
 | 
			
		||||
 | 
			
		||||
        import requests
 | 
			
		||||
        import ssl
 | 
			
		||||
        from requests_toolbelt.adapters.fingerprint import FingerprintAdapter
 | 
			
		||||
 | 
			
		||||
        twitter_fingerprint = '...'
 | 
			
		||||
        s = requests.Session()
 | 
			
		||||
        s.mount(
 | 
			
		||||
            'https://twitter.com',
 | 
			
		||||
            FingerprintAdapter(twitter_fingerprint)
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    The fingerprint should be provided as a hexadecimal string, optionally
 | 
			
		||||
    containing colons.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    __attrs__ = HTTPAdapter.__attrs__ + ['fingerprint']
 | 
			
		||||
 | 
			
		||||
    def __init__(self, fingerprint, **kwargs):
 | 
			
		||||
        self.fingerprint = fingerprint
 | 
			
		||||
 | 
			
		||||
        super(FingerprintAdapter, self).__init__(**kwargs)
 | 
			
		||||
 | 
			
		||||
    def init_poolmanager(self, connections, maxsize, block=False):
 | 
			
		||||
        self.poolmanager = poolmanager.PoolManager(
 | 
			
		||||
            num_pools=connections,
 | 
			
		||||
            maxsize=maxsize,
 | 
			
		||||
            block=block,
 | 
			
		||||
            assert_fingerprint=self.fingerprint)
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,43 @@
 | 
			
		|||
# -*- coding: utf-8 -*-
 | 
			
		||||
"""
 | 
			
		||||
requests_toolbelt.adapters.host_header_ssl
 | 
			
		||||
==========================================
 | 
			
		||||
 | 
			
		||||
This file contains an implementation of the HostHeaderSSLAdapter.
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
from requests.adapters import HTTPAdapter
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class HostHeaderSSLAdapter(HTTPAdapter):
 | 
			
		||||
    """
 | 
			
		||||
    A HTTPS Adapter for Python Requests that sets the hostname for certificate
 | 
			
		||||
    verification based on the Host header.
 | 
			
		||||
 | 
			
		||||
    This allows requesting the IP address directly via HTTPS without getting
 | 
			
		||||
    a "hostname doesn't match" exception.
 | 
			
		||||
 | 
			
		||||
    Example usage:
 | 
			
		||||
 | 
			
		||||
        >>> s.mount('https://', HostHeaderSSLAdapter())
 | 
			
		||||
        >>> s.get("https://93.184.216.34", headers={"Host": "example.org"})
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    def send(self, request, **kwargs):
 | 
			
		||||
        # HTTP headers are case-insensitive (RFC 7230)
 | 
			
		||||
        host_header = None
 | 
			
		||||
        for header in request.headers:
 | 
			
		||||
            if header.lower() == "host":
 | 
			
		||||
                host_header = request.headers[header]
 | 
			
		||||
                break
 | 
			
		||||
 | 
			
		||||
        connection_pool_kwargs = self.poolmanager.connection_pool_kw
 | 
			
		||||
 | 
			
		||||
        if host_header:
 | 
			
		||||
            connection_pool_kwargs["assert_hostname"] = host_header
 | 
			
		||||
        elif "assert_hostname" in connection_pool_kwargs:
 | 
			
		||||
            # an assert_hostname from a previous request may have been left
 | 
			
		||||
            connection_pool_kwargs.pop("assert_hostname", None)
 | 
			
		||||
 | 
			
		||||
        return super(HostHeaderSSLAdapter, self).send(request, **kwargs)
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,118 @@
 | 
			
		|||
# -*- coding: utf-8 -*-
 | 
			
		||||
"""The implementation of the SocketOptionsAdapter."""
 | 
			
		||||
import socket
 | 
			
		||||
import warnings
 | 
			
		||||
 | 
			
		||||
import requests
 | 
			
		||||
from requests import adapters
 | 
			
		||||
 | 
			
		||||
from .._compat import connection
 | 
			
		||||
from .._compat import poolmanager
 | 
			
		||||
from .. import exceptions as exc
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SocketOptionsAdapter(adapters.HTTPAdapter):
 | 
			
		||||
    """An adapter for requests that allows users to specify socket options.
 | 
			
		||||
 | 
			
		||||
    Since version 2.4.0 of requests, it is possible to specify a custom list
 | 
			
		||||
    of socket options that need to be set before establishing the connection.
 | 
			
		||||
 | 
			
		||||
    Example usage::
 | 
			
		||||
 | 
			
		||||
        >>> import socket
 | 
			
		||||
        >>> import requests
 | 
			
		||||
        >>> from requests_toolbelt.adapters import socket_options
 | 
			
		||||
        >>> s = requests.Session()
 | 
			
		||||
        >>> opts = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 0)]
 | 
			
		||||
        >>> adapter = socket_options.SocketOptionsAdapter(socket_options=opts)
 | 
			
		||||
        >>> s.mount('http://', adapter)
 | 
			
		||||
 | 
			
		||||
    You can also take advantage of the list of default options on this class
 | 
			
		||||
    to keep using the original options in addition to your custom options. In
 | 
			
		||||
    that case, ``opts`` might look like::
 | 
			
		||||
 | 
			
		||||
        >>> opts = socket_options.SocketOptionsAdapter.default_options + opts
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    if connection is not None:
 | 
			
		||||
        default_options = getattr(
 | 
			
		||||
            connection.HTTPConnection,
 | 
			
		||||
            'default_socket_options',
 | 
			
		||||
            [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]
 | 
			
		||||
        )
 | 
			
		||||
    else:
 | 
			
		||||
        default_options = []
 | 
			
		||||
        warnings.warn(exc.RequestsVersionTooOld,
 | 
			
		||||
                      "This version of Requests is only compatible with a "
 | 
			
		||||
                      "version of urllib3 which is too old to support "
 | 
			
		||||
                      "setting options on a socket. This adapter is "
 | 
			
		||||
                      "functionally useless.")
 | 
			
		||||
 | 
			
		||||
    def __init__(self, **kwargs):
 | 
			
		||||
        self.socket_options = kwargs.pop('socket_options',
 | 
			
		||||
                                         self.default_options)
 | 
			
		||||
 | 
			
		||||
        super(SocketOptionsAdapter, self).__init__(**kwargs)
 | 
			
		||||
 | 
			
		||||
    def init_poolmanager(self, connections, maxsize, block=False):
 | 
			
		||||
        if requests.__build__ >= 0x020400:
 | 
			
		||||
            # NOTE(Ian): Perhaps we should raise a warning
 | 
			
		||||
            self.poolmanager = poolmanager.PoolManager(
 | 
			
		||||
                num_pools=connections,
 | 
			
		||||
                maxsize=maxsize,
 | 
			
		||||
                block=block,
 | 
			
		||||
                socket_options=self.socket_options
 | 
			
		||||
            )
 | 
			
		||||
        else:
 | 
			
		||||
            super(SocketOptionsAdapter, self).init_poolmanager(
 | 
			
		||||
                connections, maxsize, block
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class TCPKeepAliveAdapter(SocketOptionsAdapter):
 | 
			
		||||
    """An adapter for requests that turns on TCP Keep-Alive by default.
 | 
			
		||||
 | 
			
		||||
    The adapter sets 4 socket options:
 | 
			
		||||
 | 
			
		||||
    - ``SOL_SOCKET`` ``SO_KEEPALIVE`` - This turns on TCP Keep-Alive
 | 
			
		||||
    - ``IPPROTO_TCP`` ``TCP_KEEPINTVL`` 20 - Sets the keep alive interval
 | 
			
		||||
    - ``IPPROTO_TCP`` ``TCP_KEEPCNT`` 5 - Sets the number of keep alive probes
 | 
			
		||||
    - ``IPPROTO_TCP`` ``TCP_KEEPIDLE`` 60 - Sets the keep alive time if the
 | 
			
		||||
      socket library has the ``TCP_KEEPIDLE`` constant
 | 
			
		||||
 | 
			
		||||
    The latter three can be overridden by keyword arguments (respectively):
 | 
			
		||||
 | 
			
		||||
    - ``idle``
 | 
			
		||||
    - ``interval``
 | 
			
		||||
    - ``count``
 | 
			
		||||
 | 
			
		||||
    You can use this adapter like so::
 | 
			
		||||
 | 
			
		||||
       >>> from requests_toolbelt.adapters import socket_options
 | 
			
		||||
       >>> tcp = socket_options.TCPKeepAliveAdapter(idle=120, interval=10)
 | 
			
		||||
       >>> s = requests.Session()
 | 
			
		||||
       >>> s.mount('http://', tcp)
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    def __init__(self, **kwargs):
 | 
			
		||||
        socket_options = kwargs.pop('socket_options',
 | 
			
		||||
                                    SocketOptionsAdapter.default_options)
 | 
			
		||||
        idle = kwargs.pop('idle', 60)
 | 
			
		||||
        interval = kwargs.pop('interval', 20)
 | 
			
		||||
        count = kwargs.pop('count', 5)
 | 
			
		||||
        socket_options = socket_options + [
 | 
			
		||||
            (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1),
 | 
			
		||||
            (socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, interval),
 | 
			
		||||
            (socket.IPPROTO_TCP, socket.TCP_KEEPCNT, count),
 | 
			
		||||
        ]
 | 
			
		||||
 | 
			
		||||
        # NOTE(Ian): Apparently OSX does not have this constant defined, so we
 | 
			
		||||
        # set it conditionally.
 | 
			
		||||
        if getattr(socket, 'TCP_KEEPIDLE', None) is not None:
 | 
			
		||||
            socket_options += [(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, idle)]
 | 
			
		||||
 | 
			
		||||
        super(TCPKeepAliveAdapter, self).__init__(
 | 
			
		||||
            socket_options=socket_options, **kwargs
 | 
			
		||||
        )
 | 
			
		||||
							
								
								
									
										67
									
								
								venv/Lib/site-packages/requests_toolbelt/adapters/source.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								venv/Lib/site-packages/requests_toolbelt/adapters/source.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,67 @@
 | 
			
		|||
# -*- coding: utf-8 -*-
 | 
			
		||||
"""
 | 
			
		||||
requests_toolbelt.source_adapter
 | 
			
		||||
================================
 | 
			
		||||
 | 
			
		||||
This file contains an implementation of the SourceAddressAdapter originally
 | 
			
		||||
demonstrated on the Requests GitHub page.
 | 
			
		||||
"""
 | 
			
		||||
from requests.adapters import HTTPAdapter
 | 
			
		||||
 | 
			
		||||
from .._compat import poolmanager, basestring
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SourceAddressAdapter(HTTPAdapter):
 | 
			
		||||
    """
 | 
			
		||||
    A Source Address Adapter for Python Requests that enables you to choose the
 | 
			
		||||
    local address to bind to. This allows you to send your HTTP requests from a
 | 
			
		||||
    specific interface and IP address.
 | 
			
		||||
 | 
			
		||||
    Two address formats are accepted. The first is a string: this will set the
 | 
			
		||||
    local IP address to the address given in the string, and will also choose a
 | 
			
		||||
    semi-random high port for the local port number.
 | 
			
		||||
 | 
			
		||||
    The second is a two-tuple of the form (ip address, port): for example,
 | 
			
		||||
    ``('10.10.10.10', 8999)``. This will set the local IP address to the first
 | 
			
		||||
    element, and the local port to the second element. If ``0`` is used as the
 | 
			
		||||
    port number, a semi-random high port will be selected.
 | 
			
		||||
 | 
			
		||||
    .. warning:: Setting an explicit local port can have negative interactions
 | 
			
		||||
                 with connection-pooling in Requests: in particular, it risks
 | 
			
		||||
                 the possibility of getting "Address in use" errors. The
 | 
			
		||||
                 string-only argument is generally preferred to the tuple-form.
 | 
			
		||||
 | 
			
		||||
    Example usage:
 | 
			
		||||
 | 
			
		||||
    .. code-block:: python
 | 
			
		||||
 | 
			
		||||
        import requests
 | 
			
		||||
        from requests_toolbelt.adapters.source import SourceAddressAdapter
 | 
			
		||||
 | 
			
		||||
        s = requests.Session()
 | 
			
		||||
        s.mount('http://', SourceAddressAdapter('10.10.10.10'))
 | 
			
		||||
        s.mount('https://', SourceAddressAdapter(('10.10.10.10', 8999))
 | 
			
		||||
    """
 | 
			
		||||
    def __init__(self, source_address, **kwargs):
 | 
			
		||||
        if isinstance(source_address, basestring):
 | 
			
		||||
            self.source_address = (source_address, 0)
 | 
			
		||||
        elif isinstance(source_address, tuple):
 | 
			
		||||
            self.source_address = source_address
 | 
			
		||||
        else:
 | 
			
		||||
            raise TypeError(
 | 
			
		||||
                "source_address must be IP address string or (ip, port) tuple"
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
        super(SourceAddressAdapter, self).__init__(**kwargs)
 | 
			
		||||
 | 
			
		||||
    def init_poolmanager(self, connections, maxsize, block=False):
 | 
			
		||||
        self.poolmanager = poolmanager.PoolManager(
 | 
			
		||||
            num_pools=connections,
 | 
			
		||||
            maxsize=maxsize,
 | 
			
		||||
            block=block,
 | 
			
		||||
            source_address=self.source_address)
 | 
			
		||||
 | 
			
		||||
    def proxy_manager_for(self, *args, **kwargs):
 | 
			
		||||
        kwargs['source_address'] = self.source_address
 | 
			
		||||
        return super(SourceAddressAdapter, self).proxy_manager_for(
 | 
			
		||||
            *args, **kwargs)
 | 
			
		||||
							
								
								
									
										66
									
								
								venv/Lib/site-packages/requests_toolbelt/adapters/ssl.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								venv/Lib/site-packages/requests_toolbelt/adapters/ssl.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,66 @@
 | 
			
		|||
# -*- coding: utf-8 -*-
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
requests_toolbelt.ssl_adapter
 | 
			
		||||
=============================
 | 
			
		||||
 | 
			
		||||
This file contains an implementation of the SSLAdapter originally demonstrated
 | 
			
		||||
in this blog post:
 | 
			
		||||
https://lukasa.co.uk/2013/01/Choosing_SSL_Version_In_Requests/
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
import requests
 | 
			
		||||
 | 
			
		||||
from requests.adapters import HTTPAdapter
 | 
			
		||||
 | 
			
		||||
from .._compat import poolmanager
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SSLAdapter(HTTPAdapter):
 | 
			
		||||
    """
 | 
			
		||||
    A HTTPS Adapter for Python Requests that allows the choice of the SSL/TLS
 | 
			
		||||
    version negotiated by Requests. This can be used either to enforce the
 | 
			
		||||
    choice of high-security TLS versions (where supported), or to work around
 | 
			
		||||
    misbehaving servers that fail to correctly negotiate the default TLS
 | 
			
		||||
    version being offered.
 | 
			
		||||
 | 
			
		||||
    Example usage:
 | 
			
		||||
 | 
			
		||||
        >>> import requests
 | 
			
		||||
        >>> import ssl
 | 
			
		||||
        >>> from requests_toolbelt import SSLAdapter
 | 
			
		||||
        >>> s = requests.Session()
 | 
			
		||||
        >>> s.mount('https://', SSLAdapter(ssl.PROTOCOL_TLSv1))
 | 
			
		||||
 | 
			
		||||
    You can replace the chosen protocol with any that are available in the
 | 
			
		||||
    default Python SSL module. All subsequent requests that match the adapter
 | 
			
		||||
    prefix will use the chosen SSL version instead of the default.
 | 
			
		||||
 | 
			
		||||
    This adapter will also attempt to change the SSL/TLS version negotiated by
 | 
			
		||||
    Requests when using a proxy. However, this may not always be possible:
 | 
			
		||||
    prior to Requests v2.4.0 the adapter did not have access to the proxy setup
 | 
			
		||||
    code. In earlier versions of Requests, this adapter will not function
 | 
			
		||||
    properly when used with proxies.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    __attrs__ = HTTPAdapter.__attrs__ + ['ssl_version']
 | 
			
		||||
 | 
			
		||||
    def __init__(self, ssl_version=None, **kwargs):
 | 
			
		||||
        self.ssl_version = ssl_version
 | 
			
		||||
 | 
			
		||||
        super(SSLAdapter, self).__init__(**kwargs)
 | 
			
		||||
 | 
			
		||||
    def init_poolmanager(self, connections, maxsize, block=False):
 | 
			
		||||
        self.poolmanager = poolmanager.PoolManager(
 | 
			
		||||
            num_pools=connections,
 | 
			
		||||
            maxsize=maxsize,
 | 
			
		||||
            block=block,
 | 
			
		||||
            ssl_version=self.ssl_version)
 | 
			
		||||
 | 
			
		||||
    if requests.__build__ >= 0x020400:
 | 
			
		||||
        # Earlier versions of requests either don't have this method or, worse,
 | 
			
		||||
        # don't allow passing arbitrary keyword arguments. As a result, only
 | 
			
		||||
        # conditionally define this method.
 | 
			
		||||
        def proxy_manager_for(self, *args, **kwargs):
 | 
			
		||||
            kwargs['ssl_version'] = self.ssl_version
 | 
			
		||||
            return super(SSLAdapter, self).proxy_manager_for(*args, **kwargs)
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue