a
    xdu                     @   s  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
Zd dlZddlmZ G dd dZzd dlmZ W n  ey   ejd	krd
ZY n0 edZedZdd Zdd ZejejB Zd2ddZdd Zdd Zdd Zeejdddd3ddZejd	kse	s6e edr6eej!ddddd Z!eej"ddddd  Z"eejdddej#ej$d dfd!d"Zd#d$ Z%e&ed%d e&ed&d B  Z'd'd( Z(d4d*d+Z)d,d- Z*G d.d/ d/Z+G d0d1 d1e+Z,dS )5    N)wraps)TYPE_CHECKING   )_corec                   @   s.   e Zd Zd
ddZdd Zdd Zdd	 ZdS )	_try_syncNc                 C   s
   || _ d S N)_blocking_exc_override)selfZblocking_exc_override r
   D/var/www/html/Ranjet/env/lib/python3.9/site-packages/trio/_socket.py__init__   s    z_try_sync.__init__c                 C   s"   | j d u rt|tS |  |S d S r   )r   
isinstanceBlockingIOError)r	   excr
   r
   r   _is_blocking_io_error   s    

z_try_sync._is_blocking_io_errorc                    s   t j I d H  d S r   )triolowlevelZcheckpoint_if_cancelledr	   r
   r
   r   
__aenter__    s    z_try_sync.__aenter__c                    s.   |d ur|  |rdS tj I d H  dS d S )NTF)r   r   r   Zcancel_shielded_checkpoint)r	   etypevaluetbr
   r
   r   	__aexit__#   s    z_try_sync.__aexit__)N)__name__
__module____qualname__r   r   r   r   r
   r
   r
   r   r      s   
r   )IPPROTO_IPV6win32)   hostname_resolversocket_factoryc                 C   s   t d}t |  |S )a\  Set a custom hostname resolver.

    By default, Trio's :func:`getaddrinfo` and :func:`getnameinfo` functions
    use the standard system resolver functions. This function allows you to
    customize that behavior. The main intended use case is for testing, but it
    might also be useful for using third-party resolvers like `c-ares
    <https://c-ares.haxx.se/>`__ (though be warned that these rarely make
    perfect drop-in replacements for the system resolver). See
    :class:`trio.abc.HostnameResolver` for more details.

    Setting a custom hostname resolver affects all future calls to
    :func:`getaddrinfo` and :func:`getnameinfo` within the enclosing call to
    :func:`trio.run`. All other hostname resolution in Trio is implemented in
    terms of these functions.

    Generally you should call this function just once, right at the beginning
    of your program.

    Args:
      hostname_resolver (trio.abc.HostnameResolver or None): The new custom
          hostname resolver, or None to restore the default behavior.

    Returns:
      The previous hostname resolver (which may be None).

    N)	_resolvergetset)r   oldr
   r
   r   set_custom_hostname_resolverB   s    

r%   c                 C   s   t d}t |  |S )a  Set a custom socket object factory.

    This function allows you to replace Trio's normal socket class with a
    custom class. This is very useful for testing, and probably a bad idea in
    any other circumstance. See :class:`trio.abc.HostnameResolver` for more
    details.

    Setting a custom socket factory affects all future calls to :func:`socket`
    within the enclosing call to :func:`trio.run`.

    Generally you should call this function just once, right at the beginning
    of your program.

    Args:
      socket_factory (trio.abc.SocketFactory or None): The new custom
          socket factory, or None to restore the default behavior.

    Returns:
      The previous socket factory (which may be None).

    N)_socket_factoryr"   r#   )r    r$   r
   r
   r   set_custom_socket_factoryb   s    

r'   c              
      s   dd }t |4 I dH . t| |||||tB W  d  I dH  S 1 I dH sR0    Y  t| trz| d} W n  ty   tj| dd} Y n0 t	
