a
    xdi1                     @   sZ  d dl Z d dlZd dlZd dlmZ d dlZd dlZd dlmZm	Z	m
Z
 d dlZd dlmZ d dlmZmZ eejejf ZeedddZeed	d
dZeed	ddZdd Zdd ZejG dd dZejG dd dZejG dd dZejG dd de jjZ ejG dd de jj!Z"G dd dedZ#G dd  d e j$j%edZ&dS )!    N)deque)UnionListOptional)contextmanager)FinalNoPublicConstructor)ipreturnc                 C   s4   t | tjrtjjS t | tjr(tjjS ds0J d S NF)
isinstance	ipaddressIPv4AddresstriosocketAF_INETIPv6AddressAF_INET6)r	    r   N/var/www/html/Ranjet/env/lib/python3.9/site-packages/trio/testing/_fake_net.py_family_for   s
    r   )familyr
   c                 C   s8   | t jjkrtdS | t jjkr,tdS ds4J d S )N0.0.0.0::Fr   r   r   r   
ip_addressr   r   r   r   r   _wildcard_ip_for    s
    

r   c                 C   s8   | t jjkrtdS | t jjkr,tdS ds4J d S )N	127.0.0.1::1Fr   r   r   r   r   _localhost_ip_for)   s
    

r    c                 C   s   t | t| d S N)OSErrorosstrerror)coder   r   r   	_fake_err2   s    r&   c              	   C   sz   d}|D ]l}| ||t |  }t| }||d t |< W d    n1 sN0    Y  |t |7 }|t | kr qvq|S )Nr   )len
memoryview)databufferswrittenbufZ
next_pieceZmbufr   r   r   _scatter6   s    
.r-   c                   @   s2   e Zd ZU eed< eed< dd Zedd ZdS )UDPEndpointr	   portc                 C   s(   | j j| jf}t| j tjr$|d7 }|S )N)r   r   )r	   
compressedr/   r   r   r   )selfsockaddrr   r   r   as_python_sockaddrG   s    zUDPEndpoint.as_python_sockaddrc                 C   s"   |d d \}}| t ||dS )N   )r	   r/   )r   r   )clsr2   r	   r/   r   r   r   from_python_sockaddrM   s    z UDPEndpoint.from_python_sockaddrN)	__name__
__module____qualname__	IPAddress__annotations__intr3   classmethodr6   r   r   r   r   r.   B   s
   
r.   c                   @   s   e Zd ZU eed< dS )
UDPBindinglocalN)r7   r8   r9   r.   r;   r   r   r   r   r>   S   s   
r>   c                   @   s>   e Zd ZU eed< eed< ejdd dZeed< dd Z	d	S )
	UDPPacketsourcedestinationc                 C   s   |   S r!   )hex)pr   r   r   <lambda>\       zUDPPacket.<lambda>)reprpayloadc                 C   s   t | j| j|dS )NrA   rB   rH   )r@   rB   rA   )r1   rH   r   r   r   reply^   s    
zUDPPacket.replyN)
r7   r8   r9   r.   r;   attribrH   bytesrJ   r   r   r   r   r@   X   s   
r@   c                   @   s*   e Zd ZU ded< eeeddddZdS )FakeSocketFactoryFakeNetfake_net
FakeSocket)r   typeprotor
   c                 C   s   t | j|||S r!   )rQ   _createrP   )r1   r   rR   rS   r   r   r   r   h   s    zFakeSocketFactory.socketN)r7   r8   r9   r;   r<   r   r   r   r   r   rN   d   s   
rN   c                   @   s>   e Zd ZU ded< deeeef dddZeddd	Zd
S )FakeHostnameResolverrO   rP   r   )hostr/   c                    s   t dd S NzFakeNet doesn't do fake DNS yetNotImplementedError)r1   rV   r/   r   rR   rS   flagsr   r   r   getaddrinfop   s    z FakeHostnameResolver.getaddrinfo)rZ   c                    s   t dd S rW   rX   )r1   r2   rZ   r   r   r   getnameinfou   s    z FakeHostnameResolver.getnameinfoN)r   r   r   r   )	r7   r8   r9   r;   strr   r<   r[   r\   r   r   r   r   rU   l   s   
 rU   c                   @   sP   e Zd Zdd ZedddddZddd	d
