U
    ¸~HjÕ%  ã                   @   sÞ  d Z ddlmZmZmZmZmZmZmZm	Z	m
Z
 ddlmZmZ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$m%Z%m&Z& dd
l'm(Z( ddl)m*Z* ddl+m,Z, erðddl-m.Z. ee#ƒG dd„ dƒƒZ/e0eegƒZ1e0egƒee0egƒee1eiZ2eeeeiZ3eedœZ4edediZ5eeeee6e7eee7e6f ee7e6e6e6f f f  Z8ee"ƒG dd„ dƒƒZ9e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ÚAddressFamilyÚ
SocketKindÚgaierrorÚgetaddrinfo)	ÚTYPE_CHECKINGÚCallableÚListÚNoReturnÚOptionalÚSequenceÚTupleÚTypeÚUnion)Úimplementer)Ú
_idnaBytes)ÚIPv4AddressÚIPv6Address)ÚDeferred)ÚDNSLookupError)ÚIAddressÚIHostnameResolverÚIHostResolutionÚIReactorThreadsÚIResolutionReceiverÚIResolverSimple)ÚdeferToThreadPool)ÚLogger)ÚnativeString)Ú
ThreadPoolc                   @   s,   e Zd ZdZedœdd„Zedœdd„ZdS )	ÚHostResolutionz9
    The in-progress resolution of a given hostname.
    ©Únamec                 C   s
   || _ dS )zA
        Create a L{HostResolution} with the given name.
        Nr%   )Úselfr&   © r(   ú>/tmp/pip-unpacked-wheel-ewod1tgb/twisted/internet/_resolver.pyÚ__init__?   s    zHostResolution.__init__©Úreturnc                 C   s
   t ƒ ‚d S ©N)ÚNotImplementedError©r'   r(   r(   r)   ÚcancelE   s    zHostResolution.cancelN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústrr*   r   r0   r(   r(   r(   r)   r$   9   s   r$   )ÚTCPÚUDPr6   r7   c                   @   sj   e Zd ZdZdefeeeg df  eee	e	e	ge
f dœdd„Zdeee	eeee   eed	œd
d„ZdS )ÚGAIResolverzp
    L{IHostnameResolver} implementation that resolves hostnames by calling
    L{getaddrinfo} in a thread.
    Nr#   )ÚreactorÚgetThreadPoolr
   c                 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)Ú_reactorr:   Ú_getThreadPoolÚ_getaddrinfo)r'   r9   r:   r
   r(   r(   r)   r*   t   s    ÿzGAIResolver.__init__r   r6   ©ÚresolutionReceiverÚhostNameÚ
portNumberÚaddressTypesÚtransportSemanticsr,   c                    s€   ˆ  ¡ }t|dkrtnt|ƒ ‰ t| ‰tdœ‡ ‡‡‡‡fdd„}tˆj||ƒ}tˆƒ}	ˆ 	|	¡ |j
tddœ‡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
        Nr+   c                      s0   zˆ  ˆˆˆ ˆ¡W S  tk
r*   g  Y S X d S r-   )r=   r	   r(   )ÚaddressFamilyr@   rA   r'   Ú
socketTyper(   r)   Úget­   s       ÿz(GAIResolver.resolveHostName.<locals>.get)Úresultr,   c                    sD   | D ]2\}}}}}t | }ˆ  |t |d¡f|žŽ ¡ qˆ  ¡  d S ©Nr6   )Ú	_afToTypeÚaddressResolvedÚ_socktypeToTyperG   ÚresolutionComplete)rH   ÚfamilyÚsocktypeÚprotoZ	cannonameZsockaddrZaddrType©r?   r(   r)   ÚdeliverResults¹   s    ÿz3GAIResolver.resolveHostName.<locals>.deliverResults)r<   Ú
_typesToAFÚ_anyÚ	frozensetÚ_transportToSocketÚ_GETADDRINFO_RESULTr    r;   r$   ÚresolutionBeganÚaddCallback)r'   r?   r@   rA   rB   rC   ÚpoolrG   ÚdÚ
resolutionrR   r(   )rE   r@   rA   r?   r'   rF   r)   ÚresolveHostName�   s    ÿ
zGAIResolver.resolveHostName)r   Nr6   )r1   r2   r3   r4   r
   r   r   r   r5   ÚintrW   r*   r   r   r   r   r   r]   r(   r(   r(   r)   r8   m   s&   üü    úùr8   c                   @   sJ   e Zd ZdZeƒ Zedœdd„Zdee	e
eeee   e	edœd	d
„ZdS )ÚSimpleResolverComplexifierzF
    A converter from L{IResolverSimple} to L{IHostnameResolver}.
    )ÚsimpleResolverc                 C   s
   || _ dS )zW
        Construct a L{SimpleResolverComplexifier} with an L{IResolverSimple}.
        N)Ú_simpleResolver)r'   r`   r(   r(   r)   r*   Í   s    z#SimpleResolverComplexifier.__init__r   Nr6   r>   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 )rD   Úasciic                    s   ˆ  td| ˆ ƒ¡S rI   )rK   r   )Úaddress)rA   r?   r(   r)   Ú<lambda>ü   s   
