o
    Vh                     @   sz   d Z ddl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ure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   zThis 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di | d S )Nsocket_options )popdefault_optionsr
   superr   __init__)selfkwargs	__class__r   }/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/requests_toolbelt/adapters/socket_options.pyr   5   s   zSocketOptionsAdapter.__init__Fc                    s<   t jdkrtj|||| jd| _d S 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exc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):

    - ``interval``
    - ``count``
    - ``idle``

    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g }ttd	d d ur6|tjtj|fg7 }nt	j
d
krJttdd}|tj||fg7 }ttdd d ur\|tjtj|fg7 }ttdd d urn|tjtj|fg7 }tt| jdd|i| d S )Nr
   idle<   interval   count   r	   TCP_KEEPINTVLdarwinTCP_KEEPALIVE   TCP_KEEPCNTTCP_KEEPIDLEr   )r   r   r   r#   
SOL_SOCKETSO_KEEPALIVEr!   r$   r2   sysplatformr6   r7   r   r+   r   )r   r   r
   r,   r.   r0   r4   r   r   r   r   d   s2   



zTCPKeepAliveAdapter.__init__)r   r   r   r    r   r*   r   r   r   r   r+   J   s    r+   )r    r#   r&   r:   r   r   _compatr   r    r   r(   HTTPAdapterr   r+   r   r   r   r   <module>   s   ;