o
    .jA                     @  sP  U d Z ddlmZ ddlZdZded< zddlmZmZm	Z	m
Z
 ddlmZ d	d
lmZ W n8 eye   ddlmZ zddlZW n eyO   ede Y nw d	dlmZmZmZmZmZ dZesc Y nw esddlZddlmZ ddlmZ ddlmZm Z  ddl!m"Z"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z) ddl*m+Z+m,Z, ddl-m.Z.m/Z/ ddl0m1Z1 ddlm2Z2m3Z3 ddl4m5Z5 ddl6m7Z7 G dd de+ZG dd  d ee,ZG d!d" d"e.ZG d#d$ d$e/ZG d%d& d&e5ZG d'd( d(eZ8G d)d* d*e8e Z9G d+d, d,e"Z:G d-d. d.e#Z;G d/d0 d0e%Z<g d1Z=es&e=g d27 Z=dS dS )3a  
This module contains provisional support for SOCKS proxies from within
urllib3. This module supports SOCKS4, SOCKS4A (an extension of SOCKS4), and
SOCKS5. To enable its functionality, either install python-socks or install this
module with the ``socks`` extra.

The SOCKS implementation supports the full range of urllib3 features. It also
supports the following SOCKS features:

- SOCKS4A (``proxy_url='socks4a://...``)
- SOCKS4 (``proxy_url='socks4://...``)
- SOCKS5 with remote DNS (``proxy_url='socks5h://...``)
- SOCKS5 with local DNS (``proxy_url='socks5://...``)
- Usernames and passwords for the SOCKS proxy

.. note::
   It is recommended to use ``socks5h://`` or ``socks4a://`` schemes in
   your ``proxy_url`` to ensure that DNS resolution is done from the remote
   server instead of client-side when connecting to a domain name.

SOCKS4 supports IPv4 and domain names with the SOCKS4A extension. SOCKS5
supports IPv4, IPv6, and domain names.

When connecting to a SOCKS4 proxy the ``username`` portion of the ``proxy_url``
will be sent as the ``userid`` section of the SOCKS request:

.. code-block:: python

    proxy_url="socks4a://<userid>@proxy-host"

When connecting to a SOCKS5 proxy the ``username`` and ``password`` portion
of the ``proxy_url`` will be sent as the username/password to authenticate
with the proxy:

.. code-block:: python

    proxy_url="socks5h://<username>:<password>@proxy-host"

    )annotationsNFboolBYPASS_SOCKS_LEGACY)ProxyConnectionError
ProxyErrorProxyTimeoutError	ProxyType)Proxy   )AsyncioProxy   )DependencyWarningzSOCKS support in urllib3.future requires the installation of an optional dependency: python-socks. For more information, see https://urllib3future.readthedocs.io/en/latest/contrib.html#socks-proxies)SOCKSConnectionSOCKSHTTPConnectionPoolSOCKSHTTPSConnectionSOCKSHTTPSConnectionPoolSOCKSProxyManagerT)socket)timeout)AsyncHTTPConnectionAsyncHTTPSConnection)AsyncHTTPConnectionPoolAsyncHTTPSConnectionPool)AsyncPoolManager)_TYPE_SOCKS_OPTIONS)HttpVersion)HTTPConnectionHTTPSConnection)HTTPConnectionPoolHTTPSConnectionPool)AsyncSocket)ConnectTimeoutErrorNewConnectionError)PoolManager)	parse_urlc                      ,   e Zd ZdZd fd	d
ZdddZ  ZS )r   O
        A plain-text HTTP connection that connects via a SOCKS proxy.
        _socks_optionsr   args
typing.AnykwargsreturnNonec                      || _ t j|i | d S Nr'   super__init__selfr'   r(   r*   	__class__ J/home/thesage/.local/lib/python3.10/site-packages/urllib3/contrib/socks.pyr1   r      zSOCKSConnection.__init__r   c           	   
     s  i } j r
 j |d<  jr?g } jD ](}t|dkr || qt|dkr:|d  }|dkr1q||dd  q||d< zz jd dusIJ  jd dusRJ t jd	  jd t jd  jd
  jd  jd d} jj	 jd t jd f j
 j |d d fddd}t  tdt |j j j j
|d}|W  d   W S 1 sw   Y  W dS  ttfy } zt d j d j
 d|d}~w ttfy } z	t d| |d}~w ty } z	t d| |d}~ww )I
            Establish a new connection via the SOCKS proxy.
            source_address      udpNsocket_options
proxy_host
proxy_portsocks_versionusernamepasswordrdns
proxy_typehostportrB   rC   rD   Fc                      t  d| S N_connect_timingssetattr_r3   r6   r7   <lambda>       z+SOCKSConnection._new_conn.<locals>.<lambda>r   r:   r>   quic_upgrade_via_dns_rrtiming_hookignore)_socketConnection to  timed out. (connect timeout=)&Failed to establish a new connection: )r:   r>   lenappendlowerr'   r	   int	_resolvercreate_connectionr   warningscatch_warningssimplefilterDeprecationWarningconnectrG   rH   SocketTimeoutr   r!   r   r   r"   OSError)	r3   extra_kwonly_tcp_optionsoptprotocolprW   socker6   rP   r7   	_new_conn{   s   

	

