
    ijR                       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
 d dlmZ d dlmZmZmZ d dlmZ d dlm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 ddlmZm Z  ddl!m"Z" ddl#m$Z$m%Z%m&Z& ej'        rddl#m(Z(  G d de)e          Z* G d de	          Z+ G d de+          Z, G d de-e          Z. G d d          Z/dddd d!d"d#Z0d$e1d%<    G d& d'e2          Z3 G d( d)          Z4dS )*    )annotationsN)ABCMetaabstractmethod)deepcopy)datetime	timedeltatimezone)Enum)randint   )UDP_LINUX_GRO)_TYPE_SOCKET_OPTIONS_TYPE_TIMEOUT_INTERNAL)LocationParseError)_set_socket_optionsallowed_gai_family)CertificateErrormatch_hostname)_DEFAULT_TIMEOUT   )
inet4_ntoa
inet6_ntoaparse_https_rdata)HttpsRecordc                  2    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
S )ProtocolResolverzx
    At urllib3.future we aim to propose a wide range of DNS-protocols.
    The most used techniques are available.
    systemdohdoqdotdouz	in-memorynullcustomN)__name__
__module____qualname____doc__SYSTEMDOHDOQDOTDOUMANUALNULLCUSTOM     d/root/projects/butler/venv/lib/python3.11/site-packages/urllib3_future/contrib/resolver/protocols.pyr   r      sB          F
C
C
C
CFDFFFr1   r   c                  
   e Zd ZU ded<   dZded<   ded<   	 d=d>dZd?dZed@d            ZedAd            Z	dBdZ
dCdZedDd            ZedBd            Ze	 	 dEdd dFd-            Zeddej        fddej        d.dGd<ZdS )HBaseResolverz!typing.ClassVar[ProtocolResolver]protocolNztyping.ClassVar[str | None]	specifierztyping.ClassVar[str]implementationserver
str | Noneport
int | Nonepatternsstrkwargs
typing.AnyreturnNonec                    || _         || _        || _        t          j                    | _        || _        | j        sd|v r|d         | _        d| _        d | _        d S )Nr<   F)	_server_port_host_patterns	threadingLock_lock_kwargs_unsafe_expose_sock_cursor)selfr8   r:   r<   r>   s        r2   __init__zBaseResolver.__init__9   sj     
/7^%%
" 	5zV';';"("4D %*26r1   c                   |                                  rt          d          t          | j        j        j        j                  }|                    d           t          | j	                  }| j
        r
| j
        |d<   | j        r
| j        |d<   d|v rd|v r | j        | j        i |S d|v r | j        di |S |                                 S )Nz4Attempting to recycle a Resolver that was not closedrL   r8   r:   r<   r>   r0   )is_availableRuntimeErrorlist	__class__rM   __code__co_varnamesremover   rI   rC   rD   rE   )rL   args
kwargs_cpys      r2   recyclezBaseResolver.recycleN   s     	WUVVVDN+4@AAFdl++
< 	0#'<Jx : 	,!%Jv(d"2"2!4>4#6E*EEE!4>//J///~~r1   c                    | j         S N)rC   rL   s    r2   r8   zBaseResolver.serverc   s
    |r1   c                    | j         S rZ   )rD   r[   s    r2   r:   zBaseResolver.portg   s
    zr1   boolc                *    t          | j                  S rZ   )r]   rE   r[   s    r2   have_constraintszBaseResolver.have_constraintsk   s    D'(((r1   hostnamestr | bytes | Nonebool | Nonec                    | j         sdS |d}t          |t                    r|                    d          }	 t	          dt          d | j         D                       i|           n# t          $ r Y dS w xY wdS )z
        Determine if given hostname is especially resolvable by given resolver.
        If this resolver does not have any constrained list of host, it returns None. Meaning
        it support any hostname for resolution.
        N	localhostasciisubjectAltNamec              3     K   | ]}d |fV  	dS )DNSNr0   ).0es     r2   	<genexpr>z'BaseResolver.support.<locals>.<genexpr>|   s&      )R)R5!*)R)R)R)R)R)Rr1   FT)rE   
