o
    b!                     @   s`  d 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 ddlmZmZ ddl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 e
eG dd d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Z&e
eG dd dZ'e
eG dd dZ(e
eG dd dZ)dS )z=
IPv6-aware hostname resolution.

@see: L{IHostnameResolver}
    )AF_INETAF_INET6	AF_UNSPEC
SOCK_DGRAMSOCK_STREAMgaierrorgetaddrinfo)implementer)
_idnaBytes)IPv4AddressIPv6Address)Deferred)DNSLookupError)IHostnameResolverIHostResolutionIResolutionReceiverIResolverSimple)deferToThreadPool)Logger)nativeStringc                   @   s    e Zd ZdZdd Zdd ZdS )HostResolutionz9
    The in-progress resolution of a given hostname.
    c                 C   
   || _ 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__-      
zHostResolution.__init__c                 C   s   t  N)NotImplementedErrorr   r   r   r   cancel3   s   zHostResolution.cancelN)__name__
__module____qualname____doc__r   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u 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   reactorr*   r   r   r   r   r   W   s   
zGAIResolver.__init__r   r&   c                    sr     }t|du 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                      s*   z	  W S  ty   g  Y S w r   )r,   r   r   )addressFamilyhostName
portNumberr   
socketTyper   r   get   s   z(GAIResolver.resolveHostName.<locals>.getc                    sF   | D ]\}}}}}t | } |t|dg|R   q   d S Nr&   )	_afToTypeaddressResolved_socktypeToTyper3   resolutionComplete)resultfamilysocktypeproto	cannonamesockaddraddrTyperesolutionReceiverr   r   deliverResults   s   z3GAIResolver.resolveHostName.<locals>.deliverResults)
r+   
_typesToAF_any	frozenset_transportToSocketr   r)   r   resolutionBeganaddCallback)r   rA   r0   r1   addressTypestransportSemanticspoolr3   d
resolutionrB   r   )r/   r0   r1   rA   r   r2   r   resolveHostNamen   s   
zGAIResolver.resolveHostNamer   Nr&   )r"   r#   r$   r%   r   r   rN   r   r   r   r   r(   P   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   r   )zW
        Construct a L{SimpleResolverComplexifier} with an L{IResolverSimple}.
        N)_simpleResolver)r   simpleResolverr   r   r   r      r   z#SimpleResolverComplexifier.__init__r   Nr&   c                    s   z  d W n ty   t  Y nw t  t }| j }fdd} fdd}	|||	 fdd}
|	|
 |S )r.   asciic                    s    td|   d S r4   )r6   r   )address)r1   rA   r   r   addressReceived   s   zCSimpleResolverComplexifier.resolveHostName.<locals>.addressReceivedc                    s(   |  tsjjd|  jd d S d S )Nz'while looking up {name} with {resolver})r   resolver)checkr   _logfailurerQ   )error)r0   r   r   r   errorReceived   s   

zASimpleResolverComplexifier.resolveHostName.<locals>.errorReceivedc                    s       d S r   )r8   )r9   r@   r   r   finish   s   z:SimpleResolverComplexifier.resolveHostName.<locals>.finish)
encodeUnicodeEncodeErrorr
   r   r   rG   rQ   getHostByNameaddCallbacksrH   )r   rA   r0   r1   rI   rJ   rM   	onAddressrU   r[   r\   r   )r0   r1   rA   r   r   rN      s   
	
z*SimpleResolverComplexifier.resolveHostNamerO   )r"   r#   r$   r%   r   rX   r   rN   r   r   r   r   rP      s    
rP   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   deferredr   r   r   r      s   
zFirstOneWins.__init__c                 C   r   )z
        See L{IResolutionReceiver.resolutionBegan}

        @param resolution: See L{IResolutionReceiver.resolutionBegan}
        N)_resolution)r   rM   r   r   r   rG         
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)rd   rc   callbackhost)r   rT   r   r   r   r6     s   zFirstOneWins.addressResolvedc                 C   s"   | j rdS | jt| jj dS )z?
        See L{IResolutionReceiver.resolutionComplete}
        N)rd   rc   errbackr   rf   r   r    r   r   r   r8     s   zFirstOneWins.resolutionCompleteN)r"   r#   r$   r%   r   rG   r6   r8   r   r   r   r   rb      s    rb   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   r   )z
        Create a L{ComplexResolverSimplifier} with an L{IHostnameResolver}.

        @param nameResolver: The L{IHostnameResolver} to use.
        N)_nameResolver)r   nameResolverr   r   r   r     rg   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   rl   rN   rb   r   )r   r   timeoutsr9   r   r   r   r_   &  s   
z'ComplexResolverSimplifier.getHostByNameN)r   )r"   r#   r$   r%   r   r_   r   r   r   r   rk     s    rk   N)*r%   socketr   r   r   r   r   r   r   zope.interfacer	   twisted.internet._idnar
   twisted.internet.addressr   r   twisted.internet.deferr   twisted.internet.errorr   twisted.internet.interfacesr   r   r   r   twisted.internet.threadsr   twisted.loggerr   twisted.python.compatr   r   rE   rD   rC   r5   rF   r7   r(   rP   rb   rk   r   r   r   r   <module>   sF   $


RJ)