o
    4@HhG                     @  s  U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	m
Z
mZmZmZ d dlZd dlZd dlmZmZ e	rgd dlZd dlmZ d dlmZmZ d dlmZ d dlmZmZmZ d d	lmZ eej ej!f Z"d
e#d< d/ddZ$d0ddZ%d0ddZ&d1ddZ'd2d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-j0Z1eG d*d+ d+Z2eG d,d- d-ejj3ed.Z4dS )3    )annotationsN)TYPE_CHECKINGAnyNoReturnUnionoverload)NoPublicConstructorfinal)Iterable)AddressFamily
SocketKind)TracebackType)BufferSelf	TypeAlias)AddressFormatr   	IPAddressipreturnintc                 C  s0   t | tjr
tjjS t | tjrtjjS td)Nz!Unhandled IPAddress instance type)	
isinstance	ipaddressIPv4AddresstriosocketAF_INETIPv6AddressAF_INET6NotImplementedError)r    r   V/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-packages/trio/testing/_fake_net.py_family_for+   s
   r!   familyc                 C  4   | t jjkrtdS | t jjkrtdS td)N0.0.0.0::Unhandled ip address familyr   r   r   r   
ip_addressr   r   r"   r   r   r    _wildcard_ip_for3   
   

r*   c                 C  r#   )N	127.0.0.1::1r&   r'   r)   r   r   r    _localhost_ip_for<   r+   r.   coder   c                 C  s   t | t| N)OSErrorosstrerror)r/   r   r   r    	_fake_errD   s   r4   databytesbuffersIterable[Buffer]c              	   C  s~   d}|D ]8}| ||t |j  }t |}||d t|< W d    n1 s(w   Y  |t|7 }|t| kr< |S q|S )Nr   )
memoryviewnbyteslen)r5   r7   writtenbuf
next_piecembufr   r   r    _scatterH   s   
r@   c                   @  s6   e Zd ZU ded< ded< dddZedd
dZdS )UDPEndpointr   r   r   portr   +tuple[str, int] | tuple[str, int, int, int]c                 C  s(   | j j| jf}t| j tjr|d7 }|S )Nr   r   )r   
compressedrB   r   r   r   )selfsockaddrr   r   r    as_python_sockaddrY   s   zUDPEndpoint.as_python_sockaddrrG   c                 C  s"   |d d \}}| t ||dS )N   )r   rB   )r   r(   )clsrG   r   rB   r   r   r    from_python_sockaddrb   s   z UDPEndpoint.from_python_sockaddrNr   rC   )rG   rC   r   rA   )__name__
__module____qualname____annotations__rH   classmethodrK   r   r   r   r    rA   T   s   
 
	rA   c                   @  s   e Zd ZU ded< dS )
UDPBindingrA   localN)rM   rN   rO   rP   r   r   r   r    rR   k   s   
 rR   c                   @  s@   e Zd ZU ded< ded< ejdd dZded< dd
dZdS )	UDPPacketrA   sourcedestinationc                 C  s   |   S r0   )hex)pr   r   r    <lambda>u   s    zUDPPacket.<lambda>)reprr6   payloadr   c                 C  s   t | j| j|dS )NrU   rV   r[   )rT   rV   rU   )rF   r[   r   r   r    replyx   s
   zUDPPacket.replyN)r[   r6   r   rT   )rM   rN   rO   rP   attrsfieldr[   r]   r   r   r   r    rT   q   s
   
 rT   c                   @  s    e Zd ZU ded< dd	d
ZdS )FakeSocketFactoryFakeNetfake_netr"   r   type_protor   
FakeSocketc                 C  s   t | j|||S r0   )re   _createrb   )rF   r"   rc   rd   r   r   r    r      s   zFakeSocketFactory.socketN)r"   r   rc   r   rd   r   r   re   )rM   rN   rO   rP   r   r   r   r   r    r`      s   
 r`   c                   @  s4   e Zd ZU ded< 				ddddZdddZdS )FakeHostnameResolverra   rb   r   hostbytes | NonerB   bytes | str | int | Noner"   r   typerd   flagsr   qlist[tuple[AddressFamily, SocketKind, int, str, tuple[str, int] | tuple[str, int, int, int] | tuple[int, bytes]]]c                   
   t dNzFakeNet doesn't do fake DNS yetr   )rF   rh   rB   r"   rk   rd   rl   r   r   r    getaddrinfo   s   z FakeHostnameResolver.getaddrinforG   rC   tuple[str, str]c                   rn   ro   rp   )rF   rG   rl   r   r   r    getnameinfo   s   z FakeHostnameResolver.getnameinfoN)r   r   r   r   )rh   ri   rB   rj   r"   r   rk   r   rd   r   rl   r   r   rm   )rG   rC   rl   r   r   rr   )rM   rN   rO   rP   rq   rs   r   r   r   r    rg      s   
 rg   c                   @  s>   e Zd ZdddZdd	d
