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)