o
    tPfP                     @   s  d dl mZmZmZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dlm
Z
 d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlZd dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ dgZdd Ze Zej Z ej j!Z"dded d d e j#e$eddd fddZ#e#e _#dZ%G dd dej j&Z'G dd de(Z)G dd  d e(Z*d!d" Z+G d#d deZ,dS )$    )absolute_importprint_functiondivisionN)error)gaierror)herror)NI_NUMERICSERV)AF_INET)AF_INET6)	AF_UNSPEC)
EAI_NONAME)
EAI_FAMILY)AbstractResolver)	HostsFile)
__import__)string_types)	iteritems)configResolverc                     sT   ddl m}  ddddd  fdd	}d
d }| d||}|j}dd }||j_|S )Nr   )import_patched)rdataresolverrdtypes)INANY)AAAAA)SOAPTR)dnszdns.rdtypeszdns.rdtypes.INzdns.rdtypes.ANYc                    s     | dS )N )get)mod_nameextrasr    Z/var/www/html/humari/django-venv/lib/python3.10/site-packages/gevent/resolver/dnspython.py	extra_allp   s   z_patch_dns.<locals>.extra_allc                 S   s   | j }|j}zt| jj}W n ty   | jj}Y nw zt| jj}W n ty1   | jj}Y nw |D ]}|D ]}||| q8q4d S N)	r   get_rdata_classlist
rdataclass
RdataClassAttributeError	_by_value	rdatatype	RdataType)r   r   r(   rdclass_valuesrdtype_valuesrdclassrdtyper    r    r%   after_import_hooks   s"   
z%_patch_dns.<locals>.after_import_hookr   c                 S   s   t | r'   )
ValueError)namer    r    r%   _no_dynamic_imports   s   z'_patch_dns.<locals>._no_dynamic_imports)gevent._patcherr   moduler   r   )importerr&   r4   patchertopr7   r    r#   r%   
_patch_dnsd   s   r=   	exc_clearc                   C      d S r'   r    r    r    r    r%   <lambda>   s    r@   c           	      C   s<   |t jt jB @ dkrt t j|| |||||}|  |S Nr   )socketAI_ADDRCONFIGAI_V4MAPPEDr   
EAI_SYSTEM)	hostservicefamilysocktypeprotoflags	_orig_gai
_exc_clearresr    r    r%   _getaddrinfo   s
   rO   g     r@c                   @   s   e Zd ZdddZdS )_HostsAnswerTc                 C   s^   d | _ || _|| _|| _|| _|s|rtj || _t	|dr*t

 |j | _d S d| _d S )Nttlr   )responseqnamer3   r2   canonical_namer   r   NoAnswerrrsethasattrtimerQ   
expiration)selfrS   r3   r2   rV   raise_on_no_answerr    r    r%   __init__   s   

z_HostsAnswer.__init__N)T)__name__
__module____qualname__r\   r    r    r    r%   rP      s    rP   c                   @   sB   e Zd ZdZdefddZejjej	j
dddfddZd	d
 ZdS )_HostsResolverz'
    Class to parse the hosts file
    Nc                 C   s   t || _|| _d| _d S rA   )r   
hosts_fileinterval
_last_load)rZ   fnamerb   r    r    r%   r\      s   

z_HostsResolver.__init__FTc                 C   sF  t   }| j}| j| j |k r|| _|  tjj}t|t	r(|}	tj
|}nt|}	|	 }	tj|||}
| j| j | |
_|tjjkrQ|j}tjjjj}n+|tjjkra|j}tjjjj}n|tjjkro|j}dd }n|tjjkr||j}dd }||	}|s| r||	d d }|r|
|||| t||||
|S )Nc                 S      t jjj| |t j|S r'   )r   r   r   CNAMEr6   	from_textctaddrr    r    r%   r@          z&_HostsResolver.query.<locals>.<lambda>c                 S   re   r'   )r   r   r   r   r6   rg   rh   r    r    r%   r@      rl   )rX   ra   rc   rb   loadr   r*   r   
isinstancer   r6   rg   strlowerrV   RRsetrQ   r.   r   v4r   r   v6rf   aliasesr   reverser!   is_absoluteaddrP   )rZ   rS   r3   r2   tcpsourcer[   nowra   r6   rV   mappingkindrk   r    r    r%   query   s>   


z_HostsResolver.queryc                 C   s^   | j j}g }||v r|| }n|}|| t|D ]\}}||kr'|| q|| |S r'   )ra   ru   appendr   remove)rZ   hostnameru   resultcannonaliascnamer    r    r%   
getaliases	  s   



z_HostsResolver.getaliases)r]   r^   r_   __doc__	HOSTS_TTLr\   r   r.   r   r*   r   r~   r   r    r    r    r%   r`      s    
1r`   c                   @   sD   e Zd Zdd Zejjejjdddejjejj	ejj
ffddZdS )_DualResolverc                 C   s"   t  | _t | _t | j_d S r'   )r`   hosts_resolverr   get_default_resolvernetwork_resolverLRUCachecacherZ   r    r    r%   r\     s   
z_DualResolver.__init__FNTc           
      C   s   |d u rd}t |tst |tr|d}t |tr!tj|d }t |tr,tj|}|tjj	krb||v rbz| j
