o
    .j                     @  s   d Z ddlm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 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 ddlmZ G dd de	jZd ddZ G dd dZ!dS )!a  
This is hazmat. It can blow up anytime.
Use it with precautions!

Reasoning behind this:

1) python-socks requires another dependency, namely asyncio-timeout, that is one too much for us.
2) it does not support our AsyncSocket wrapper (it has his own internally)
    )annotationsN)_abc)AsyncConnector)Socks4AsyncConnector)Socks5AsyncConnector)
ProxyErrorProxyTimeoutErrorparse_proxy_url)
ReplyError)	ProxyType   )AsyncSocket)timeoutc                   @  s(   e Zd ZdddZdejfdddZdS )Resolverloopasyncio.AbstractEventLoopc                 C  s
   || _ d S N)_loop)selfr    r   T/home/thesage/.local/lib/python3.10/site-packages/urllib3/contrib/_socks_override.py__init__#   s   
zResolver.__init__r   hoststrportintfamilysocket.AddressFamilyreturn tuple[socket.AddressFamily, str]c                   sl   | j j|||tjdI d H }|std| d| d| dt|dd d}|d	 \}}}}}||d	 fS )
N)r   r   r   typezCan`t resolve address :z []c                 S  s   | d S )Nr   r   )infor   r   r   <lambda>3   s    z"Resolver.resolve.<locals>.<lambda>)keyr   )r   getaddrinfosocketSOCK_STREAMOSErrorsorted)r   r   r   r   infos_addressr   r   r   resolve&   s   zResolver.resolveN)r   r   )r   r   r   r   r   r   r   r    )__name__
__module____qualname__r   r(   	AF_UNSPECr/   r   r   r   r   r   "   s    
r   
proxy_typer   username
str | Nonepasswordrdnsboolresolverabc.AsyncResolverr   r   c                 C  s@   | t jkrt|||dS | t jkrt||||dS td|  )N)user_idr8   r:   )r5   r7   r8   r:   zInvalid proxy type: )r   SOCKS4r   SOCKS5r   
ValueErrorr4   r5   r7   r8   r:   r   r   r   create_connector9   s    

rA   c                   @  sp   e Zd Z			d(d)ddZ		d*d+ddZd,ddZed-ddZed.ddZe	d/d#d$Z
e	d0d&d'ZdS )1AsyncioProxyNFr4   r   r   r   r   r   r5   r6   r7   r8   r9   c                 C  s@   t  | _|| _|| _|| _|| _|| _|| _t	| jd| _
d S )N)r   )asyncioget_event_loopr   _proxy_type_proxy_host_proxy_port	_password	_username_rdnsr   	_resolver)r   r4   r   r   r5   r7   r8   r   r   r   r   U   s   
	zAsyncioProxy.__init__	dest_host	dest_portr   float | None_socketAsyncSocket | Noner   r   c              
     s   |d u rd}zSt |4 I d H = t $ tdt | j|||dI d H W  d    W  d   I d H  W S 1 s<w   Y  W d   I d H  W d S 1 I d H sSw   Y  W d S  tjyo } ztd| |d }~ww )N<   ignore)rL   rM   rO   zProxy connection timed out: )	timeout_warningscatch_warningssimplefilterDeprecationWarning_connectrC   TimeoutErrorr   )r   rL   rM   r   rO   er   r   r   connecti   s(   

2zAsyncioProxy.connectc              
     s   zt | j| j| j| j| jd}|j|||dI d H  |W S  tjy*   |	    t
y@ } z|	  t||jdd }~w tyK   |	   w )Nr@   )streamr   r   )
error_code)rA   rE   rI   rH   rJ   rK   r[   rC   CancelledErrorcloser   r   r]   	Exception)r   rL   rM   rO   	connectorrZ   r   r   r   rX      s4   zAsyncioProxy._connectc                 C     | j S r   )rF   r   r   r   r   
proxy_host      zAsyncioProxy.proxy_hostc                 C  rb   r   )rG   rc   r   r   r   
proxy_port   re   zAsyncioProxy.proxy_portargs
typing.Anykwargsc                 O  s   | |i |S r   r   )clsrg   ri   r   r   r   create   s   zAsyncioProxy.createurlc                 K  s   t |}| |i |S r   r	   )rj   rl   ri   url_argsr   r   r   from_url   s   zAsyncioProxy.from_url)NNF)r4   r   r   r   r   r   r5   r6   r7   r6   r8   r9   )NN)
rL   r   rM   r   r   rN   rO   rP   r   r   )rL   r   rM   r   rO   r   r   r   )r   r   )r   r   )rg   rh   ri   rh   r   rB   )rl   r   ri   rh   r   rB   )r0   r1   r2   r   r[   rX   propertyrd   rf   classmethodrk   rn   r   r   r   r   rB   T   s"    
rB   )r4   r   r5   r6   r7   r6   r8   r9   r:   r;   r   r   )"__doc__
__future__r   rC   r(   typingrT   python_socksr   abcpython_socks._connectors.abcr   %python_socks._connectors.socks4_asyncr   %python_socks._connectors.socks5_asyncr   python_socks._errorsr   r   python_socks._helpersr
   python_socks._protocols.errorsr   python_socks._typesr   ssar   ssa._timeoutr   rS   AsyncResolverr   rA   rB   r   r   r   r   <module>   s&    

