U
    ÎZjÇ  ã                   @   sr   d Z ddlZddlZddlZddlmZ ddlmZ ddlmZ ddlm	Z
 G dd	„ d	ejƒZG d
d„ deƒZdS )z/The implementation of the SocketOptionsAdapter.é    N)Úadaptersé   )Ú
connection)Úpoolmanager)Ú
exceptionsc                       sd   e Zd ZdZedk	r0eejdejej	dfgƒZ
ng Z
e ejd¡ ‡ fdd„Zd‡ fd	d
„	Z‡  ZS )ÚSocketOptionsAdapterad  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

    NÚdefault_socket_optionsé   z¤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.c                    s&   |  d| j¡| _tt| ƒjf |Ž d S )NÚsocket_options)ÚpopÚdefault_optionsr
   Úsuperr   Ú__init__)ÚselfÚkwargs©Ú	__class__© úl/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/requests_toolbelt/adapters/socket_options.pyr   4   s    ÿzSocketOptionsAdapter.__init__Fc                    s:   t jdkr"tj|||| jd�| _ntt| ƒ |||¡ d S )Ni  )Ú	num_poolsÚmaxsizeÚblockr
   )ÚrequestsÚ	__build__r   ÚPoolManagerr
   r   r   Úinit_poolmanager)r   Úconnectionsr   r   r   r   r   r   :   s    
ü

  ÿz%SocketOptionsAdapter.init_poolmanager)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚgetattrÚHTTPConnectionÚsocketÚIPPROTO_TCPÚTCP_NODELAYr   ÚwarningsÚwarnÚexcZRequestsVersionTooOldr   r   Ú__classcell__r   r   r   r   r      s   ýÿr   c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚTCPKeepAliveAdapteraJ  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)

    c                    s    |  dtj¡}|  dd¡}|  dd¡}|  dd¡}|tjtjdftjtj|ftjtj|fg }t	td	d ƒd k	r‚|tjtj
|fg7 }tt| ƒjf d|i|—Ž d S )
Nr
   Úidleé<   Úintervalé   Úcounté   r	   ÚTCP_KEEPIDLE)r   r   r   r#   Ú
SOL_SOCKETÚSO_KEEPALIVEr$   ÚTCP_KEEPINTVLÚTCP_KEEPCNTr!   r1   r   r*   r   )r   r   r
   r+   r-   r/   r   r   r   r   c   s$    ÿýÿÿzTCPKeepAliveAdapter.__init__)r   r   r   r    r   r)   r   r   r   r   r*   I   s   r*   )r    r#   r&   r   r   Z_compatr   r   Ú r   r(   ÚHTTPAdapterr   r*   r   r   r   r   Ú<module>   s   ;