
    gG                    
   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mZ d dlZd dlZd dlmZmZ e	r(d 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jB                  ejD                  f   Z#d
e$d<   d"dZ%d#dZ&d#dZ'd$dZ(d%dZ) edd      Z*ejV                   G d d             Z,ejV                   G d d             Z-ejV                   G d d             Z.ejV                   G d dej^                  j`                               Z1ejV                   G d dej^                  jd                               Z3e G d d             Z4e G d d ej                  jj                  e!             Z6y)&    )annotationsN)TYPE_CHECKINGAnyNoReturnTypeVarUnionoverload)NoPublicConstructorfinal)Iterable)AddressFamily
SocketKind)TracebackType)BufferSelf	TypeAlias)AddressFormatr   	IPAddressc                    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)ips    I/var/www/html/venv/lib/python3.12/site-packages/trio/testing/_fake_net.py_family_forr!   ,   sN    "i++,{{"""	B	--	.{{###
A
BB    c                    | t         j                  j                  k(  rt        j                  d      S | t         j                  j
                  k(  rt        j                  d      S t        d      )N0.0.0.0::Unhandled ip address familyr   r   r   r   
ip_addressr   r   familys    r    _wildcard_ip_forr+   4   sT    $$$##I..	4;;''	'##D))
;
<<r"   c                    | t         j                  j                  k(  rt        j                  d      S | t         j                  j
                  k(  rt        j                  d      S t        d      )N	127.0.0.1::1r&   r'   r)   s    r    _localhost_ip_forr/   =   sT    $$$##K00	4;;''	'##E**
;
<<r"   c                @    t        | t        j                  |             N)OSErrorosstrerror)codes    r    	_fake_errr6   E   s    
$D)
**r"   c                    d}|D ]^  }| ||t        |      j                  z    }t        |      5 }||d t        |       d d d        |t        |      z  }|t        |       k(  s] |S  |S # 1 sw Y   ,xY w)Nr   )
memoryviewnbyteslen)databufferswrittenbuf
next_piecembufs         r    _scatterrA   I   s    G 'Gjo.D.D$DE
_ 	1&0D"3z?#	13z?"c$iN N	1 	1s   A((A1	T_UDPEndpointUDPEndpoint)boundc                  H    e Zd ZU ded<   ded<   ddZe	 	 	 	 	 	 d	d       Zy)
rC   r   r   intportc                    | j                   j                  | j                  f}t        | j                   t        j
                        r|dz  }|S )Nr   r   )r   
compressedrG   r   r   r   )selfsockaddrs     r    as_python_sockaddrzUDPEndpoint.as_python_sockaddr]   sC    GGIIA
 dggy445Hr"   c                L    |d d \  }} | t        j                  |      |      S )N   )r   rG   )r   r(   )clsrL   r   rG   s       r    from_python_sockaddrz UDPEndpoint.from_python_sockaddrf   s+    
 BQ<Di**2.T::r"   Nreturn+tuple[str, int] | tuple[str, int, int, int])rP   ztype[T_UDPEndpoint]rL   rT   rS   rB   )__name__
__module____qualname____annotations__rM   classmethodrQ    r"   r    rC   rC   X   s?    M
I ; ;=; 
; ;r"   c                      e Zd ZU ded<   y)
UDPBindingrC   localN)rU   rV   rW   rX   rZ   r"   r    r\   r\   o   s    r"   r\   c                  \    e Zd ZU ded<   ded<    ej
                  d       Zded<   d
dZy	)	UDPPacketrC   sourcedestinationc                "    | j                         S r1   )hex)ps    r    <lambda>zUDPPacket.<lambda>y   s     r"   )reprbytespayloadc                F    t        | j                  | j                  |      S )Nr`   ra   rh   )r_   ra   r`   )rK   rh   s     r    replyzUDPPacket.reply|   s"    ##
 	
