o
    .j%6                     @  s   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
 d dlmZmZmZ ddlmZmZ ddlmZmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZ ddlmZ ddl m!Z! G dd de!e	dZ"G dd de"Z#dS )    )annotationsN)ABCMetaabstractmethod)datetime	timedeltatimezone   )UDP_LINUX_GROUDP_LINUX_SEGMENT)_TYPE_SOCKET_OPTIONS_TYPE_TIMEOUT_INTERNAL)LocationParseError)_set_socket_optionsallowed_gai_family)_DEFAULT_TIMEOUT   )AsyncSocket)timeout   )BaseResolverc                      sh   e Zd Zd+ fddZed,ddZe		d-dd	d.ddZeddej	fddej
dd/d)d*Z  ZS )0AsyncBaseResolverreturnc                   s
   t   S N)superrecycleself	__class__ e/home/thesage/.local/lib/python3.10/site-packages/urllib3_future/contrib/resolver/_async/protocols.pyr      s   
zAsyncBaseResolver.recycleNonec                      t )zsTerminate the given resolver instance. This should render it unusable. Further inquiries should raise an exception.NotImplementedErrorr   r   r   r    close   s   zAsyncBaseResolver.closer   Fquic_upgrade_via_dns_rrhostbytes | str | Noneportstr | int | Nonefamilysocket.AddressFamilytypesocket.SocketKindprotointflagsr'   boolslist[tuple[socket.AddressFamily, socket.SocketKind, int, str | bytes, tuple[str, int] | tuple[str, int, int, int]]]c                  r"   )zuThis method align itself on the standard library socket.getaddrinfo(). It must be implemented as-is on your Resolver.r#   )r   r(   r*   r,   r.   r0   r2   r'   r   r   r    getaddrinfo   s   zAsyncBaseResolver.getaddrinfoN)r'   timing_hookdefault_socket_familyaddresstuple[str, int]r   r   source_addresstuple[str, int] | Nonesocket_options_TYPE_SOCKET_OPTIONS | Nonesocket_kindr6   Etyping.Callable[[tuple[timedelta, timedelta, datetime]], None] | Noner7   r   c                  s  |\}	}
|	 dr|	d}	d}t }|tjkr|}|dur1tt|d tjr.tj	}ntj
}z|	d W n tyH   td|	 ddw tjtjd}|tur|durz-t|4 I dH  | j|	|
|||d	I dH }W d  I dH  n1 I dH sw   Y  W n ty   td
|	 dw | j|	|
|||d	I dH }tjtjd| }tjtjd}|D ]}|\}}}}}d}zt|||}|rz|tjtjd W n" ttfy   z|tjtjd W n ttfy   Y nw Y nw z|tjtjt ddd W n ttfy   Y nw |tj!krLt"j#dkrLz
|tj$t%d W n
 ty6   Y nw z
|tj$t&d W n
 tyK   Y nw t'|| |tur[|(| |rc|)| z
|*|I dH  W n t+j,y{   |-   w d}tjtjd| }|dur|||tjtjdf t|t.r|r||_/|W   S  tt0fy } z|}|dur|-  t|t0rW Y d}~ nW Y d}~qd}~ww |durz|d}w td)a  Connect to *address* and return the socket object.

        Convenience function.  Connect to *address* (a 2-tuple ``(host,
        port)``) and return the socket object.  Passing the optional
        *timeout* parameter will set the timeout on the socket instance
        before attempting to connect.  If no *timeout* is supplied, the
        global default timeout setting returned by :func:`socket.getdefaulttimeout`
        is used.  If *source_address* is set it must be a tuple of (host, port)
        for the socket to bind as a source address before making the connection.
        An host of '' or port 0 tells the OS to use the default.
        [z[]Nr   idna'z', label empty or too long)tzr&   zunable to resolve 'z5' within timeout. the DNS server may be unresponsive.   iilinuxi   z!getaddrinfo returns an empty list)1
startswithstripr   socket	AF_UNSPEC
isinstance	ipaddress
ip_addressIPv4AddressAF_INETAF_INET6encodeUnicodeErrorr   r   nowr   utcr   timeout_r5   TimeoutErrorgaierrorr   
setsockopt
SOL_SOCKETSO_REUSEPORTOSErrorAttributeErrorSO_REUSEADDR	SO_LINGERstructpack
SOCK_DGRAMsysplatformSOL_UDPr	   r
   r   