ZdddZdddZdddZdS )ra   r   Nonec                 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hosts_auto_ipv4_iterIPv6Network_auto_ipv6_iteriterrange_auto_port_iter_boundroute_packetrF   r   r   r    __init__   s
   
zFakeNet.__init__bindingrR   r   re   c                 C  s"   || j v r
ttj || j |< d S r0   )r}   r4   errno
EADDRINUSE)rF   r   r   r   r   r    _bind   s   

zFakeNet._bindc                 C  s$   t jt|  t jt|  d S r0   )r   r   set_custom_socket_factoryr`   set_custom_hostname_resolverrg   r   r   r   r    enable   s   zFakeNet.enablepacketrT   c                 C  s&   | j d u r| | d S |  | d S r0   )r~   deliver_packetrF   r   r   r   r    send_packet   s   
zFakeNet.send_packetc                 C  s0   t |jd}|| jv r| j| | d S 	 d S )NrS   )rR   rV   r}   _deliver_packet)rF   r   r   r   r   r    r      s   
zFakeNet.deliver_packetNr   rt   )r   rR   r   re   r   rt   r   rT   r   rt   )rM   rN   rO   r   r   r   r   r   r   r   r   r    ra      s    




ra   c                   @  sF  e Zd ZdddZedddZedddZedddZdddZdddZ	dddZ
dd d!Zdd#d$Zdd'd(Z	)	*	+ddd2d3Zejd4ksResTeejd5rTeZ	*	*ddd8d9Zejd4ksieskeejd5rkeZdd;d<Zdd=d>ZeddAdBZeddEdBZ	+dddHdBZeddKdLZeddNdLZ	+dddPdLZddRdSZddZd[Zddd^d_ZeddcddZeddgddZddjddZdddldmZ dddpdqZ!	*dddsdtZ"	*	*dddvdwZ#	*	*dddydzZ$ejd4kseseejd5re$Z%dd{d|Z&dd}d~Z'dddZ(dddZ)ejd4kseseejdr!dddZ*d+S d+S d+S )re   rb   ra   r"   r   rk   r   rd   r   r   rt   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r-td| || _|| _	|| _
d| _tj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   r   
SOCK_DGRAM_family_type_proto_closedopen_memory_channelrT   float_packet_sender_packet_receiver_binding)rF   rb   r"   rk   rd   r   r   r    r      s&   
zFakeSocket.__init__c                 C     | j S r0   )r   r   r   r   r    rk         zFakeSocket.typec                 C  r   r0   )r   r   r   r   r    r"      r   zFakeSocket.familyc                 C  r   r0   )r   r   r   r   r    rd      r   zFakeSocket.protoc                 C  s   | j r
ttj d S d S r0   )r   r4   r   EBADFr   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)r   r   r   r}   r   closer   r   r   r    r      s   
zFakeSocket.closeaddressobjectrS   booltuple[str, int]c                  s&   t jj| j| j| j|d|dI d H S )NF)r   ipv6_v6onlyrS   )r   _socket_resolve_address_nocprk   r"   rd   )rF   r   rS   r   r   r    r     s   z FakeSocket._resolve_address_nocpr   rT   c                 C  s>   t tj | j| W d    d S 1 sw   Y  d S r0   )
contextlibsuppressr   BrokenResourceErrorr   send_nowaitr   r   r   r    r     s   "zFakeSocket._deliver_packetaddrc                   s   |    | jd urttj tj I d H  | j|ddI d H ^}}}|g ks,J dt	
|}t|| jks:J |t	
dkrGt	
d}n|t	
dkrSt	
d}|dkr]t| jj}tt||d}| j||  || _d S )	NTr   zTODO: handle other values?r$   r,   r%   r-   r   )r   r   r4   r   EINVALr   lowlevel
checkpointr   r   r(   r!   r"   nextr   r|   rR   rA   r   )rF   r   ip_strrB   _r   r   r   r   r    bind  s$   




zFakeSocket.bindpeerr   c                   rn   )Nz0FakeNet does not (yet) support connected socketsrp   )rF   r   r   r   r    connect2  s   zFakeSocket.connectr   r   Nr7   r8   ancdata!Iterable[tuple[int, int, Buffer]]rl   AddressFormat | Nonec                   s   |    tj I d H  |d ur| j|ddI d H }|r!td|r*td| |d u r3ttj t	
|}| jd u rK| t| jjdfI d H  d|}| jd usWJ t| jj||d}| j| t|S )NFr   &FakeNet doesn't support ancillary dataz"FakeNet send flags must be 0, not r       r\   )r   r   r   r   r   r   r4   r   ENOTCONNrA   rK   r   r   r*   r"   rE   joinrT   rS   r   r   r;   )rF   r7   r   rl   r   rV   r[   r   r   r   r    _sendmsg5  s.   



zFakeSocket._sendmsgwin32sendmsg
ancbufsizeZtuple[int, list[tuple[int, int, bytes]], int, tuple[str, int] | tuple[str, int, int, int]]c           	        s   |dkr	t d|dkrt d| jd u rt d|   g }d}| j I d H }|j }t|j|}|t	|jk rB|t
jjO }||||fS )Nr   r   z&FakeNet doesn't support any recv flagszThe code will most likely hang if you try to receive on a fakesocket without a binding. If that is not the case, or you explicitly want to test that, remove this warning.)r   r   r   r   receiverU   rH   r@   r[   r;   r   r   	MSG_TRUNC)	rF   r7   r   rl   r   	msg_flagsr   r   r<   r   r   r    _recvmsg_intoa  s$   

zFakeSocket._recvmsg_intorC   c                 C  sF   |    | jd ur| jj S | jtjjkrdS | jtjjks!J dS )N)r$   r   )r%   r   )	r   r   rS   rH   r"   r   r   r   r   r   r   r   r    getsockname  s   
zFakeSocket.getsocknamec                 C  sb   |    | jd ur*t| jdsJ d| jjd ur*t| jjts$J d| jj S ttj	 d S )NremotezGThis method seems to assume that self._binding has a remote UDPEndpointz,Self._binding.remote should be a UDPEndpoint)
r   r   hasattrr   r   rA   rH   r4   r   r   r   r   r   r    getpeername  s"   
zFakeSocket.getpeernameleveloptnamec                C     d S r0   r   )rF   r   r   r   r   r    
getsockopt     zFakeSocket.getsockoptbuflenr6   c                C  r   r0   r   rF   r   r   r   r   r   r    r     r   
int | Noneint | bytesc                C  s   |    td| d| d)Nz%FakeNet doesn't implement getsockopt(, ))r   r1   r   r   r   r    r     s   valueint | Bufferc                C  r   r0   r   )rF   r   r   r   r   r   r    
setsockopt  r   zFakeSocket.setsockoptoptlenc                C  r   r0   r   rF   r   r   r   r   r   r   r    r     s   int | Buffer | Nonec                C  sB   |    ||ftjjtjjfkr|stdtd| d| d)Nz#FakeNet always has IPV6_V6ONLY=Truez%FakeNet doesn't implement setsockopt(r   z, ...))r   r   r   IPPROTO_IPV6IPV6_V6ONLYr   r1   r   r   r   r    r     s   r   c                 C  s   | S r0   r   r   r   r   r    	__enter__  r   zFakeSocket.__enter__exc_type#builtins.type[BaseException] | None	exc_valueBaseException | None	tracebackTracebackType | Nonec                 C  s   |    d S r0   )r   )rF   r   r   r   r   r   r    __exit__  s   zFakeSocket.__exit__r5   r   c                   s   |  ||d I d H S r0   )sendto)rF   r5   rl   r   r   r    send  s   zFakeSocket.send_FakeSocket__data_FakeSocket__address!tuple[object, ...] | str | Bufferc                      d S r0   r   )rF   r   r   r   r   r    r     s   zFakeSocket.sendto_FakeSocket__flags(tuple[object, ...] | str | Buffer | Nonec                   r   r0   r   )rF   r   r   r   r   r   r    r     s   argsr   c                   sT   t |dkr|\}}d}nt |dkr|\}}}ntd| |gg ||I d H S )NrI   r      zwrong number of arguments)r;   	TypeErrorr   )rF   r   r5   r   rl   r   r   r    r     s   bufsizec                   s   |  ||I d H \}}|S r0   )recvfrom)rF   r   rl   r5   _addressr   r   r    recv
  s   zFakeSocket.recvr=   r:   c                   s   |  |||I d H \}}|S r0   )recvfrom_into)rF   r=   r:   rl   	got_bytesr   r   r   r    	recv_into  s   zFakeSocket.recv_intotuple[bytes, AddressFormat]c                   s$   |  ||I d H \}}}}||fS r0   )_recvmsg)rF   r   rl   r5   _ancdata
_msg_flagsr   r   r   r    r     s   zFakeSocket.recvfromtuple[int, AddressFormat]c                   sF   |dkr|t |jkrtd| |gd|I d H \}}}}||fS )Nr   zpartial recvfrom_into)r9   r:   r   r   )rF   r=   r:   rl   
got_nbytesr   r   r   r   r   r    r     s   zFakeSocket.recvfrom_into>tuple[bytes, list[tuple[int, int, bytes]], int, AddressFormat]c           	        s@   t |}| |g||I d H \}}}}t|d | |||fS r0   )	bytearrayr   r6   )	rF   r   r   rl   r=   r   r   r   r   r   r   r    r   )  s   zFakeSocket._recvmsgc                 C     t d)Nz&can't get fileno() for FakeNet socketsrp   r   r   r   r    fileno<     zFakeSocket.filenoc                 C  r   )Nzcan't detach() a FakeNet socketrp   r   r   r   r    detach?  r  zFakeSocket.detachc                 C  s   dS )NFr   r   r   r   r    get_inheritableB  r   zFakeSocket.get_inheritableinheritablec                 C  s   |rt dd S )Nz&FakeNet can't make inheritable socketsrp   )rF   r  r   r   r    set_inheritableE  s   zFakeSocket.set_inheritableshare
process_idc                 C  r   )NzFakeNet can't share socketsrp   )rF   r  r   r   r    r  M  r  zFakeSocket.share)
rb   ra   r"   r   rk   r   rd   r   r   rt   )r   r   )r   r   )r   r   r   )r   r   rS   r   r   r   r   )r   r   r   rt   )r   r   r   r   )r   r   N)
r7   r8   r   r   rl   r   r   r   r   r   rD   )r7   r8   r   r   rl   r   r   r   rL   )r   r   r   r   r   r   )r   r   r   r   r   r   r   r6   r0   )r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   rt   )
r   r   r   r   r   rt   r   r   r   rt   )
r   r   r   r   r   r   r   r   r   rt   )r   r   )r   r   r   r   r   r   r   rt   )r   )r5   r   rl   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   r   r   )r   r   r   r   )r   r   rl   r   r   r6   )r=   r   r:   r   rl   r   r   r   )r   r   rl   r   r   r   )r=   r   r:   r   rl   r   r   r   )r   r   r   r   rl   r   r   r   )r   r   )r  r   r   rt   )r  r   r   r6   )+rM   rN   rO   r   propertyrk   r"   rd   r   r   r   r   r   r   r   sysplatformr   r   r   r   r   recvmsg_intor   r   r   r   r   r   r   r   r   r   r   r   r   r   recvmsgr  r  r  r  r  r   r   r   r    re      s    
 




	

'

$













re   )	metaclass)r   r   r   r   )r"   r   r   r   )r/   r   r   r   )r5   r6   r7   r8   r   r   )5
__future__r   r   r   r   r2   r   r
  typingr   r   r   r   r   r^   r   
trio._utilr   r	   builtinscollections.abcr
   r   r   typesr   typing_extensionsr   r   r   trio._socketr   r   r   r   rP   r!   r*   r.   r4   r@   frozenrA   rR   rT   abcSocketFactoryr`   HostnameResolverrg   ra   
SocketTypere   r   r   r   r    <module>   sL   


	

#