(	

zSOCKSConnection._new_connr'   r   r(   r)   r*   r)   r+   r,   )r+   r   __name__
__module____qualname____doc__r1   rp   __classcell__r6   r6   r4   r7   r   m       	r   c                   @     e Zd ZdS )r   Nrs   rt   ru   r6   r6   r6   r7   r          r   c                   @     e Zd ZeZdS )r   N)rs   rt   ru   r   ConnectionClsr6   r6   r6   r7   r          r   c                   @  r|   )r   N)rs   rt   ru   r   r}   r6   r6   r6   r7   r      r~   r   c                      6   e Zd ZdZeedZ				dd fddZ  ZS )r   t
        A version of the urllib3 ProxyManager that routes connections via the
        defined SOCKS proxy.
        httphttpsN
   	proxy_urlstrrB   
str | NonerC   	num_poolsr_   headerstyping.Mapping[str, str] | Noneconnection_pool_kwr)   c                     t |}|d u r!|d u r!|jd ur!|jd}t|dkr!|\}}|jdkr,tj}	d}
n(|jdkr7tj}	d}
n|jdkrBtj}	d}
n|jdkrMtj}	d}
ntd	| || _	|	|j
|j|||
d
}||d< d|vrot |d< |d tj t j||fi | tj| _d S N:r   socks5Fsocks5hTsocks4socks4az'Unable to determine SOCKS version from )rA   r?   r@   rB   rC   rD   r'   disabled_svn)r$   authsplitr\   schemer   SOCKS5SOCKS4
ValueErrorr   rG   rH   setaddr   h3r0   r1   r   pool_classes_by_schemer3   r   rB   rC   r   r   r   parsedr   rA   rD   socks_optionsr4   r6   r7   r1      @   	




zSOCKSProxyManager.__init__NNr   Nr   r   rB   r   rC   r   r   r_   r   r   r   r)   )	rs   rt   ru   rv   r   r   r   r1   rw   r6   r6   r4   r7   r          r   c                      r%   )AsyncSOCKSConnectionr&   r'   r   r(   r)   r*   r+   r,   c                   r-   r.   r/   r2   r4   r6   r7   r1     r8   zAsyncSOCKSConnection.__init__r    c              
     s  i } j r j |d<  jr@g } jD ](}t|dkr!|| qt|dkr;|d  }|dkr2q||dd  q||d< z` jd dusJJ  jd dusSJ t jd	  jd t jd  jd
  jd  jd d} jj	 jd t jd f j
 j |d d fdddI dH }| j j j
|I dH W S  ttfy } zt d j d j
 d|d}~w ttfy } z	t d| |d}~w ty } z	t d| |d}~ww )r9   r:   r;   r<   r=   Nr>   r?   r@   rA   rB   rC   rD   rE   Fc                   rI   rJ   rL   rN   rP   r6   r7   rQ   M  rR   z0AsyncSOCKSConnection._new_conn.<locals>.<lambda>rS   rX   rY   rZ   r[   )r:   r>   r\   r]   r^   r'   r   r_   r`   ra   r   rf   rG   rH   rg   r   r!   r   r   r"   rh   )r3   ri   rj   rk   rl   rm   rW   ro   r6   rP   r7   rp   !  s   

	


zAsyncSOCKSConnection._new_connrq   )r+   r    rr   r6   r6   r4   r7   r     rx   r   c                   @  ry   )AsyncSOCKSHTTPSConnectionNrz   r6   r6   r6   r7   r   j  r{   r   c                   @  r|   )AsyncSOCKSHTTPConnectionPoolN)rs   rt   ru   r   r}   r6   r6   r6   r7   r   m  r~   r   c                   @  r|   )AsyncSOCKSHTTPSConnectionPoolN)rs   rt   ru   r   r}   r6   r6   r6   r7   r   p  r~   r   c                      r   )AsyncSOCKSProxyManagerr   r   Nr   r   r   rB   r   rC   r   r_   r   r   r   r)   c                   r   r   )r$   r   r   r\   r   r   r   r   r   r   rG   rH   r   r   r   r   r0   r1   r   r   r   r4   r6   r7   r1   ~  r   zAsyncSOCKSProxyManager.__init__r   r   )	rs   rt   ru   rv   r   r   r   r1   rw   r6   r6   r4   r7   r   s  r   r   )r   r   r   r   r   )r   r   r   r   r   )>rv   
__future__r   rb   r   __annotations__python_socksr   r   r   r   python_socks.syncr	   _socks_overrider   ImportError
exceptionsr   sockswarn_socks_legacyr   r   r   r   r   typingr   r   rg   _async.connectionr   r   _async.connectionpoolr   r   _async.poolmanagerr   _typingr   backendr   
connectionr   r   connectionpoolr   r   contrib.ssar    r!   r"   poolmanagerr#   util.urlr$   r   r   r   r   r   __all__r6   r6   r6   r7   <module>   sj    (
_>W?