d}|dur|| |||||I dH S tjjtj| |||||ddI dH S dS )aT  Look up a numeric address given a name.

    Arguments and return values are identical to :func:`socket.getaddrinfo`,
    except that this version is async.

    Also, :func:`trio.socket.getaddrinfo` correctly uses IDNA 2008 to process
    non-ASCII domain names. (:func:`socket.getaddrinfo` uses IDNA 2003, which
    can give the wrong result in some cases and cause you to connect to a
    different host than the one you intended; see `bpo-17305
    <https://bugs.python.org/issue17305>`__.)

    This function's behavior can be customized using
    :func:`set_custom_hostname_resolver`.

    c                 S   s   t | tjo| jtjkS r   )r   _stdlib_socketgaierrorerrno
EAI_NONAME)r   r
   r
   r   numeric_only_failure   s    
z)getaddrinfo.<locals>.numeric_only_failureNasciiT)uts46Zcancellable)r   r(   getaddrinfo_NUMERIC_ONLYr   strencodeUnicodeEncodeError_idnar!   r"   r   	to_threadrun_sync)hostportfamilytypeprotoflagsr,   hrr
   r
   r   r0      s.    .

r0   c                    sD   t d}|dur$|| |I dH S tjjtj| |ddI dH S dS )a  Look up a name given a numeric address.

    Arguments and return values are identical to :func:`socket.getnameinfo`,
    except that this version is async.

    This function's behavior can be customized using
    :func:`set_custom_hostname_resolver`.

    NTr/   )r!   r"   getnameinfor   r6   r7   r(   )Zsockaddrr=   r>   r
   r
   r   r?      s    


r?   c                    s   t jjtj| ddI dH S )zkLook up a protocol number by name. (Rarely used.)

    Like :func:`socket.getprotobyname`, but async.

    Tr/   N)r   r6   r7   r(   getprotobyname)namer
   r
   r   r@      s    r@   c                 C   s   t | S )z]Convert a standard library :class:`socket.socket` object into a Trio
    socket object.

    )_SocketType)sockr
   r
   r   from_stdlib_socket   s    rD   r
   assignedupdatedc                 C   s(   t |||| \}}}tt| |||S )z=Like :func:`socket.fromfd`, but returns a Trio socket object.)_sniff_sockopts_for_filenorD   r(   fromfd)fdr:   r;   r<   r
   r
   r   rI      s    rI   	fromsharec                  O   s   t tj| i |S r   )rD   r(   rK   )argskwargsr
   r
   r   rK      s    c                  O   s$   t j| i |\}}t|t|fS )zTLike :func:`socket.socketpair`, but returns a pair of Trio socket
    objects.

    )r(   
socketpairrD   )rL   rM   leftrightr
   r
   r   rN     s    rN   c                 C   sV   |du r*t d}|dur>|| ||S nt| |||\} }}t| |||}t|S )zCreate a new Trio socket, like :class:`socket.socket`.

    This function's behavior can be customized using
    :func:`set_custom_socket_factory`.

    N)r&   r"   socketrH   r(   rD   )r:   r;   r<   filenoZsfZstdlib_socketr
   r
   r   rQ     s    
rQ   c           	      C   s   t jdkr| ||fS ddlm}m}m}m} tj| |||d}z0|||} |||}|||}W |	  n
|	  0 | ||fS )zCCorrect SOCKOPTS for given fileno, falling back to provided values.linuxr   )	SO_DOMAINSO_PROTOCOL
SOL_SOCKETSO_TYPE)rR   )
sysplatformrQ   rT   rU   rV   rW   r(   
getsockoptdetach)	r:   r;   r<   rR   rT   rU   rV   rW   Zsockobjr
   r
   r   rH   "  s    

rH   SOCK_NONBLOCKSOCK_CLOEXECc                 C   s   | t @ S r   )_SOCK_TYPE_MASK)Ztype_numr
   r
   r   real_socket_typeJ  s    r_   Fc                    sT   t tj|  t ddd fdd}d|  d|_|rP| jd|  d	7  _|S )
N)r   r
   rE   c                    s   |   ||I d H S r   )_nonblocking_helper)r	   rL   rM   fnwait_fnr
   r   wrapperQ  s    z1_make_simple_sock_method_wrapper.<locals>.wrapperzLike :meth:`socket.socket.z`, but async.

            z7Only available on platforms where :meth:`socket.socket.z` is available.)getattrr(   rQ   _wraps__doc__)Zmethnamerc   maybe_availrd   r
   ra   r    _make_simple_sock_method_wrapperN  s    