isinstancebytesdecoder   tupler   )rL   r`   s     r2   supportzBaseResolver.supportn   s     " 	4"Hh&& 	0w//H	!E)R)Rd>Q)R)R)R$R$RT      	 	 	55	ts   .A( (
A65A6c                    t           )zsTerminate the given resolver instance. This should render it unusable. Further inquiries should raise an exception.NotImplementedErrorr[   s    r2   closezBaseResolver.close   
     "!r1   c                    t           )z,Determine if Resolver can receive inquiries.rr   r[   s    r2   rO   zBaseResolver.is_available   ru   r1   r   Fquic_upgrade_via_dns_rrhostbytes | str | Nonestr | int | Nonefamilysocket.AddressFamilytypesocket.SocketKindprotointflagsrx   klist[tuple[socket.AddressFamily, socket.SocketKind, int, str, tuple[str, int] | tuple[str, int, int, int]]]c                   t           )zuThis method align itself on the standard library socket.getaddrinfo(). It must be implemented as-is on your Resolver.rr   )rL   ry   r:   r|   r~   r   r   rx   s           r2   getaddrinfozBaseResolver.getaddrinfo   s
    * "!r1   )rx   timing_hookdefault_socket_familyaddresstuple[str, int]timeoutr   source_addresstuple[str, int] | Nonesocket_options_TYPE_SOCKET_OPTIONS | Nonesocket_kindr   Etyping.Callable[[tuple[timedelta, timedelta, datetime]], None] | Noner   socket.socketc          
        |\  }	}
|	                     d          r|	                    d          }	d}t                      }|t          j        k    r|}|Kt          t          j        |d                   t          j                  rt          j	        }nt          j
        }	 |	                    d           n"# t          $ r t          d|	 d          dw xY wt          j        t           j                  }|                     |	|
|||	          }t          j        t           j                  |z
  }t          j        t           j                  }|D ]w}|\  }}}}}d}	 t          j        |||          }|	 |                    t          j        t          j        d
           n[# t,          t.          f$ rG 	 |                    t          j        t          j        d
           n# t,          t.          f$ r Y nw xY wY nw xY w	 |                    t          j        t          j        t5          j        dd
d                     n# t,          t.          f$ r Y nw xY w|                    |           |t          j        k    rHt<          j        dk    r8	 |                    t          j         tB          d
           n# t,          $ r Y nw xY wtE          ||           |tF          ur|$                    |           | j%        r|| _&        |'                    |           | j%        rd| _&        d}t          j        t           j                  |z
  }|+ |||t          j        t           j                  f           |c S # t,          tP          f$ r>}|}||)                                 t          |tP                    rY d}~ nY d}~qd}~ww xY w|
	 |# d}w xY 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)tzrw   r   iilinuxz!getaddrinfo returns an empty list)*
startswithstripr   socket	AF_UNSPECrl   	ipaddress
ip_addressIPv4AddressAF_INETAF_INET6encodeUnicodeErrorr   r   nowr	   utcr   
setsockopt
SOL_SOCKETSO_REUSEPORTOSErrorAttributeErrorSO_REUSEADDR	SO_LINGERstructpackbind
SOCK_DGRAMsysplatformSOL_UDPr   r   r   
settimeoutrJ   rK   connectOverflowErrorrt   )rL   r   r   r   r   r   rx   r   r   ry   r:   errr|   dt_pre_resolverecordsdelta_post_resolvedt_pre_establishedresafsocktyper   	canonnamesasockdelta_post_established_s                             r2   create_connectionzBaseResolver.create_connection   s   2 
d??3 	$::d##D
 $%%V%%%$*!%$^A%6779N  8 )/%%(.%	UKK 	U 	U 	U$%I%I%I%IJJPTT	U "666""!$; # 
 
 &\X\:::^K%\X\::: J	 J	C14.B%BDG}R599 "-!(96;NPQRRRR& 
! 
! 
!! OOF,=v?RTUVVVV#*  ! ! ! !D	!
!"-v/?TSTVWAXAX    $^4    IIn--- v000S\W5L5LqIIII"    $D.999"222OOG,,,& -(,D%R   & -(,D% LHL1114FF ' *K.2$LHL999   ]+   #JJLLLa// EEEEE    	 ?	 



=>>>s    B6 6C"M;;+F'&M;'G?9+G%$G?%G96G?8G99G?<M;>G??M;?IM;IM;I8M;&J76M;7
KM;KB4M;;O
-OO
O OrZ   )
r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   r@   r4   )r@   r9   )r@   r;   r@   r]   )r`   ra   r@   rb   r@   rA   r   r   ry   rz   r:   r{   r|   r}   r~   r   r   r   r   r   rx   r]   r@   r   )r   r   r   r   r   r   r   r   r   r   rx   r]   r   r   r   r}   r@   r   )r$   r%   r&   __annotations__r6   rM   rX   propertyr8   r:   r_   rp   r   rt   rO   r   r   r   SOCK_STREAMr   r   r0   r1   r2   r4   r4   3   s        ////-1I1111((((
  7 7 7 7 7*       *    X    X) ) ) )   * " " " ^" " " " ^"  " )." " " " " ^": +;156:)/);Q? ).6<6FQ? Q? Q? Q? Q? Q? Q? Q?r1   r4   )	metaclassc                  \     e Zd ZdZd fdZd dZd!dZd"d