ZddddZddddZdS )rO   c                 C   s@   t d | _t d | _ttdd| _i | _d | _	d S )Nz	1.0.0.0/8z1::/16iP  i  )
r   IPv4NetworkhostsZ_auto_ipv4_iterIPv6Networkiterrange_auto_port_iter_boundroute_packetr1   r   r   r   __init__z   s
    zFakeNet.__init__rQ   N)bindingr   r
   c                 C   s"   || j v rttj || j |< d S r!   )rd   r&   errnoZ
EADDRINUSE)r1   rh   r   r   r   r   _bind   s    

zFakeNet._bind)r
   c                 C   s$   t jt|  t jt|  d S r!   )r   r   Zset_custom_socket_factoryrN   Zset_custom_hostname_resolverrU   rf   r   r   r   enable   s    zFakeNet.enablec                 C   s$   | j d u r| | n
|  | d S r!   )re   deliver_packetr1   packetr   r   r   send_packet   s    
zFakeNet.send_packetc                 C   s,   t |jd}|| jv r(| j| | n d S )Nr?   )r>   rB   rd   _deliver_packet)r1   rn   rh   r   r   r   rl      s    
zFakeNet.deliver_packet)	r7   r8   r9   rg   r>   rj   rk   ro   rl   r   r   r   r   rO   y   s
   