ri   c             	      s  |t jkr*t|tr t|dksztdnP|t jkrbt|trXdt|  krVdkszn tdn|t jkrvt	|S |S |^}}}t|t
rzt ||d  W n ttfy   Y n0 |S |dkrd }|dkrd}d}	|r|	t jO }	|t jkr|s|	t jO }	t|||| ||	I d H }
t|
d	ks.J |
^^ }}}|t jkrt|}t|dksbJ t|d
kr||d |d< t|dkr|d
 |d
< t|}|S )N   z&address should be a (host, port) tuple   z=address should be a (host, port, [flowinfo, [scopeid]]) tupler    z<broadcast>z255.255.255.255r      )r(   AF_INETr   tuplelen
ValueErrorAF_INET6AF_UNIXosfspathint	inet_ptonOSError	TypeError
AI_PASSIVEAI_V4MAPPEDr0   list)r;   r:   r<   ipv6_v6onlyaddresslocalr8   r9   _r=   Zgai_resnormedr
   r
   r   _resolve_address_nocpm  sN    


$





r   c                   @   s   e Zd Zdd ZdS )
SocketTypec                 C   s   t dd S )Nz`SocketType is an abstract class; use trio.socket.socket if you want to construct a socket object)ry   r   r
   r
   r   r     s    zSocketType.__init__N)r   r   r   r   r
   r
   r
   r   r     s   r   c                       s  e Zd Zdd Zh dZdd Z fddZdd	 Zd
d Ze	dd Z
e	dd Ze	dd Ze	dd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zed&ejZd'd( Zd)d* Zed+ejZed,ejZed-ejZed.ejZ e!e"j#d/red/ejd0d1Z$e!e"j#d2r<ed2ejd0d1Z%ed3ejZ&e'e"j#j(d4d4d5d6d7 Z(e)j*d8kse+se!e"j#d9re'e"j#j,d4d4d5d:d; Z,  Z-S )<rB   c                 C   s>   t |tjur"tdt |j|| _| jd d| _d S )Nz0expected object of type 'socket.socket', not '{}F)	r;   r(   rQ   ry   formatr   _socksetblocking_did_shutdown_SHUT_WR)r	   rC   r
   r
   r   r     s    z_SocketType.__init__>
   rZ   listengetpeernameZsharerR   set_inheritable
setsockoptget_inheritabler[   getsocknamec                 C   s"   || j v rt| j|S t|d S r   )_forwardre   r   AttributeError)r	   rA   r
   r
   r   __getattr__  s    
z_SocketType.__getattr__c                    s   t   t| j S r   )super__dir__r|   r   r   	__class__r
   r   r     s    z_SocketType.__dir__c                 C   s   | S r   r
   r   r
   r
   r   	__enter__  s    z_SocketType.__enter__c                 G   s   | j j| S r   )r   __exit__)r	   exc_infor
   r
   r   r     s    z_SocketType.__exit__c                 C   s   | j jS r   )r   r:   r   r
   r
   r   r:     s    z_SocketType.familyc                 C   s   t | jjS r   )r_   r   r;   r   r
   r
   r   r;     s    z_SocketType.typec                 C   s   | j jS r   )r   r<   r   r
   r
   r   r<     s    z_SocketType.protoc                 C   s   | j S r   )r   r   r
   r
   r   did_shutdown_SHUT_WR  s    z _SocketType.did_shutdown_SHUT_WRc                 C   s   t | jddS )Nzsocket.socketztrio.socket.socket)reprr   replacer   r
   r
   r   __repr__  s    z_SocketType.__repr__c                 C   s   t | j S )z"Same as :meth:`socket.socket.dup`.)rB   r   dupr   r
   r
   r   r     s    z_SocketType.dupc                 C   s*   | j  dkr&tj| j  | j   d S )N)r   rR   r   r   Znotify_closingcloser   r
   r
   r   r     s    z_SocketType.closec                    sj   | j |ddI d H }ttdrJ| jtjkrJ|d rJtj| jj	|I d H S tj
 I d H  | j	|S d S )NTr   rs   r   )r   hasattrr(   r:   rs   r   r6   r7   r   bindr   
checkpoint)r	   r~   r
   r
   r   r     s    
z_SocketType.bindc                 C   s&   | j | |tjtjfv r"d| _d S )NT)r   shutdownr(   SHUT_WR	SHUT_RDWRr   )r	   flagr
   r
   r   r     s    z_SocketType.shutdownc                 C   sR   t jdkr,t| jgg g d\}}}t|S t }|| jtj t|dS )Nr   r   )rX   rY   selectr   boolpollregisterPOLLIN)r	   rreadyr   pr
   r
   r   is_readable$  s    
z_SocketType.is_readablec                    s   t | jI d H  d S r   )r   wait_writabler   r   r
   r
   r   r   -  s    z_SocketType.wait_writablec                   sB   | j tjkr| jttj}nd}t| j| j | j	|||dI d H S )NF)r}   r~   r   )
r:   r(   rr   r   rZ   r   IPV6_V6ONLYr   r;   r<   )r	   r~   r   r}   r
   r
   r   r   0  s    z!_SocketType._resolve_address_nocpc              	      s   t  4 I d H . || jg|R i |W  d   I d H  S 1 I d H sH0    Y  || jI d H  z|| jg|R i |W S  ty   Y qR0 qRd S r   )r   r   r   )r	   rb   rL   rM   rc   r
   r
   r   r`   @  s    Bz_SocketType._nonblocking_helperacceptc                    s   |   I dH \}}t||fS )z-Like :meth:`socket.socket.accept`, but async.N)_acceptrD   )r	   rC   addrr
   r
   r   r   f  s    z_SocketType.acceptc              	      s   zr| j |ddI d H }t 4 I d H $ | j|W  d   I d H  W S 1 I d H sT0    Y  t| jI d H  W n  tjy   | j   Y n0 | j	t