Z	 d#d$dZ	 	 d%ddd&dZ	 xZ
S )'ManyResolverzx
    Special resolver that use many child resolver. Priorities
    are based on given order (list of BaseResolver).
    	resolversr4   r@   rA   c                    t                                          d d            t          |          | _        d |D             | _        d |D             | _        d| _        d| _        d S )Nc                :    g | ]}|                                 |S r0   r_   ri   r   s     r2   
<listcomp>z)ManyResolver.__init__.<locals>.<listcomp>G  s9     3
 3
 3
(:(:(<(<3
3
 3
 3
r1   c                :    g | ]}|                                 |S r0   r   r   s     r2   r   z)ManyResolver.__init__.<locals>.<listcomp>J  s9     1
 1
 1
A$6$6$8$81
1
 1
 1
r1   r   F)superrM   len_size_unconstrained_constrained_concurrent_terminated)rL   r   rR   s     r2   rM   zManyResolver.__init__B  s    t$$$^^
3
 3
 3
 3
 3
1
 1
 1
 1
 1
 !"!&r1   c                    g }| j         | j        z   D ])}|                    |                                           *t	          | S rZ   )r   r   appendrX   r   )rL   r   resolvers      r2   rX   zManyResolver.recycleQ  sO    	+d.?? 	1 	1HX--//0000Y''r1   c                `    | j         | j        z   D ]}|                                 d| _        d S )NT)r   r   rt   r   )rL   r   s     r2   rt   zManyResolver.closeY  s=    +d.?? 	 	HNNr1   r]   c                    | j          S rZ   )r   r[   s    r2   rO   zManyResolver.is_available_  s    ###r1   Fconstrained*typing.Generator[BaseResolver, None, None]c              #  j  K   |s| j         n| j        }|sd S | j        5  | xj        dz  c_        d d d            n# 1 swxY w Y   	 t	          |          }| j        dz
  |z  }t          ||          D ]b}||                                         s<| j        5  ||                                         ||<   d d d            n# 1 swxY w Y   ||         V  c|dk    rst          d|          D ]b}||                                         s<| j        5  ||                                         ||<   d d d            n# 1 swxY w Y   ||         V  c| j        5  | xj        dz  c_        d d d            d S # 1 swxY w Y   d S # | j        5  | xj        dz  c_        d d d            w # 1 swxY w Y   w xY w)Nr   r   )r   r   rH   r   r   rangerO   rX   )rL   r   r   resolver_count	start_idxidxs         r2   __resolverszManyResolver.__resolversb  sW      0;QD''@Q	 	FZ 	" 	"!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"	& ^^N)A-?IY77 % % ~2244 B B B)23)?)?)A)A	#B B B B B B B B B B B B B B Bn$$$$1}} I.. ) )C$S>6688 F!Z F F-6s^-C-C-E-EIcNF F F F F F F F F F F F F F F#C.(((( & &  A%  & & & & & & & & & & & & & & & & & & & &  A%  & & & & & & & & & & & & & & & &s   ;??AF C 4F  C	F C	AF D9-F 9D=	=F  D=	F E44E8;E8F2	F&F2&F**F2-F*.F2r   rw   ry   rz   r:   r{   r|   r}   r~   r   r   r   r   rx   r   c          
        t          |t                    r|                    d          }|d}g }d}	|                     d          D ]}
|
                    |          }|du rd}		 |
                    |||||||          }|r|c S A# t          j        $ rI}t          |j        d         t                    rd|j        d         v sd|j        d         v r Y d }~d }~ww xY w|du r|
                    |
           |	r5t          j        d	| d
| j        t          | j                  z
   d          |                                 D ]}
	 |
                    |||||||          }|r|c S &# t          j        $ rI}t          |j        d         t                    rd|j        d         v sd|j        d         v r Y d }~yd }~ww xY wt          j        d	| d
