
    F/j&                        U d dl Z d dlZd dlZd dlmZmZmZ ddlmZm	Z	 dZ
	 d dlZ eej                  d      Zej                   ej"                  z  Zej&                  ej(                  z  Zej,                  Z eed      reej0                  z  Z G d	 d
e      Z G d de      Z G d d      Zeeez     ZereneZeed<   y# e$ r dZdZY w xY w)    N)AnyFinalOptional   )AbstractResolverResolveResult)ThreadedResolverAsyncResolverDefaultResolvergetaddrinfoFAI_MASKc            
           e Zd ZdZddej
                  dz  ddfdZdej                  fde	de
d	ej                  dee   fd
ZddZy)r	   zThreaded resolver.

    Uses an Executor for synchronous getaddrinfo() calls.
    concurrent.futures.ThreadPoolExecutor is used by default.
    Nloopreturnc                 >    |xs t        j                         | _        y N)asyncioget_running_loop_loop)selfr   s     N/var/www/html/maxservice/venv/lib/python3.12/site-packages/aiohttp/resolver.py__init__zThreadedResolver.__init__"   s    7W557
    r   hostportfamilyc                   K   | j                   j                  ||t        j                  |t               d {   }g }|D ]  \  }}}}}|t        j
                  k(  rTt        |      dk  r+|d   r7| j                   j                  |t               d {   \  }	}
t        |
      }n#|d d \  }	}n|t        j                  k(  sJ |\  }	}|j                  t        ||	|||t                      |S 7 7 `w)N)typer   flags      hostnamer   r   r   protor   )r   r   socketSOCK_STREAM_AI_ADDRCONFIGAF_INET6lengetnameinfo_NAME_SOCKET_FLAGSintAF_INETappendr   _NUMERIC_SOCKET_FLAGS)r   r   r   r   infoshosts_r$   addressresolved_host_ports              r   resolvezThreadedResolver.resolve%   s     jj,,##  - 
 
 &(,1 	(FAua(w<!# 1: 261G1G!32 ,(M5 u:D*1"1+'M4///&-#tLL!&!/	'	< O
&,s#   6C7C3AC7C5AC75C7c                    K   y wr    r   s    r   closezThreadedResolver.closeQ   s	     s   r   r   N)__name__
__module____qualname____doc__r   AbstractEventLoopr   r%   r-   strr,   AddressFamilylistr   r6   r:   r8   r   r   r	   r	      sf    8W66= 8 8 &'v~~**"*060D0D*	m	*Xr   r	   c                       e Zd ZdZ	 ddej
                  dz  dededdfdZdej                  fd	e
d
edej                  dee   fdZdej                  fd	e
d
ededeee
ef      fdZddZy)r
   z9Use the `aiodns` package to make asynchronous DNS lookupsNr   argskwargsr   c                 p   t         t        d      |xs t        j                         | _        d | _        |s|rt        j                  |i || _        y t               | _        | j
                  j                  | | j                        | _        t        | j                  d      s| j                  | _        y y )Nz Resolver requires aiodns librarygethostbyname)aiodnsRuntimeErrorr   r   r   _managerDNSResolver	_resolver_DNSResolverManagerget_resolverhasattr_resolve_with_queryr6   )r   r   rE   rF   s       r   r   zAsyncResolver.__init__X   s     >ABB7W557
48 6#//@@DN+-33D$**Et~~733DL 8r   r   r   r   r   c                   K   	 | j                   j                  ||t        j                  |t               d {   }g }|j                  D ]  }|j                  }	|j                  t        j                  k(  r{t        |	      dkD  rS|	d   rN| j                   j                  |	d   j!                  d      g|	dd  t"               d {   }
|
j$                  }nR|	d   j!                  d      }|	d   }n8|j                  t        j&                  k(  sJ |	d   j!                  d      }|	d   }|j)                  t+        ||||j                  dt,                      |st        d d      |S 7 4# t
        j                  j                  $ r;}t        |j                        dk\  r|j                  d   nd}t        d |      |d }~ww xY w7 w)N)r   r   r   r   r   DNS lookup failedr    r   asciir"   )rM   r   r%   r&   r'   rI   errorDNSErrorr)   rE   OSErrornodesaddrr   r(   r*   decoder+   noder-   r.   r   r/   )r   r   r   r   respexcmsgr1   r[   r3   resultr4   s               r   r6   zAsyncResolver.resolveq   s    
	.33''$ 4  D &(JJ 	DGKyyG{{foo-w<!#
 $(>>#=#= **73BgabkB*$ F %+KKM$+AJ$5$5g$>M"1:D{{fnn444 '
 1 1' :qzLL!&;;/	'	< $ 344Y ||$$ 	.!$SXX!!3#((1+9LC$$#-	.sE   G5E0 E-E0 B
GG	B$G-E0 0G6GGGc           
        K   |t         j                  k(  rdnd}	 | j                  j                  ||       d {   }g }|D ]2  }	|j                  ||	j                  ||dt         j                  d       4 |st        d d      |S 7 M# t        j
                  j                  $ r;}t        |j                        dk\  r|j                  d   nd}t        d |      |d }~ww xY ww)NAAAAAr   rS   r   r"   )r%   r(   rM   queryrI   rU   rV   r)   rE   rW   r.   r   AI_NUMERICHOST)