settimeoutbindconnectasyncioCancelledErrorr%   bytes_ech_configOverflowError)r   r8   r   r:   r<   r>   r'   r6   r7   r(   r*   errr,   dt_pre_resolverecordsdelta_post_resolvedt_pre_establishedresafsocktyper0   	canonnamesasockdelta_post_established_r   r   r    create_connection:   s   


(


	







z#AsyncBaseResolver.create_connectionr   r   r   r!   r   r   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r1   r'   r3   r   r4   )r8   r9   r   r   r:   r;   r<   r=   r>   r/   r'   r3   r6   r?   r7   r-   r   r   )__name__
__module____qualname__r   r   r%   r5   r   rI   SOCK_STREAMrJ   rz   __classcell__r   r   r   r    r      s&    	r   )	metaclassc                      sd   e Zd ZdZd% fddZd&dd	Zd'd
dZd(ddZ	d)d*ddZ		d+ddd,d#d$Z	  Z
S )-AsyncManyResolverzx
    Special resolver that use many child resolver. Priorities
    are based on given order (list of BaseResolver).
    	resolversr   r   r!   c                   sH   t  d d  t|| _dd |D | _dd |D | _d| _d| _d S )Nc                 S  s   g | ]}|  s|qS r   have_constraints.0ry   r   r   r    
<listcomp>   
    z.AsyncManyResolver.__init__.<locals>.<listcomp>c                 S  s   g | ]}|  r|qS r   r   r   r   r   r    r      r   r   F)r   __init__len_size_unconstrained_constrained_concurrent_terminated)r   r   r   r   r    r      s   

zAsyncManyResolver.__init__c                 C  s,   g }| j | j D ]	}||  qt| S r   )r   r   appendr   r   )r   r   resolverr   r   r    r      s   zAsyncManyResolver.recyclec                   s,   | j | j D ]	}| I d H  qd| _d S )NT)r   r   r%   r   )r   r   r   r   r    r%     s   
zAsyncManyResolver.closer3   c                 C  s   | j  S r   )r   r   r   r   r    is_available	  s   zAsyncManyResolver.is_availableFconstrained/typing.Generator[AsyncBaseResolver, None, None]c                 c  s   |s| j n| j}|sd S | j |  jd7  _W d    n1 s"w   Y  zt|}| jd | }t||D ](}||  s[| j ||  ||< W d    n1 sVw   Y  || V  q8|dkrtd|D ](}||  s| j ||  ||< W d    n1 sw   Y  || V  qjW | j |  jd8  _W d    d S 1 sw   Y  d S | j |  jd8  _W d    w 1 sw   Y  w )NrD   r   )r   r   _lockr   r   ranger   r   )r   r   r   resolver_count	start_idxidxr   r   r    __resolvers  s:   *zAsyncManyResolver.__resolversr   r&   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r'   r4   c                  s  t |tr|d}|d u rd}g }d}	| dD ]Y}
|
|}|du rjd}	z|
j|||||||dI d H }|r>|W   S W q tjyi } zt |jd t	r_d|jd v s^d|jd v r_ W Y d }~qd }~ww |du rs|
|
 q|	rtd	| d
| jt| j  d|  D ]D}
z|
j|||||||dI d H }|r|W   S W q tjy } zt |jd t	rd|jd v sd|jd v rƂ W Y d }~qd }~ww td	| d
| jt| j  d)Nascii	localhostFTr&   r   DNSSECDNSKEYzName or service not known: z using z resolver(s))rK   rj   decode_AsyncManyResolver__resolverssupportr5   rI   rW   argsstrr   r   r   r   r   )r   r(   r*   r,   r.   r0   r2   r'   tested_resolversany_constrained_triedr   can_resolveresultsexcr   r   r    r5   +  s|   







zAsyncManyResolver.getaddrinfo)r   r   r   r!   r{   r|   )r   r3   )F)r   r3   r   r   r}   r~   )r   r   r   __doc__r   r   r%   r   r   r5   r   r   r   r   r    r      s    


%	r   )$
__future__r   rh   rL   rI   r_   rb   typingabcr   r   r   r   r   	_constantr	   r
   _typingr   r   
exceptionsr   util.connectionr   r   util.timeoutr   ssar   ssa._timeoutr   rU   	protocolsr   r   r   r   r   r   r    <module>   s(     Q