ÿz<SimpleResolverComplexifier.resolveHostName.<locals>.<lambda>c                    s$   |   t¡rd S ˆjjd| ˆ ˆjd�S )Nz'while looking up {name} with {resolver})r&   Úresolver)Úcheckr   Ú_logZfailurera   )Úerror)r@   r'   r(   r)   rd     s    ÿüc                    s   ˆ   ¡ S r-   )rM   )ZnothingrQ   r(   r)   rd   
  ó    )
ÚencodeÚUnicodeEncodeErrorr   r"   r$   rX   ra   ÚgetHostByNamerY   Z
addErrback)r'   r?   r@   rA   rB   rC   ZhostName_bytesr\   r(   )r@   rA   r?   r'   r)   r]   Ó   s     
þù
ðÿz*SimpleResolverComplexifier.resolveHostName)r   Nr6   )r1   r2   r3   r4   r!   rg   r   r*   r   r5   r^   r   r   r   r   r   r]   r(   r(   r(   r)   r_   Å   s   
   úùr_   c                   @   sL   e Zd ZdZddœdd„Zeddœdd	„Zedd
œdd„Zddœdd„Z	dS )ÚFirstOneWinszT
    An L{IResolutionReceiver} which fires a L{Deferred} with its first result.
    úDeferred[str])Údeferredc                 C   s   || _ d| _dS )zp
        @param deferred: The L{Deferred} to fire when the first resolution
            result arrives.
        FN)Ú	_deferredÚ	_resolved)r'   ro   r(   r(   r)   r*     s    zFirstOneWins.__init__N)r\   r,   c                 C   s
   || _ dS )zƒ
        See L{IResolutionReceiver.resolutionBegan}

        @param resolution: See L{IResolutionReceiver.resolutionBegan}
        N)Ú_resolution)r'   r\   r(   r(   r)   rX     s    zFirstOneWins.resolutionBegan)rc   r,   c                 C   s0   | j r
dS d| _ t|tƒst‚| j |j¡ dS )z€
        See L{IResolutionReceiver.addressResolved}

        @param address: See L{IResolutionReceiver.addressResolved}
        NT)rq   Ú
isinstancer   ÚAssertionErrorrp   ÚcallbackÚhost)r'   rc   r(   r(   r)   rK   %  s
    zFirstOneWins.addressResolvedr+   c                 C   s"   | j r
dS | j t| jjƒ¡ dS )z?
        See L{IResolutionReceiver.resolutionComplete}
        N)rq   rp   Zerrbackr   rr   r&   r/   r(   r(   r)   rM   3  s    zFirstOneWins.resolutionComplete)
r1   r2   r3   r4   r*   r   rX   r   rK   rM   r(   r(   r(   r)   rm     s
   rm   c                   @   s6   e Zd ZdZedœdd„Zdeee ddœdd	„Z	d
S )ÚComplexResolverSimplifierzE
    A converter from L{IHostnameResolver} to L{IResolverSimple}
    )ÚnameResolverc                 C   s
   || _ dS )z”
        Create a L{ComplexResolverSimplifier} with an L{IHostnameResolver}.

        @param nameResolver: The L{IHostnameResolver} to use.
        N)Ú_nameResolver)r'   rx   r(   r(   r)   r*   B  s    z"ComplexResolverSimplifier.__init__r(   rn   )r&   Útimeoutsr,   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   ry   r]   rm   r   )r'   r&   rz   rH   r(   r(   r)   rl   J  s    
z'ComplexResolverSimplifier.getHostByNameN)r(   )
r1   r2   r3   r4   r   r*   r5   r   r^   rl   r(   r(   r(   r)   rw   <  s   rw   N)=r4   Úsocketr   r   r   r   r   r   r   r	   r
   Útypingr   r   r   r   r   r   r   r   r   Zzope.interfacer   Ztwisted.internet._idnar   Ztwisted.internet.addressr   r   Ztwisted.internet.deferr   Ztwisted.internet.errorr   Ztwisted.internet.interfacesr   r   r   r   r   r   Ztwisted.internet.threadsr    Ztwisted.loggerr!   Ztwisted.python.compatr"   Ztwisted.python.threadpoolr#   r$   rU   rT   rS   rJ   rV   rL   r^   r5   rW   r8   r_   rm   rw   r(   r(   r(   r)   Ú<module>   sl   ,,    ý  þþ  þüÿÿWI,