r   r   r   r   qtyper\   r]   r^   r1   rrs
             r   rQ   z!AsyncResolver._resolve_with_query   s      "(6??!:v	.--dE::D
  
	BLL $GG $#22	
	 $ 344+ ;||$$ 	.!$SXX!!3#((1+9LC$$#-	.s8   C%B
 BB
 A	C%B
 
C"'6CC""C%c                    K   | j                   r5| j                   j                  | | j                         d | _         d | _        y | j                  | j                  j	                          d | _        y wr   )rK   release_resolverr   rM   cancelr9   s    r   r:   zAsyncResolver.close   sW     ==MM**4< DM!DN>>%NN!!#s   A0A2r   r;   )r<   r=   r>   r?   r   r@   r   r   r%   r-   rA   r,   rB   rC   r   r6   dictrQ   r:   r8   r   r   r
   r
   U   s    C 264''$.4 4 	4
 
44 &'v~~00"0060D0D0	m	0f &'fnn"03	d38n	:
r   r
   c                        e Zd ZU dZdZed    ed<   d fdZddZddd	e	j                  dd
fdZddd	e	j                  ddfdZ xZS )rN   zManager for aiodns.DNSResolver objects.

    This class manages shared aiodns.DNSResolver instances
    with no custom arguments across different event loops.
    N	_instancer   c                     | j                   .t        | 	  |       | _         | j                   j                          | j                   S r   )rl   super__new___init)cls	__class__s    r   ro   z_DNSResolverManager.__new__   s7    == !GOC0CMMM!}}r   c                 6    t        j                         | _        y r   )weakrefWeakKeyDictionary
_loop_datar9   s    r   rp   z_DNSResolverManager._init   s    
 %%' 	r   clientr
   r   zaiodns.DNSResolverc                     || j                   vr<t        j                  |      }t        j                         }||f| j                   |<   n| j                   |   \  }}|j                  |       |S )a&  Get or create the shared aiodns.DNSResolver instance for a specific event loop.

        Args:
            client: The AsyncResolver instance requesting the resolver.
                   This is required to track resolver usage.
            loop: The event loop to use for the resolver.
        )r   )rv   rI   rL   rt   WeakSetadd)r   rw   r   resolver
client_sets        r   rO   z _DNSResolverManager.get_resolver   sg     t&))t4H9@9JJ%-z$:DOOD! $(??4#8 Hj 	vr   c                     | j                   j                  |      }|y|\  }}|j                  |       |s ||j                          | j                   |= yy)zRelease the resolver for an AsyncResolver client when it's closed.

        Args:
            client: The AsyncResolver instance to release.
            loop: The event loop the resolver was using.
        N)rv   getdiscardri   )r   rw   r   current_loop_datar{   r|   s         r   rh   z$_DNSResolverManager.release_resolver   s^     !OO//5$0*6"#!% r   )r   rN   r;   )r<   r=   r>   r?   rl   r   __annotations__ro   rp   r   r@   rO   rh   __classcell__)rr   s   @r   rN   rN      sj     26Ix-.5(%-4-F-F	.&%&-4-F-F&	&r   rN   r   ) r   r%   rt   typingr   r   r   abcr   r   __all__rI   rP   rL   aiodns_defaultImportErrorrd   AI_NUMERICSERVr/   NI_NUMERICHOSTNI_NUMERICSERVr+   AI_ADDRCONFIGr'   r   r	   r
   rN   r   _DefaultTyper   r   r8   r   r   <module>r      s       ' ' 0
BV//?N --0E0EE **V-B-BB %%
69fnn$N7' 7tu$ up@& @&F M$4451?EU UE  FNs   C 	CC