rO   )	metaclassc                   @   s  e Zd ZeeeedddZdd Zdd Zdd	 Ze	d
ddZ
dd Zdd Zdd Zd;ddZdd Zdd Zdd Zdd Zdd Zd d! Zd<d"d#Zd$d% Zd=d&d'Zd>d(d)Zd?d*d+Zd@d,d-ZdAd.d/Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Z d:S )BrQ   )rP   r   rR   rS   c                 C   s   || _ |stjj}|stjj}|tjjtjjfvr@td| |tjjkrZtd| || _|| _	|| _
d| _ttd\| _| _d | _d S )Nz%FakeNet doesn't (yet) support family=z#FakeNet doesn't (yet) support type=Finf)	_fake_netr   r   r   SOCK_STREAMr   rY   
SOCK_DGRAMr   rR   rS   _closedZopen_memory_channelfloat_packet_sender_packet_receiver_binding)r1   rP   r   rR   rS   r   r   r   rg      s"    zFakeSocket.__init__c                 C   s   | j rttj d S r!   )rw   r&   ri   EBADFrf   r   r   r   _check_closed   s    zFakeSocket._check_closedc                 C   s4   | j r
d S d| _ | jd ur&| jj| j= | j  d S )NT)rw   r{   rt   rd   rz   closerf   r   r   r   r~      s    
zFakeSocket.closec                   s$   t jj| j| j| j|d|dI d H S )NF)addressZipv6_v6onlyr?   )r   _socket_resolve_address_nocprR   r   rS   )r1   r   r?   r   r   r   r      s    z FakeSocket._resolve_address_nocp)rn   c                 C   s*   z| j | W n tjy$   Y n0 d S r!   )ry   Zsend_nowaitr   ZBrokenResourceErrorrm   r   r   r   rq      s    zFakeSocket._deliver_packetc                    s   |    | jd urttj tj I d H  | j|ddI d H \}}t	
|}t|| jks`J |t	
dkrzt	
d}n|t	
dkrt	
d}|dkrt| jj}tt||d}| j||  || _d S )NTrp   r   r   r   r   r   )r}   r{   Z_fake_errorri   EINVALr   lowlevel
checkpointr   r   r   r   r   nextrt   rc   r>   r.   rj   )r1   addrip_strr/   r	   rh   r   r   r   bind   s     



zFakeSocket.bindc                    s   t dd S )Nz0FakeNet does not (yet) support connected socketsrX   )r1   Zpeerr   r   r   connect   s    zFakeSocket.connectc           	         s6  |    g }d}d }t|dkr(|\}nPt|dkr>|\}}n:t|dkrV|\}}}n"t|dkrp|\}}}}ntdtj I d H  |d ur| j|ddI d H }|rtd	|rtd
| |d u rtt	j
 t|}| jd u r| t| jjdfI d H  d|}t| jj||d}| j| t|S )Nr      r4         wrong number of argumentsFrp   &FakeNet doesn't support ancillary dataz"FakeNet send flags must be 0, not rF   rI   )r}   r'   	TypeErrorr   r   r   r   rY   r&   ri   ENOTCONNr.   r6   r{   r   r   r   r0   joinr@   r?   rt   ro   )	r1   argsancdatarZ   r   r*   rB   rH   rn   r   r   r   sendmsg   sB    



zFakeSocket.sendmsgr   c           	         s|   |dkrt d|dkr t d|   g }d}| j I d H }|j }t|j|}|t|jk rp|t	j
jO }||||fS )Nr   r   z&FakeNet doesn't support any recv flags)rY   r}   rz   ZreceiverA   r3   r-   rH   r'   r   r   	MSG_TRUNC)	r1   r*   
ancbufsizerZ   r   	msg_flagsrn   r   r+   r   r   r   recvmsg_into  s    
zFakeSocket.recvmsg_intoc                 C   sJ   |    | jd ur| jj S | jtjjkr0dS | jtjjksBJ dS d S )N)r   r   )r   r   )	r}   r{   r?   r3   r   r   r   r   r   rf   r   r   r   getsockname2  s    
zFakeSocket.getsocknamec                 C   s8   |    | jd ur*| jjd ur*| jj S ttj d S r!   )r}   r{   remoter3   r&   ri   r   rf   r   r   r   getpeername<  s
    
zFakeSocket.getpeernamec                 C   s"   |    td| d| dd S )Nz%FakeNet doesn't implement getsockopt(, ))r}   r"   )r1   levelitemr   r   r   
getsockoptC  s    zFakeSocket.getsockoptc                 C   sF   |    ||ftjjtjjfkr,|s,tdtd| d| dd S )Nz#FakeNet always has IPV6_V6ONLY=Truez%FakeNet doesn't implement setsockopt(r   z, ...))r}   r   r   IPPROTO_IPV6IPV6_V6ONLYrY   r"   )r1   r   r   valuer   r   r   
setsockoptG  s
    zFakeSocket.setsockoptc                 C   s   | S r!   r   rf   r   r   r   	__enter__T  s    zFakeSocket.__enter__c                 G   s   |    d S r!   )r~   )r1   exc_infor   r   r   __exit__W  s    zFakeSocket.__exit__c                    s   |  ||d I d H S r!   )sendto)r1   r)   rZ   r   r   r   sendZ  s    zFakeSocket.sendc                    sR   t |dkr|\}}d}n t |dkr2|\}}}ntd| |gg ||I d H S )Nr4   r   r   r   )r'   r   r   )r1   r   r)   r   rZ   r   r   r   r   ]  s    zFakeSocket.sendtoc                    s   |  ||I d H \}}|S r!   )recvfrom)r1   bufsizerZ   r)   r   r   r   r   recvg  s    zFakeSocket.recvc                    s   |  |||I d H \}}|S r!   )recvfrom_into)r1   r,   nbytesrZ   Z	got_bytesr   r   r   r   	recv_intok  s    zFakeSocket.recv_intoc                    s"   |  ||I d H \}}}}||fS r!   )recvmsg)r1   r   rZ   r)   r   r   r   r   r   r   r   o  s    zFakeSocket.recvfromc                    sB   |dkr|t |krtd| |gd|I d H \}}}}||fS )Nr   zpartial recvfrom_into)r'   rY   r   )r1   r,   r   rZ   
got_nbytesr   r   r   r   r   r   r   s  s    zFakeSocket.recvfrom_intoc           	         s>   t |}| |g||I d H \}}}}t|d | |||fS r!   )	bytearrayr   rM   )	r1   r   r   rZ   r,   r   r   r   r   r   r   r   r   {  s
    zFakeSocket.recvmsgc                 C   s   t dd S )Nz&can't get fileno() for FakeNet socketsrX   rf   r   r   r   fileno  s    zFakeSocket.filenoc                 C   s   t dd S )Nzcan't detach() a FakeNet socketrX   rf   r   r   r   detach  s    zFakeSocket.detachc                 C   s   dS r   r   rf   r   r   r   get_inheritable  s    zFakeSocket.get_inheritablec                 C   s   |rt dd S )Nz&FakeNet can't make inheritable socketsrX   )r1   inheritabler   r   r   set_inheritable  s    zFakeSocket.set_inheritablec                 C   s   t dd S )NzFakeNet can't share socketsrX   )r1   Z
process_idr   r   r   share  s    zFakeSocket.shareN)r   r   )r   )r   )r   r   )r   )r   r   )r   r   )!r7   r8   r9   rO   r<   rg   r}   r~   r   r@   rq   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rQ      s6   	
-








rQ   )'r   rK   r   collectionsr   ri   r#   typingr   r   r   enum
contextlibr   Z
trio._utilr   r   r   r   r:   r<   r   r   r    r&   r-   frozenr.   r>   r@   abcZSocketFactoryrN   ZHostnameResolverrU   rO   r   
SocketTyperQ   r   r   r   r   <module>	   s6   		#