a
    "Rh,                     @   s   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 dZdZdZ	ej
ejfddZefd	d
Zdd Zdd Ze Zdadd Zdd Ze Ze jeddddZdS )    N   )support	localhostz	127.0.0.1z::1c                 C   s:   t  | |}t|}W d    n1 s*0    Y  ~|S )N)socket	bind_port)familysocktypeZtempsockport r
   B/opt/python-3.9.24/usr/lib/python3.9/test/support/socket_helper.pyfind_unused_port   s    8&r   c                 C   s   | j tjkr| jtjkrttdr@| tjtjdkr@t	
dttdrz"| tjtjdkrjt	
dW n ty~   Y n0 ttdr| tjtjd | |df |  d }|S )NSO_REUSEADDR   zHtests should never set the SO_REUSEADDR socket option on TCP/IP sockets!SO_REUSEPORTzHtests should never set the SO_REUSEPORT socket option on TCP/IP sockets!SO_EXCLUSIVEADDRUSEr   )r   r   AF_INETtypeSOCK_STREAMhasattr
getsockopt
SOL_SOCKETr   r   Z
TestFailedr   OSError
setsockoptr   bindgetsockname)sockhostr	   r
   r
   r   r   L   s    



r   c                 C   s8   z|  | W n$ ty2   |   tdY n0 d S )Nzcannot bind AF_UNIX sockets)r   PermissionErrorcloseunittestZSkipTest)r   addrr
   r
   r   bind_unix_sockets   s
    r!   c                  C   st   t jrpd } zVz2t  t jt j} | tdf W W | r<|   dS  tyP   Y n0 W | rp|   n| rn|   0 dS )Nr   TF)r   has_ipv6AF_INET6r   r   HOSTv6r   r   )r   r
   r
   r   _is_ipv6_enabled|   s     

r%   c                 C   s   t tdstd| S td u rddlm}m} |d }ttjd}zHz|	| daW n( t
y } z|aW Y d }~n
d }~0 0 W || n
|| 0 W d    n1 s0    Y  trdt }t|| S | S d S )NAF_UNIXzNo UNIX Socketsr   )TESTFNunlinkZcan_bind_unix_socketFz%Requires a functional unix bind(): %s)r   r   r   skip_bind_nix_socket_errorZtest.supportr'   r(   r&   r   r   )testr'   r(   pathr   emsgr
   r
   r   skip_unless_bind_unix_socket   s     

2r/   c                  C   s^   t jg} tt dr| t j tt dr4| t j tt drJ| t j tsZ| t j | S )NENETUNREACHEADDRNOTAVAILEHOSTUNREACH)	errnoECONNREFUSEDr   appendr0   r1   r2   IPV6_ENABLEDZEAFNOSUPPORT)errorsr
   r
   r   get_socket_conn_refused_errs   s    


r8   r
   )timeouterrnosc          
   
   #   s  dd l }dd l|tu rtj}g d}g d}td|  | g  sddd |D  dd |D  fdd	}t }zz|d urt| d V  W n |j	y } z.tj
rtjjd d
  |W Y d }~nd }~0  tyn } zr|j}	t|	dkr"t|	d tr"|	d }qt|	dkrPt|	d trP|	d }qqPq||  W Y d }~n
d }~0 0 W t| nt| 0 d S )Nr   ))r4   o   )Z
ECONNRESETh   )r2   q   )r0   e   )Z	ETIMEDOUTn   )r1   c   ))	EAI_AGAIN)EAI_FAIL)
EAI_NONAME)
EAI_NODATA)Z
WSANO_DATAi*  zResource %r is not availablec                 S   s   g | ]\}}t t||qS r
   )getattrr3   .0namenumr
   r
   r   
<listcomp>   s   z&transient_internet.<locals>.<listcomp>c                 S   s   g | ]\}}t t||qS r
   )rI   r   rJ   r
   r
   r   rN      s   c                    s   t | dd }t| tjst| tjr,|v st| jjrRd| j  krPdksn t| jjr~d| j	v sd| j	v sd| j	v s| v rt
jstjjd d  | d S )	Nr3   i  iW  ConnectionRefusedErrorTimeoutErrorEOFErrorr   
)rI   
isinstancer   r9   gaierrorerror	HTTPErrorcodeURLErrorreasonr   verbosesysstderrwriteargs)errnZcaptured_errnosZdeniedZ
gai_errnosurllibr
   r   filter_error   s2    
	z(transient_internet.<locals>.filter_errorrR   r   r   )nntplibZurllib.error_NOT_SETr   ZINTERNET_TIMEOUTZResourceDeniedr   getdefaulttimeoutsetdefaulttimeoutZNNTPTemporaryErrorrZ   r[   r\   r]   r^   r   lenrS   )
Zresource_namer9   r:   rd   Zdefault_errnosZdefault_gai_errnosrc   Zold_timeoutr_   ar
   ra   r   transient_internet   sH    
	



rj   )
contextlibr3   r   r   r[    r   ZHOSTZHOSTv4r$   r   r   r   r   r!   r%   r6   r*   r/   r8   objectre   contextmanagerrj   r
   r
   r
   r   <module>   s&   ='	