U
    J0[R!                     @   s~  d Z ddlmZmZ eZddlmZmZm	Z	m
Z
mZmZmZ ddlmZ ddlmZ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! ddl"m#Z# eeG dd de$Z%e&eegZ'e&egee&ege	e'e
iZ(eee	eiZ)eedZ*edediZ+eeG dd de$Z,eeG dd de$Z-eeG dd de$Z.eeG dd de$Z/dS )z=
IPv6-aware hostname resolution.

@see: L{IHostnameResolver}
    )divisionabsolute_import)getaddrinfoAF_INETAF_INET6	AF_UNSPECSOCK_STREAM
SOCK_DGRAMgaierror)implementer)IHostnameResolverIHostResolutionIResolverSimpleIResolutionReceiver)DNSLookupError)Deferred)deferToThreadPool)IPv4AddressIPv6Address)nativeString)
_idnaBytes)Loggerc                   @   s   e Zd ZdZdd ZdS )HostResolutionz9
    The in-progress resolution of a given hostname.
    c                 C   s
   || _ dS )zA
        Create a L{HostResolution} with the given name.
        N)name)selfr    r   </usr/lib/python3/dist-packages/twisted/internet/_resolver.py__init__%   s    zHostResolution.__init__N)__name__
__module____qualname____doc__r   r   r   r   r   r      s   r   )TCPUDPr"   r#   c                   @   s(   e Zd ZdZdefddZd	ddZdS )
GAIResolverzp
    L{IHostnameResolver} implementation that resolves hostnames by calling
    L{getaddrinfo} in a thread.
    Nc                 C   s$   || _ |dkr|jn|| _|| _dS )a  
        Create a L{GAIResolver}.

        @param reactor: the reactor to schedule result-delivery on
        @type reactor: L{IReactorThreads}

        @param getThreadPool: a function to retrieve the thread pool to use for
            scheduling name resolutions.  If not supplied, the use the given
            C{reactor}'s thread pool.
        @type getThreadPool: 0-argument callable returning a
            L{twisted.python.threadpool.ThreadPool}

        @param getaddrinfo: a reference to the L{getaddrinfo} to use - mainly
            parameterized for testing.
        @type getaddrinfo: callable with the same signature as L{getaddrinfo}
        N)_reactorgetThreadPool_getThreadPool_getaddrinfo)r   Zreactorr&   r   r   r   r   r   M   s
    zGAIResolver.__init__r   r"   c                    sr     }t|dkrtnt|  t|  fdd}tj||}t}	|	 |j	fdd}
|	S )<  
        See L{IHostnameResolver.resolveHostName}

        @param resolutionReceiver: see interface

        @param hostName: see interface

        @param portNumber: see interface

        @param addressTypes: see interface

        @param transportSemantics: see interface

        @return: see interface
        Nc                      s0   z  W S  tk
r*   g  Y S X d S N)r(   r
   r   )addressFamilyhostName
portNumberr   
socketTyper   r   gety   s    
z(GAIResolver.resolveHostName.<locals>.getc                    sD   | D ]2\}}}}}t | } |t|df|  q   d S Nr"   )	_afToTypeaddressResolved_socktypeToTyper/   resolutionComplete)resultZfamilyZsocktypeprotoZ	cannonameZsockaddrZaddrTyperesolutionReceiverr   r   deliverResults   s    z3GAIResolver.resolveHostName.<locals>.deliverResults)
r'   
_typesToAF_any	frozenset_transportToSocketr   r%   r   resolutionBeganaddCallback)r   r8   r,   r-   addressTypestransportSemanticsZpoolr/   d
resolutionr9   r   )r+   r,   r-   r8   r   r.   r   resolveHostNamed   s    
zGAIResolver.resolveHostName)r   Nr"   )r   r   r    r!   r   r   rD   r   r   r   r   r$   F   s       r$   c                   @   s(   e Zd ZdZe Zdd Zd	ddZdS )
SimpleResolverComplexifierzF
    A converter from L{IResolverSimple} to L{IHostnameResolver}.
    c                 C   s
   || _ dS )zW
        Construct a L{SimpleResolverComplexifier} with an L{IResolverSimple}.
        N)_simpleResolver)r   ZsimpleResolverr   r   r   r      s    z#SimpleResolverComplexifier.__init__r   Nr"   c                    s   z  d W n tk