r"   N)rh   rg   rS   r_   )rU   rV   rW   rX   attrsfieldrh   rk   rZ   r"   r    r_   r_   u   s)     U[[&78GU8
r"   r_   c                       e Zd ZU ded<   ddZy)FakeSocketFactoryFakeNetfake_netc                F    t         j                  | j                  |||      S r1   )
FakeSocket_createrq   )rK   r*   type_protos       r    r   zFakeSocketFactory.socket   s    !!$--FFr"   N)r*   rF   ru   rF   rv   rF   rS   rs   )rU   rV   rW   rX   r   rZ   r"   r    ro   ro      s    Gr"   ro   c                  X    e Zd ZU ded<   	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZy)	FakeHostnameResolverrp   rq   c                    K   t        d      wNzFakeNet doesn't do fake DNS yetr   )rK   hostrG   r*   typerv   flagss          r    getaddrinfoz FakeHostnameResolver.getaddrinfo   s     " ""CDD   c                    K   t        d      wrz   r{   )rK   rL   r~   s      r    getnameinfoz FakeHostnameResolver.getnameinfo   s     
 ""CDDr   N)r   r   r   r   )r|   zbytes | NonerG   zbytes | str | int | Noner*   rF   r}   rF   rv   rF   r~   rF   rS   z]list[tuple[AddressFamily, SocketKind, int, str, tuple[str, int] | tuple[str, int, int, int]]])rL   rT   r~   rF   rS   ztuple[str, str])rU   rV   rW   rX   r   r   rZ   r"   r    rx   rx      s     EE 'E 	E
 E E E
E&E=E E 
	Er"   rx   c                  4    e Zd ZddZddZddZd	dZd	dZy)
rp   c                    t        j                  d      j                         | _        t        j                  d      j                         | _        t        t        dd            | _        i | _	        d | _
        y )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rK   s    r    __init__zFakeNet.__init__   s]    (44[AGGI(44X>DDF#E%$7846 r"   c                p    || j                   v rt        t        j                         || j                   |<   y r1   )r   r6   errno
EADDRINUSE)rK   bindingr   s      r    _bindzFakeNet._bind   s*    dkk!e&&'%Gr"   c                    t         j                  j                  t        |              t         j                  j	                  t        |              y r1   )r   r   set_custom_socket_factoryro   set_custom_hostname_resolverrx   r   s    r    enablezFakeNet.enable   s2    --.?.EF001Ed1KLr"   c                b    | j                   | j                  |       y | j                  |       y r1   )r   deliver_packetrK   packets     r    send_packetzFakeNet.send_packet   s*    $'f%r"   c                    t        |j                        }|| j                  v r| j                  |   j                  |       y y )Nr]   )r\   ra   r   _deliver_packet)rK   r   r   s      r    r   zFakeNet.deliver_packet   s:    6#5#56dkk!KK 008 r"   NrS   None)r   r\   r   rs   rS   r   r   r_   rS   r   )rU   rV   rW   r   r   r   r   r   rZ   r"   r    rp   rp      s    !&
M&r"   rp   c                     e Zd Z	 	 	 	 	 	 	 	 	 	 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d0d	Zd1d
Z	 	 	 d2	 	 	 	 	 	 	 	 	 d3dZej                   dk7  ses eej&                  d      reZ	 	 d4	 	 	 	 	 	 	 d5dZej                   dk7  ses eej&                  d      reZd6dZd6dZed7d       Zed8d       Z	 d9	 	 	 	 	 	 	 d:dZed;d       Ze	 	 	 	 	 	 	 	 	 	 d<d       Z	 d9	 	 	 	 	 	 	 	 	 d=dZd>dZ	 	 	 	 	 	 	 	 d?dZd@dAdZe	 	 	 	 	 	 dBd       Ze	 	 	 	 	 	 	 	 dCd       Z	 	 	 	 dDdZd@dEdZ d4dFdZ!	 d@	 	 	 	 	 dGd Z"	 	 d4	 	 	 	 	 	 	 dHd!Z#	 	 d4	 	 	 	 	 	 	 dId"Z$ej                   dk7  ses eej&                  d      re$Z%d,d#Z&d,d$Z'dJd%Z(dKd&Z)ej                   dk(  ses eej&                  d'      rdLd(Z*yyy)Mrs   c                
   || _         |st        j                  j                  }|st        j                  j                  }|t        j                  j                  t        j                  j
                  fvrt        d|       |t        j                  j                  k7  rt        d|       || _        || _	        || _
        d| _        t        j                  t           t        d            \  | _        | _        d | _        y )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_channelr_   float_packet_sender_packet_receiver_binding)rK   rq   r*   r}   rv   s        r    r   zFakeSocket.__init__   s     "[[((F;;**D$++--t{{/C/CDD%(MfX&VWW4;;)))%(KD6&RSS