| j        t          | j                  z
   d          )Nre   rd   FTrw   r   DNSSECDNSKEYzName or service not known: z using z resolver(s))rl   rm   rn   _ManyResolver__resolversrp   r   r   gaierrorrV   r=   r   r   r   r   r   )rL   ry   r:   r|   r~   r   r   rx   tested_resolversany_constrained_triedr   can_resolveresultsexcs                 r2   r   zManyResolver.getaddrinfo  s   & dE"" 	(;;w''D<D&+((.. 	2 	2H"**400Kd""(,%&220G 3  G  '&'   !#(1+s33  CHQK//8sx{3J3JHHHH %% ''111  	/ndnn4:DL_H`H`;`nnn   ((** 	 	H"..,C /    #"NNN#?   chqk3// ++x38A;/F/F oh$hhtzCHYDZDZ7Zhhh
 
 	
s0   &B		C!?CC!E//G>?GG)r   r4   r@   rA   r   r   r   )F)r   r]   r@   r   r   r   )r$   r%   r&   r'   rM   rX   rt   rO   r   r   __classcell__)rR   s   @r2   r   r   <  s         
' ' ' ' ' '( ( ( (       $ $ $ $ #(& & & & &J T
 ).T
 T
 T
 T
 T
 T
 T
 T
 T
 T
r1   r   c                      e Zd ZdZdZdZdZdS )SupportedQueryTypez
    urllib3.future does not need anything else so far. let's be pragmatic.
    Each type is associated with its hex value as per the RFC.
    r      A   N)r$   r%   r&   r'   AAAAAHTTPSr0   r1   r2   r   r     s)         
 	ADEEEr1   r   c                  v    e Zd ZdZ	 dddZedd            Zedd            ZddZddZ	e
dd            ZdS )DomainNameServerQueryz
    Minimalist DNS query/message to ask for A, AAAA and HTTPS records.
    Only meant for urllib3.future use. Does not cover all of possible extent of use.
    Nry   r=   
query_typer   override_idr;   r@   rA   c                    t          j        d|t          dd          n|          | _        || _        || _        t          j        dd          | _        t          j        dd          | _        d | _        d S )N!Hr   i     r   )	r   r   r   _id_host_query_flags	_qd_count_cached)rL   ry   r   r   s       r2   rM   zDomainNameServerQuery.__init__  sq     ;[-@'&&)))k
 
 
 k$//T1--%)r1   r   c                B    t          j        d| j                  d         S )Nr  r   )r   unpackr  r[   s    r2   idzDomainNameServerQuery.id  s    }T48,,Q//r1   rm   c                    | j         S rZ   r  r[   s    r2   raw_idzDomainNameServerQuery.raw_id  	    xr1   c                2    d| j          d| j        j         dS )Nz<Query 'z' IN >)r  r  namer[   s    r2   __repr__zDomainNameServerQuery.__repr__  s"    >$*>>4;+;>>>>r1   c                   | j         r| j         S d}|| j        z  }|| j        z  }|| j        z  }|dz  }|dz  }|dz  }| j                            d          D ]?}|t          j        dt          |                    z  }||	                    d          z  }@|dz  }|t          j        d| j
        j                  z  }|t          j        dd          z  }|| _         |S )	Nr1   s     .z!Bre       r  r   )r	  r  r  r  r  splitr   r   r   r   r  value)rL   payloadexts      r2   	__bytes__zDomainNameServerQuery.__bytes__  s    < 	 <484;4>!;;;:##C(( 	+ 	+Cv{4S222Gszz'***GG76;tT[%67776;tV,,,r1   typeslist[DomainNameServerQuery]c                \    g }|D ]&}|                     t          | |                     '|S )N)r   )r   r   )ry   r  queriesr   s       r2   bulkzDomainNameServerQuery.bulk  s@     	O 	OJNN0*MMMNNNNr1   rZ   )ry   r=   r   r   r   r;   r@   rA   r@   r   )r@   rm   r@   r=   )ry   r=   r  r   r@   r  )r$   r%   r&   r'   rM   r   r  r  r  r  staticmethodr!  r0   r1   r2   r   r     s          TX* * * * * 0 0 0 X0    X? ? ? ?   2    \  r1   r   zNo ErrorzFormat ErrorzServer FailurezNon-Existent DomainzQuery RefusedzNot Authorized)r   r      r      	   zdict[int, str]COMMON_RCODE_LABELc                      e Zd ZdS )DomainNameServerParseExceptionN)r$   r%   r&   r0   r1   r2   r*  r*  /  s          r1   r*  c                      e Zd ZdZddZedd            Zedd
            Zedd            Zedd            Z	edd            Z
edd            ZddZdS )DomainNameServerReturnz
    Minimalist DNS response parser. Allow to quickly extract key-data out of it.
    Meant for A, AAAA and HTTPS records. Basically only what we need.
    r  rm   r@   rA   c                   	 t          j        d|d d                   }|d         | _        |d         | _        |d         | _        |d         | _        t          dt          |d                   d          d	          | _        d