jt
j}|dkrt|dt| d S )NFr   r   zError in connect: )r   r   r   connectr   r   r   Z	Cancelledr   rZ   r(   rV   SO_ERRORrx   rt   strerror)r	   r~   errr
   r
   r   r   o  s    08
z_SocketType.connectrecv	recv_intorecvfromrecvfrom_intorecvmsgT)rh   recvmsg_intosendr
   rE   c                    s@   t |}| j|d ddI dH |d< | tjj|i tjI dH S )z3Similar to :meth:`socket.socket.sendto`, but async.r   Fr   N)r|   r   r`   r(   rQ   sendtor   r   r	   rL   r
   r
   r   r     s
    z_SocketType.sendtor   sendmsgc                    sX   t |dkr<|d dur<t|}| j|d ddI dH |d< | tjj|i tjI dH S )zSimilar to :meth:`socket.socket.sendmsg`, but async.

            Only available on platforms where :meth:`socket.socket.sendmsg` is
            available.

            rk   r   NFr   )	rp   r|   r   r`   r(   rQ   r   r   r   r   r
   r
   r   r     s    
z_SocketType.sendmsg).r   r   r   r   r   r   r   r   r   propertyr:   r;   r<   r   r   r   r   r   r   r   r   r   r`   ri   r   Zwait_readabler   r   r   r   r   r   r   r   r(   rQ   r   r   r   rf   r   rX   rY   r   r   __classcell__r
   r
   r   r   rB     sd   



	$	J

rB   )r   r   r   r   )r   )F)-rt   rX   r   rQ   r(   	functoolsr   rf   typingr   idnar5   r   rl   r   r   r   ImportErrorrY   ZRunVarr!   r&   r%   r'   AI_NUMERICHOSTAI_NUMERICSERVr1   r0   r?   r@   rD   rI   r   rK   rN   rn   SOCK_STREAMrH   re   r^   r_   ri   r   r   rB   r
   r
   r
   r   <module>   sd   



 
?

	 

	
@