j||dd}W n ty\   ddlm}	 |	 j| gt R   Y nw |jrb|S | jj||||||dS )Nz0.0.0.0idnaF)r[   r   )get_hub)ro   r   bytesdecoder   r6   rg   r.   r*   r   r   r~   	Exceptiongeventr   handle_errorsysexc_inforV   r   )
rZ   rS   r3   r2   ry   rz   r[   _hosts_rdtypesanswerr   r    r    r%   r~   #  s*   




z_DualResolver.query)r]   r^   r_   r\   r   r.   r   r*   r   r   r   r~   r    r    r    r%   r     s    r   c                 C   s:   | t jkrtjj}|S | t jkrtjj}|S t t jd)NzAddress family not supported)	rB   r	   r   r.   r   r
   r   r   r   )rH   r3   r    r    r%   _family_to_rdtypeE  s   

r   c                   @   s~   e Zd ZdZdddZedd Zdd Zd	d
 Zdd Z	dd Z
dd ZeejZeejZeejZeejZdS )r   a   
    An *experimental* resolver that uses `dnspython`_.

    This is typically slower than the default threaded resolver
    (unless there's a cache hit, in which case it can be much faster).
    It is usually much faster than the c-ares resolver. It tends to
    scale well as more concurrent resolutions are attempted.

    Under Python 2, if the ``idna`` package is installed, this
    resolver can resolve Unicode host names that the system resolver
    cannot.

    .. note::

        This **does not** use dnspython's default resolver object, or share any
        classes with ``import dns``. A separate copy of the objects is imported to
        be able to function in a non monkey-patched process. The documentation for the resolver
        object still applies.

        The resolver that we use is available as the :attr:`resolver` attribute
        of this object (typically ``gevent.get_hub().resolver.resolver``).

    .. caution::

        Many of the same caveats about DNS results apply here as are documented
        for :class:`gevent.resolver.ares.Resolver`. In addition, the handling of
        symbolic scope IDs in IPv6 addresses passed to ``getaddrinfo`` exhibits
        some differences.

        On PyPy, ``getnameinfo`` can produce results when CPython raises
        ``socket.error``, and gevent's DNSPython resolver also
        raises ``socket.error``.

    .. caution::

        This resolver is experimental. It may be removed or modified in
        the future. As always, feedback is welcome.

    .. versionadded:: 1.3a2

    .. versionchanged:: 20.5.0
       The errors raised are now much more consistent with those
       raised by the standard library resolvers.

       Handling of localhost and broadcast names is now more consistent.

    .. _dnspython: http://www.dnspython.org
    Nc                 C   sZ   t jd u rt  }t _tjrtj|jjd d < tjrtj|j_t	t jts'J t j| _d S r'   )
r   	_resolverr   r   resolver_nameserversr   nameserversresolver_timeoutlifetimero   )rZ   hubr   r    r    r%   r\     s   

zResolver.__init__c                 C   s   | j jS )a  
        The dnspython resolver object we use.

        This object has several useful attributes that can be used to
        adjust the behaviour of the DNS system:

        * ``cache`` is a :class:`dns.resolver.LRUCache`. Its maximum size
          can be configured by calling :meth:`resolver.cache.set_max_size`
        * ``nameservers`` controls which nameservers to talk to
        * ``lifetime`` configures a timeout for each individual query.
        )r   r   r   r    r    r%   r     s   zResolver.resolverc                 C   r?   r'   r    r   r    r    r%   close  s   zResolver.closec              
   C   s   t |tst |tr|d}| jj|}| jj}t|}	 z|	|t
jj|}W n5 t
jjt
jjt
jjfy=   Y |S  tyF   Y |S  ty_ } z|d u sVt |trZt| d }~ww |dd |jD  |d j}q)Nr      c                 s   s    | ]}t |jV  qd S r'   )rp   target).0rrr    r    r%   	<genexpr>  s    z'Resolver._getaliases.<locals>.<genexpr>r   )ro   rp   r   r   r   r   r   r   r   r~   r   r.   rf   r   rU   NXDOMAINNoNameserversdTimeoutr,   int	TypeErrorextendrV   r   )rZ   r   rH   ru   net_resolverr3   ansexr    r    r%   _getaliases  s0   




zResolver._getaliasesc                 C   s   t |ts|| j}|dkrd}|tkrHz
t||||||W S  tyG   zt||t|||W  Y S  tyF   t||t||| Y  Y S w w z
t||||||W S  tyt } z|j	d t
kro|| jvrot| jf|_	t|_ d }~ww )Nzff02::1de:c0:face:8Dzff02::1de:c0:face:8dr   )ro   rp   r   HOSTNAME_ENCODINGr   rO   r   r
   r	   argsr   _KNOWN_ADDR_FAMILIESr   EAI_FAMILY_MSGerrno)rZ   
host_bytesportrH   rI   rJ   rK   r   r    r    r%   rO     s.   

zResolver._getaddrinfoc                 C   s8   zt ||W S  ty   |st |t Y S Y d S w r'   )r   _getnameinfor   r   )rZ   address_bytesr   sockaddrrK   r    r    r%   r     s   zResolver._getnameinfoc              
   C   s@   zt |W S  ty } z|jd tkrtdd d }~ww )Nr   r   zUnknown host)r   _gethostbyaddrr   r   r   r   )rZ   ip_address_bytesr   r    r    r%   r     s   
zResolver._gethostbyaddrr'   )r]   r^   r_   r   r\   propertyr   r   r   rO   r   r   r   fixup_gaierrorgetnameinfogethostbyaddrgethostbyname_exgetaddrinfor    r    r    r%   r   P  s    
1
+
)-
__future__r   r   r   r   rX   _socketr   r   r   r   r	   r
   r   r   r   rB   gevent.resolverr   gevent.resolver._hostsfiler   gevent.builtinsr   g_importgevent._compatr   r   gevent._configr   __all__r=   r   r   Timeoutr   rO   getattrr   AnswerrP   objectr`   r   r   r   r    r    r    r%   <module>   sJ   <7
N)