595M5M6

,62T2
 ,0r"   c                    | j                   S r1   )r   r   s    r    r}   zFakeSocket.type   s    zzr"   c                    | j                   S r1   )r   r   s    r    r*   zFakeSocket.family   s    ||r"   c                    | j                   S r1   )r   r   s    r    rv   zFakeSocket.proto   s    {{r"   c                P    | j                   rt        t        j                         y y r1   )r   r6   r   EBADFr   s    r    _check_closedzFakeSocket._check_closed   s    <<ekk" r"   c                    | j                   ry d| _         | j                  !| j                  j                  | j                  = | j                  j                          y )NT)r   r   r   r   r   closer   s    r    r   zFakeSocket.close  sE    <<==$%%dmm4##%r"   c                  K   t         j                  j                  | j                  | j                  | j
                  |d|       d {   S 7 w)NF)addressipv6_v6onlyr]   )r   _socket_resolve_address_nocpr}   r*   rv   )rK   r   r]   s      r    r   z FakeSocket._resolve_address_nocp	  sL      \\77IIKKJJ 8 
 
 	
 
s   AA	A
Ac                    t        j                  t        j                        5  | j                  j                  |       d d d        y # 1 sw Y   y xY wr1   )
contextlibsuppressr   BrokenResourceErrorr   send_nowaitr   s     r    r   zFakeSocket._deliver_packet  s?      !9!9: 	4++F3	4 	4 	4s   A		Ac                  K   | j                          | j                  t        t        j                         t
        j                  j                          d {    | j                  |d       d {   ^}}}|g k(  sJ d       t        j                  |      }t        |      | j                  k(  sJ |t        j                  d      k(  rt        j                  d      }n-|t        j                  d      k(  rt        j                  d      }|dk(  rt        | j                  j                        }t!        t#        ||            }| j                  j%                  ||        || _        y 7 7 w)	NTr   zTODO: handle other values?r$   r-   r%   r.   r   )r   r   r6   r   EINVALr   lowlevel
checkpointr   r   r(   r!   r*   nextr   r   r\   rC   r   )rK   addrip_strrG   _r   r   s          r    bindzFakeSocket.bind!  s+    ==$ell#mm&&(((!%!;!;D!;!MMqBw444w!!&)2$++---%%i00%%k2B9''--%%e,B19667D;r4#89Wd+ 	)Ms%   AE5E0E54E35C<E53E5c                    K   t        d      w)Nz0FakeNet does not (yet) support connected socketsr{   )rK   peers     r    connectzFakeSocket.connect6  s     !"TUUr   Nc                  K   | j                          t        j                  j                          d {    || j	                  |d       d {   }|rt        d      |rt        d|       |t        t        j                         t        j                  |      }| j                  8| j                  t        | j                        j                  df       d {    dj!                  |      }| j                  J t#        | j                  j$                  ||      }| j&                  j)                  |       t+        |      S 7 7 7 pw)NFr   &FakeNet doesn't support ancillary dataz"FakeNet send flags must be 0, not r   r"   rj   )r   r   r   r   r   r   r6   r   ENOTCONNrC   rQ   r   r   r+   r*   rJ   joinr_   r]   r   r   r:   )rK   r<   ancdatar~   r   ra   rh   r   s           r    _sendmsgzFakeSocket._sendmsg9  s+     	mm&&((( 66we6LLG%&NOO%(J5'&RSS?enn%!66w?== ))-dkk:EEqIJJJ((7#}}(((==&&#
 	""6*7|9 	) M Ks5   2EEEEBE"E#A,EEEwin32sendmsgc                  K   |dk7  rt        d      |dk7  rt        d      | j                  t        d      | j                          g }d}| j                  j	                          d {   }|j
                  j                         }t        |j                  |      }|t        |j                        k  r|t        j                  j                  z  }||||fS 7 ow)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   receiver`   rM   rA   rh   r:   r   r   	MSG_TRUNC)	rK   r<   
ancbufsizer~   r   	msg_flagsr   r   r=   s	            r    _recvmsg_intozFakeSocket._recvmsg_intoe  s      ?%&NOOA:%&NOO==  &2  	02	,,4466--2246>>73S((...IG33 7s   A)C+C,A0Cc                &   | j                          | j                  $| j                  j                  j                         S | j                  t
        j                  j                  k(  ry| j                  t
        j                  j                  k(  sJ y)N)r$   r   )r%   r   )	r   r   r]   rM   r*   r   r   r   r   r   s    r    getsocknamezFakeSocket.getsockname  si    ==$==&&99;;[[DKK///!;;$++"6"6666r"   c                r   | j                          | j                  t        | j                  d      sJ d       | j                  j                  Ot	        | j                  j                  t
              sJ d       | j                  j                  j                         S t        t        j                         y )NremotezGThis method seems to assume that self._binding has a remote UDPEndpointz,Self._binding.remote should be a UDPEndpoint)
r   r   hasattrr   r   rC   rM   r6   r   r   r   s    r    getpeernamezFakeSocket.getpeername  s    ==$ Y YY  }}##/!MM(( B BB  }}++>>@@%..!r"   c                    y r1   rZ   )rK   leveloptnames      r    
getsockoptzFakeSocket.getsockopt  s    >Ar"   c                    y r1   rZ   rK   r   r   buflens       r    r   zFakeSocket.getsockopt  s    MPr"   c               F    | j                          t        d| d| d      )Nz%FakeNet doesn't implement getsockopt(, ))r   r2   r   s       r    r   zFakeSocket.getsockopt  s+     	=eWBwiqQRRr"   c                    y r1   rZ   )rK   r   r   values       r    
setsockoptzFakeSocket.setsockopt  s    TWr"   c                    y r1   rZ   rK   r   r   r   optlens        r    r   zFakeSocket.setsockopt  s     r"   c                   | j                          ||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   r2   r   s        r    r   zFakeSocket.setsockopt  sh     	7KK$$KK## 
 
 %&KLL=eWBwivVWWr"   c                    | S r1   rZ   r   s    r    	__enter__zFakeSocket.__enter__  s    r"   c                $    | j                          y r1   )r   )rK   exc_type	exc_value	tracebacks       r    __exit__zFakeSocket.__exit__  s     	

r"   c                D   K   | j                  ||d        d {   S 7 wr1   )sendto)rK   r;   r~   s      r    sendzFakeSocket.send  s     [[ud3333s     c                   K   y wr1   rZ   )rK   _FakeSocket__data_FakeSocket__addresss      r    r  zFakeSocket.sendto  s     
    c                   K   y wr1   rZ   )rK   r  _FakeSocket__flagsr  s       r    r  zFakeSocket.sendto  s      r  c                   K   t        |      dk(  r|\  }}d}n t        |      dk(  r|\  }}}nt        d      | j                  |gg ||       d {   S 7 w)NrO   r      zwrong number of arguments)r:   	TypeErrorr   )rK   argsr;   r   r~   s        r    r  zFakeSocket.sendto  sa      t9> MD'EY!^#' D%788]]D62ug>>>>s   AAAAc                L   K   | j                  ||       d {   \  }}|S 7 	wr1   )recvfrom)rK   bufsizer~   r;   _addresss        r    recvzFakeSocket.recv  s'     #}}We<<h =s   $"
$c                N   K   | j                  |||       d {   \  }}|S 7 	wr1   )recvfrom_into)rK   r>   r9   r~   	got_bytesr  s         r    	recv_intozFakeSocket.recv_into  s.     $($6$6sFE$JJ	8 Ks   %#
%c                T   K   | j                  ||       d {   \  }}}}||fS 7 wr1   )_recvmsg)rK   r  r~   r;   _ancdata
_msg_flagsr   s          r    r  zFakeSocket.recvfrom  s4     
 59MM'54Q.Q+h
GW} /Rs   (&(c                   K   |dk7  r#|t        |      j                  k7  rt        d      | j                  |gd|       d {   \  }}}}||fS 7 w)Nr   zpartial recvfrom_into)r8   r9   r   r   )rK   r>   r9   r~   
got_nbytesr  r  r   s           r    r  zFakeSocket.recvfrom_into  sg      Q;6Z_%;%;;%&=>>:>:L:LE;
 5
1
Hj'
 7""5
s   A AAAc                   K   t        |      }| j                  |g||       d {   \  }}}}t        |d |       |||fS 7 wr1   )	bytearrayr   rg   )	rK   r  r   r~   r>   r  r   r   r   s	            r    r  zFakeSocket._recvmsg.  s]       8<8J8JE9
 3
/
GY
 c+:&')WEE3
s   #AAAc                    t        d      )Nz&can't get fileno() for FakeNet socketsr{   r   s    r    filenozFakeSocket.filenoA  s    !"JKKr"   c                    t        d      )Nzcan't detach() a FakeNet socketr{   r   s    r    detachzFakeSocket.detachD  s    !"CDDr"   c                     y)NFrZ   r   s    r    get_inheritablezFakeSocket.get_inheritableG  s    r"   c                    |rt        d      y )Nz&FakeNet can't make inheritable socketsr{   )rK   inheritables     r    set_inheritablezFakeSocket.set_inheritableJ  s    %&NOO r"   sharec                    t        d      )NzFakeNet can't share socketsr{   )rK   
process_ids     r    r'  zFakeSocket.shareR  s    %&CDDr"   )
rq   rp   r*   r   r}   r   rv   rF   rS   r   )rS   r   )rS   r   )rS   rF   r   )r   objectr]   boolrS   ztuple[str, int]r   )r   r*  rS   r   )r   r*  rS   r   )rZ   r   N)
r<   Iterable[Buffer]r   z!Iterable[tuple[int, int, Buffer]]r~   rF   r   zAddressFormat | NonerS   rF   rI   )r<   r,  r   rF   r~   rF   rS   zZtuple[int, list[tuple[int, int, bytes]], int, tuple[str, int] | tuple[str, int, int, int]]rR   )r   rF   r   rF   rS   rF   )r   rF   r   rF   r   rF   rS   rg   r1   )r   rF   r   rF   r   
int | NonerS   zint | bytes)r   rF   r   rF   r   zint | BufferrS   r   )
r   rF   r   rF   r   r   r   rF   rS   r   )
r   rF   r   rF   r   zint | Buffer | Noner   r-  rS   r   )rS   r   )r   z#builtins.type[BaseException] | Noner   zBaseException | Noner   zTracebackType | NonerS   r   )r   )r;   r   r~   rF   rS   rF   )r  r   r  z!tuple[object, ...] | str | BufferrS   rF   )r  r   r  rF   r  z(tuple[object, ...] | str | Buffer | NonerS   rF   )r  r   rS   rF   )r  rF   r~   rF   rS   rg   )r>   r   r9   rF   r~   rF   rS   rF   )r  rF   r~   rF   rS   ztuple[bytes, AddressFormat])r>   r   r9   rF   r~   rF   rS   ztuple[int, AddressFormat])r  rF   r   rF   r~   rF   rS   z>tuple[bytes, list[tuple[int, int, bytes]], int, AddressFormat])rS   r+  )r%  r+  rS   r   )r)  rF   rS   rg   )+rU   rV   rW   r   propertyr}   r*   rv   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'  rZ   r"   r    rs   rs      s   00 0 	0
 0 
0@      #&

 	

 

4 *V 68(,%!% 3% 	%
 &% 
%N ||wgfmmY?
 	"4!"4 "4 	"4

"4H ||wgfmmY?$" A AP P "S S 	S
 S 
S W W  	
   
  "X X 	X
 #X X 
X,5 ( (	
 
4  5 
	    <	
 
 ?? 
?    
%	 	## # 	#
 
##$ 	FF F 	F
 
HF ||wgfmmY?LEP ||wgfmmW=	E >Mr"   rs   )	metaclass)r   r   rS   rF   )r*   rF   rS   r   )r5   rF   rS   r   )r;   rg   r<   r,  rS   rF   )7
__future__r   r   r   r   r3   r   r/  typingr   r   r   r   r   r	   rl   r   
trio._utilr
   r   builtinscollections.abcr   r   r   typesr   typing_extensionsr   r   r   trio._socketr   r   r   r   rX   r!   r+   r/   r6   rA   rB   frozenrC   r\   r_   abcSocketFactoryro   HostnameResolverrx   rp   
SocketTypers   rZ   r"   r    <module>rA     s   #    	  
    1(0#99*Y22I4I4IIJ	9 JC==+	 }= ; ; ;,   
 
 
 
 G.. G G E48844 E E<      F CE''3F CE CEr"   