| _	        d}	 ||         }|dk    r|dz  }n@| xj	        ||dz   |dz   |z            
                    d          dz   z  c_	        ||dz   z  }Tg | _        | j        r4|dz  }|t          |          k     rt          j        d|||dz                      }t          j        d||dz   |dz                      d         }||dz   |dz   |z            }t          |          dk    rt          |          }n6t          |          d	k    rt          |          }n|rt          |          }n	 | j                            t#          |d                   |d         |f           n# t$          $ r Y nw xY w|d|z   z  }|t          |          k     d S d S d S # t           j        t(          t$          t*          f$ r%}t-          dt/          |                     |d }~ww xY w)Nz!HHHHHH   r   r   r%  r   0x    Tre   r     z!HHHI
   r  zBA protocol error occurred while parsing the DNS response payload: )r   r  r  r  r  	_an_countr   hex_rcode	_hostnamern   _recordsr   r   r   r   r   r   
ValueErrorerror
IndexErrorUnicodeDecodeErrorr*  r=   )	rL   r  upr   c
entry_sizedatadecoded_datarj   s	            r2   rM   zDomainNameServerReturn.__init__8  s   9	y'#2#,77B!uDHQ%DKUDNUDN83wqz??2#688"==DK"$DNC	CL661HC'#'C!GaK*?"@"G"G"P"PSV"VVq1u	 VXDM~ +qCLL((wcBh0GHHB!'tWS2Xb=P5Q!R!RST!UJ"38cBh.C#CDD4yyA~~:DT:J:JTb'1$'7'7 !'8'>'> ,,/1662M    &    2
?*C- CLL((((+ + )(. j*6HI 	 	 	0q66   	s<   F=H)  6G7 6H) 7
HH) HH) )"I0 I++I0r   c                    | j         S rZ   r  r[   s    r2   r  zDomainNameServerReturn.idt  r  r1   r=   c                    | j         S rZ   )r8  r[   s    r2   r`   zDomainNameServerReturn.hostnamex  s
    ~r1   7list[tuple[SupportedQueryType, int, str | HttpsRecord]]c                    | j         S rZ   )r9  r[   s    r2   r   zDomainNameServerReturn.records|  s
    }r1   r]   c                *    t          | j                  S rZ   )r]   r9  r[   s    r2   is_foundzDomainNameServerReturn.is_found  s    DM"""r1   c                    | j         S rZ   r7  r[   s    r2   rcodezDomainNameServerReturn.rcode  s
    {r1   c                    | j         dk    S )Nr   rJ  r[   s    r2   is_okzDomainNameServerReturn.is_ok  s    {ar1   c                    | j         rd| j         d| j         dS d| j         d| j         d| j        t          v rt          | j                 nd dS )	Nz
<Records 'z' r  z<DNS Error 'z' with Status z (Unknownz)>)rM  r`   r9  rK  r(  r[   s    r2   r  zDomainNameServerReturn.__repr__  s    : 	BAAAAAAA _dm  _  _4:  _  _koku  zL  lL  lLI[\`\fIgIg  R[  _  _  _  	_r1   N)r  rm   r@   rA   r"  r#  )r@   rE  r   )r$   r%   r&   r'   rM   r   r  r`   r   rH  rK  rM  r  r0   r1   r2   r,  r,  2  s        
: : : :x    X    X    X # # # X#    X       X _ _ _ _ _ _r1   r,  )5
__future__r   r   r   r   r   rF   typingabcr   r   copyr   r   r   r	   enumr
   randomr   	_constantr   _typingr   r   
exceptionsr   util.connectionr   r   util.ssl_match_hostnamer   r   util.timeoutr   utilsr   r   r   TYPE_CHECKINGr   r=   r   r4   r   r   r   r   r(  r   	Exceptionr*  r,  r0   r1   r2   <module>r_     s   " " " " " " "       



      ' ' ' ' ' ' ' '       2 2 2 2 2 2 2 2 2 2             & & & & & & C C C C C C C C , , , , , , F F F F F F F F G G G G G G G G , , , , , , < < < < < < < < < <	 #""""""    sD   0F? F? F? F? F?W F? F? F? F?RY
 Y
 Y
 Y
 Y
< Y
 Y
 Y
x    d   > > > > > > > >F & &      5 4 4 4 4Y 4 4 4]_ ]_ ]_ ]_ ]_ ]_ ]_ ]_ ]_ ]_r1   