r*   t  Y nX t  t }| j }fdd} fdd}	|||	 fdd}
|	|
 |S )r)   asciic                    s    td|   d S r0   )r2   r   )address)r-   r8   r   r   addressReceived   s    
zCSimpleResolverComplexifier.resolveHostName.<locals>.addressReceivedc                    s$   |  ts jjd|  jd d S )Nz'while looking up {name} with {resolver})r   Zresolver)Zcheckr   _logZfailurerF   )error)r,   r   r   r   errorReceived   s    
 zASimpleResolverComplexifier.resolveHostName.<locals>.errorReceivedc                    s       d S r*   )r4   )r5   r7   r   r   finish   s    z:SimpleResolverComplexifier.resolveHostName.<locals>.finish)
encodeUnicodeEncodeErrorr   r   r   r>   rF   getHostByNameZaddCallbacksr?   )r   r8   r,   r-   r@   rA   rC   Z	onAddressrI   rL   rM   r   )r,   r-   r8   r   r   rD      s    

z*SimpleResolverComplexifier.resolveHostName)r   Nr"   )r   r   r    r!   r   rJ   r   rD   r   r   r   r   rE      s       rE   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )FirstOneWinszT
    An L{IResolutionReceiver} which fires a L{Deferred} with its first result.
    c                 C   s   || _ d| _dS )zp
        @param deferred: The L{Deferred} to fire when the first resolution
            result arrives.
        FN)	_deferred	_resolved)r   Zdeferredr   r   r   r      s    zFirstOneWins.__init__c                 C   s
   || _ dS )z
        See L{IResolutionReceiver.resolutionBegan}

        @param resolution: See L{IResolutionReceiver.resolutionBegan}
        N)_resolution)r   rC   r   r   r   r>      s    zFirstOneWins.resolutionBeganc                 C   s"   | j r
dS d| _ | j|j dS )z
        See L{IResolutionReceiver.addressResolved}

        @param address: See L{IResolutionReceiver.addressResolved}
        NT)rS   rR   callbackZhost)r   rH   r   r   r   r2      s    zFirstOneWins.addressResolvedc                 C   s"   | j r
dS | jt| jj dS )z?
        See L{IResolutionReceiver.resolutionComplete}
        N)rS   rR   Zerrbackr   rT   r   )r   r   r   r   r4      s    zFirstOneWins.resolutionCompleteN)r   r   r    r!   r   r>   r2   r4   r   r   r   r   rQ      s
   		rQ   c                   @   s"   e Zd ZdZdd ZdddZdS )	ComplexResolverSimplifierzE
    A converter from L{IHostnameResolver} to L{IResolverSimple}
    c                 C   s
   || _ dS )z
        Create a L{ComplexResolverSimplifier} with an L{IHostnameResolver}.

        @param nameResolver: The L{IHostnameResolver} to use.
        N)_nameResolver)r   ZnameResolverr   r   r   r     s    z"ComplexResolverSimplifier.__init__r   c                 C   s"   t  }| jt||dtg |S )z
        See L{IResolverSimple.getHostByName}

        @param name: see L{IResolverSimple.getHostByName}

        @param timeouts: see L{IResolverSimple.getHostByName}

        @return: see L{IResolverSimple.getHostByName}
        r   )r   rW   rD   rQ   r   )r   r   Ztimeoutsr5   r   r   r   rP   
  s
    
z'ComplexResolverSimplifier.getHostByNameN)r   )r   r   r    r!   r   rP   r   r   r   r   rV      s   	rV   N)0r!   Z
__future__r   r   typeZ__metaclass__Zsocketr   r   r   r   r   r	   r
   Zzope.interfacer   Ztwisted.internet.interfacesr   r   r   r   Ztwisted.internet.errorr   Ztwisted.internet.deferr   Ztwisted.internet.threadsr   Ztwisted.internet.addressr   r   Ztwisted.python.compatr   Ztwisted.internet._idnar   Ztwisted.loggerr   objectr   r<   r;   r:   r1   r=   r3   r$   rE   rQ   rV   r   r   r   r   <module>   sV   $       G?-