
H/\c           @` sJ  d  d l  m Z m Z 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 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   Z e   Z d   Z e e j _ e j  Z  e j  j! Z" e# e d d    Z$ d d e d  d  d  d  Z& e& e  _& d Z' e j( j) d  Z* e* Z+ d   Z, d e- f d     YZ. d e j  j/ f d     YZ0 d e- f d     YZ1 d e- f d     YZ2 d    Z3 d e f d!     YZ4 d S("   i    (   t   absolute_importt   print_functiont   divisionN(   t   AI_NUMERICHOST(   t   error(   t   NI_NUMERICSERV(   t   AF_INET(   t   AF_INET6(   t	   AF_UNSPEC(   t   AbstractResolver(   t   hostname_types(   t   string_types(   t	   iteritems(   t   import_patched(   t   configt   Resolverc          C` s_   t  d  }  xL d D]D } t  |  } x/ | j D]$ } t | | t  | d |   q/ Wq W|  S(   Nt   dnss   dns.rdtypess   dns.rdtypes.INs   dns.rdtypes.ANYt   .(   R   s   dns.rdtypess   dns.rdtypes.INs   dns.rdtypes.ANY(   R   t   __all__t   setattr(   t   topt   pkgt   modt   name(    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyt
   _patch_dns\   s      
&c         C` s#   |  j  d  s t  t |   t S(   NR   (   t
   startswitht   AssertionErrorR   R   (   R   (    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyt   _dns_import_patchedi   s    
t	   exc_clearc           C` s   d  S(   N(   t   None(    (    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyt   <lambda>y   s    c         C` sG  | t  j t  j B@d k r# t  n  |  d  k rP | d  k rP t  j t  j   n  g  } g  } d  } y |  d  k r d } | t  j @d k r | j d  | j d  q| j d  | j d  nY |  j	 d  }	 t
 |	  d k r |	 d }
 n |  }
 t j j |
  } | j |   |  } Wnt k
 rt   y) t j j |   } | j |   |  } Wqt k
 rt   | t  j @d k ry*| t  j k s| t  j k rt j j |  t j j d	 t } | j }  | j j t  } | j d  k	 rx$ | j D] } | j | j  qWqn  | t  j  k s<| t  j k rt j j |  t j j! d	 t } | j }  | j j t  } | j d  k	 rx$ | j D] } | j | j  qWqn  Wqt j j" k
 rt   t  j t  j   qt k
 rt   t  j t  j#   qXqqXn Xd  } y% | d  k r7d } n t$ |  } Wn\ t k
 rt   | t  j% @d k ry t  j& |  } Wqt k
 rt   qXqn X| d  k rt  j t  j   n  g  } | d k rt  j' t  j( g } n	 | g } | t  j) @d k r| } n d
 } | t  j k s4| t  j k rxe | D]Z } xQ | D]I } x@ t j* | D]1 } | j t  j | | | | | d d f f  q\WqHWq;Wn  | t  j  k s| t  j k rx_ | D]T } xK | D]C } x: t j* | D]+ } | j t  j  | | | | | f f  qWqWqWn  t
 |  d k rCt  j t  j   n  | S(   Ni    t	   localhosts   ::s   0.0.0.0s   ::1s	   127.0.0.1t   %i   t   raise_on_no_answert    (+   t   sockett   AI_ADDRCONFIGt   AI_V4MAPPEDt   NotImplementedErrorR   t   gaierrort
   EAI_NONAMEt
   AI_PASSIVEt   appendt   splitt   lenR   t   ipv6t	   inet_atont	   Exceptiont
   _exc_cleart   ipv4R   R   R   t   resolvert	   _resolvert   queryt	   rdatatypet   AAAAt   Falset   qnamet   canonical_namet   to_textt   Truet   rrsett   addressR   t   At   NXDOMAINt
   EAI_SYSTEMt   intt   AI_NUMERICSERVt   getservbynamet
   SOCK_DGRAMt   SOCK_STREAMt   AI_CANONNAMEt   _protocols_for_socktype(   t   hostt   servicet   familyt   socktypet   protot   flagst   v6addrst   v4addrsR9   t   partst   ahostt   addrt   v6t   rdatat   v4t   portt   tuplest	   socktypest   cname(    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyt   _getaddrinfo   s    	

				!			("g     r@c         C` s\   |  s
 t  St |  t  s+ t t |     y | |   Wn t j j k
 rS t  SXt Sd  S(   N(	   R7   t
   isinstanceR
   R   t   reprR   t	   exceptiont   SyntaxErrorR;   (   RH   t   parse(    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyt   _is_addr   s    !c         C` sM   |  r: t  |  t  r d n d } |  j | d  d }  n  t |  t j j  S(   NR    i   i    (   R[   t   strR+   R`   R   R-   R.   (   RH   t   s(    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyt   _is_ipv6_addr  s    t	   HostsFilec           B` sJ   e  Z d  Z e j d e j  Z d d  Z d   Z	 d   Z
 d   Z RS(   sD   
    A class to read the contents of a hosts file (/etc/hosts).
    s   
        \s*  # Leading space
        ([^\r\n#]+?)  # The actual match, non-greedy so as not to include trailing space
        \s*  # Trailing space
        (?:[#][^\r\n]+)?  # Comments
        (?:$|[\r\n]+)  # EOF or newline
    c         C` s   i  |  _  i  |  _ i  |  _ i  |  _ | d  k ro t j d k rH d } qo t j d k ro t j j d  } qo n  | |  _	 |  j	 s t
  d |  _ d  S(   Nt   posixs
   /etc/hostst   nts'   %SystemRoot%\system32\drivers\etc\hostsi    (   RU   RS   t   aliasest   reverseR   t   osR   t   patht
   expandvarst   fnameR   t
   _last_load(   t   selfRl   (    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyt   __init__  s    							c         C` s^   t  |  j d   } | j   } Wd  QXt | t  sH | j d d  n | } |  j j |  S(   Nt   rbt   errorst   ignore(   t   openRl   t   readR[   Ra   t   decodet   LINES_REt   findall(   Rn   t   fpt   fdatat   udata(    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyt
   _readlines%  s    'c         C` s  y( t  j |  j  j } | |  j k } WnF t t f k
 rp d d l m } |   j	 |  t
 j    t } n X| s{ d  Si  } i  } i  } i  } x-|  j   D]} | j   }	 t |	  d k  r q n  |	 j d  }
 t |
  r | } n- t |
  r |
 j d  rq n  | } n q |	 j d  j   } |
 | | <x. |	 D]& } | j   } |
 | | <| | | <qAW| | k rd j t |
 j d    d } n
 |
 d } | | k r | | | <q q W| |  _ | |  _ | |  _ | |  _ | |  _ d  S(   Ni    (   t   get_hubi   t   fe80R   s   .in-addr.arpas
   .ip6.arpa.(   Ri   t   statRl   t   st_mtimeRm   t   IOErrort   OSErrort   geventR|   t   handle_errort   syst   exc_infoR7   R{   R+   R,   t   popt   _is_ipv4_addrRc   R   t   lowert   joint   reversedRU   RS   Rg   Rh   (   Rn   t	   load_timet
   needs_loadR|   RU   RS   Rg   Rh   t   lineRP   t   ipt   ipmapRY   t   aliast   ptr(    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyt   load4  sR    
		

%
				c         c` sd   |  j    x( t |  j  D] \ } } | | f Vq Wx( t |  j  D] \ } } | | f VqE Wd  S(   N(   R   R   RU   RS   (   Rn   R   RR   (    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyt   iter_all_host_addr_pairsm  s
    
N(   t   __name__t
   __module__t   __doc__t   ret   compilet   VERBOSERv   R   Ro   R{   R   R   (    (    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyRd     s   		9t   _HostsAnswerc           B` s   e  Z e d   Z RS(   c         C` s   d  |  _ | |  _ | |  _ | |  _ | |  _ | rL | rL t j j    n  | |  _	 t
 | d  rw t j   | j n d |  _ d  S(   Nt   ttli    (   R   t   responseR8   t   rdtypet   rdclassR9   R   R2   t   NoAnswerR<   t   hasattrt   timeR   t
   expiration(   Rn   R8   R   R   R<   R!   (    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyRo   w  s    						(   R   R   R;   Ro   (    (    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyR   t  s   t   _HostsResolverc           B` sJ   e  Z d  Z d e d  Z e j j e j	 j
 e d e d  Z d   Z RS(   s'   
    Class to parse the hosts file
    c         C` s%   t  |  |  _ | |  _ d |  _ d  S(   Ni    (   Rd   t
   hosts_filet   intervalRm   (   Rn   Rl   R   (    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyRo     s    	c         C` s  t  j    } |  j } |  j |  j | k  rA | |  _ | j   n  t j j } t | t	  rw | }	 t j
 j |  } n t |  }	 |	 j   }	 t j j | | |  }
 |  j |  j | |
 _ | t j j k r | j } t j j j j } n~ | t j j k r| j } t j j j j } nN | t j j k rE| j } d   } n' | t j j k rl| j } d   } n  | j |	  } | r| j   r| j |	 d   } n  | r|
 j | | | |   n  t | | | |
 |  S(   Nc         S` s(   t  j j j j |  | t  j j |   S(   N(   R   t   rdtypest   ANYt   CNAMER   t	   from_text(   t   ct   tRR   (    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyR     s    c         S` s(   t  j j j j |  | t  j j |   S(   N(   R   R   R   t   PTRR   R   (   R   R   RR   (    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyR     s    i(   R   R   Rm   R   R   R   t
   rdataclasst   INR[   R   R   R   Ra   R   R<   t   RRsetR   R5   R>   RU   R   R6   RS   R   Rg   R   Rh   t   gett   is_absolutet   addR   (   Rn   R8   R   R   t   tcpt   sourceR!   t   nowR   R   R<   t   mappingt   kindRR   (    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyR4     s>    						c         C` s   |  j  j } g  } | | k r+ | | } n | } | j |  x6 t |  D]( \ } } | | k rK | j |  qK qK W| j |  | S(   N(   R   Rg   R*   R   t   remove(   Rn   t   hostnameRg   t   resultt   cannonR   RY   (    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyt
   getaliases  s    N(   R   R   R   R   t	   HOSTS_TTLRo   R   R5   R>   R   R   R7   R;   R4   R   (    (    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyR     s
   0t   _DualResolverc           B` sS   e  Z d    Z e j j e j j e d e
 e j j e j j e j j f d  Z RS(   c         C` s1   t    |  _ t j   |  _ t j   |  j _ d  S(   N(   R   t   hosts_resolverR2   t   get_default_resolvert   network_resolvert   LRUCachet   cache(   Rn   (    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyRo     s    c   
      C` s?  | d  k r d } n  t | t  sH t | t  rH | j d  } qH n  t | t  ro t j j | d   } n  t | t  r t j j |  } n  | t j	 j
 k r| | k ry |  j j | | d t } Wn: t k
 rd d l m }	 |	   j |  t j    qX| j r| Sn  |  j j | | | | | d | S(   Ns   0.0.0.0t   idnaR!   i    (   R|   (   R   R[   R   t   bytesRu   R   R   R   R5   R   R   R   R4   R7   R/   R   R|   R   R   R   R<   R   (
   Rn   R8   R   R   R   R   R!   t   _hosts_rdtypest   answerR|   (    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyR4     s&    		N(   R   R   Ro   R   R5   R>   R   R   R7   R   R;   R6   R   R4   (    (    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyR     s   		c         C` sU   |  t  j k r t j j } n3 |  t  j k r< t j j } n t  j t  j d   | S(   Ns   Address family not supported(	   R#   R   R   R5   R>   R   R6   R'   t
   EAI_FAMILY(   RJ   R   (    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyt   _family_to_rdtype  s    	c           B` sb   e  Z d  Z d	 d  Z e d    Z d   Z d   Z d d d d d  Z	 d   Z
 d   Z RS(
   s  
    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`.

    .. caution::

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

    .. versionadded:: 1.3a2

    .. _dnspython: http://www.dnspython.org
    c         C` s   t  j d  k rY t   } t  _ t j r; t j | j j (n  t j rY t j | j _	 qY n  t
 t  j t  sq t  t  j |  _ d  S(   N(   R2   R3   R   R   R   t   resolver_nameserversR   t   nameserverst   resolver_timeoutt   lifetimeR[   R   (   Rn   t   hubR3   (    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyRo   +  s    		c         C` s
   |  j  j S(   s  
        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.
        (   R3   R   (   Rn   (    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyR2   7  s    c         C` s   d  S(   N(    (   Rn   (    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyt   closeF  s    c         C` s   t  | t  s3 t  | t  r3 | j d  } q3 n  |  j j j |  } |  j j } t |  } x t	 r y | j
 | t j j |  } Wn> t j j t j j t j j f k
 r Pqc t k
 r Pqc X| j d   | j D  | d j } qc W| S(   NR   c         s` s   |  ] } t  | j  Vq d  S(   N(   Ra   t   target(   t   .0t   rr(    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pys	   <genexpr>X  s    i    (   R[   Ra   R   Ru   R3   R   R   R   R   R;   R4   R   R5   R   R2   R   R?   t   NoNameserverst   dTimeoutt   extendR<   R   (   Rn   R   RJ   Rg   t   net_resolverR   t   ans(    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyt   _getaliasesI  s     	(i    c         C` s  | d k sA t  |  r' | j d  sA t | t  sA | t @r] t j | | | | | |  S| t k r y t | | | | | |  SWqt	 j
 k
 r y t | | t | | |  SWq t	 j
 k
 r t | | t | | |  SXqXn t | | | | | |  Sd  S(   Nu	   localhostR   R}   (   u	   localhostR   (   Rc   R   R[   Ra   R   t   _sockett   getaddrinfoR   RZ   R#   R'   R   R   (   Rn   RH   RV   RJ   RK   RL   RM   (    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyR   \  s    
!c         C` s   | r; t  | t t f  r; | d d k r; t j | |  St  | t t f  rs t  | d t  rs t d   n  y t j | |  SWn' t	 k
 r | s t j | t
  Sn Xd  S(   Ni    s   ::1s	   127.0.0.1R   s(   getnameinfo(): illegal sockaddr argument(   s   ::1s	   127.0.0.1R   (   R[   t   listt   tupleR   t   getnameinfoR
   t	   TypeErrorR2   t   _getnameinfoR   R   (   Rn   t   sockaddrRM   (    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyR   }  s    )c         C` sQ   | d k r t  j |  St | t  sD t d t |  f   n  t j |  S(   Nu	   127.0.0.1u   ::1s	   127.0.0.1s   ::1R   s2   argument 1 must be str, bytes or bytearray, not %s(   u	   127.0.0.1u   ::1s	   127.0.0.1s   ::1R   (   R   t   gethostbyaddrR[   R
   R   t   typeR2   t   _gethostbyaddr(   Rn   t
   ip_address(    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyR     s     	N(   R   R   R   R   Ro   t   propertyR2   R   R   R   R   R   (    (    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyR     s   $		!	(5   t
   __future__R    R   R   R   R   Ri   R   R   R   R   R   R   R   R   R#   t   gevent.resolverR	   R
   t   gevent._compatR   R   t   gevent._patcherR   t   gevent._configR   R   R   R   R   RT   t
   __import__R2   t   TimeoutR   t   getattrR0   R   RZ   R   R1   R.   R`   R   Rc   t   objectRd   t   AnswerR   R   R   R   R   (    (    (    s8   lib/python2.7/site-packages/gevent/resolver/dnspython.pyt   <module>=   sN   					m		lN)	
