Ë
    ojÕ%  ã                   ód  — 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«      «       Z/ e0eeg«      Z1 e0e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      Z8 ee"«       G d„ d«      «       Z9 ee"«       G d„ d«      «       Z: ee%«       G d„ d«      «       Z; ee&«       G d„ d«      «       Z<y)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                   ó(   — e Zd ZdZdefd„Zdefd„Zy)ÚHostResolutionz9
    The in-progress resolution of a given hostname.
    Únamec                 ó   — || _         y)zA
        Create a L{HostResolution} with the given name.
        N)r'   )Úselfr'   s     ú</usr/lib/python3/dist-packages/twisted/internet/_resolver.pyÚ__init__zHostResolution.__init__?   s   € ð ˆ�	ó    Úreturnc                 ó   — t        «       ‚©N)ÚNotImplementedError©r)   s    r*   ÚcancelzHostResolution.cancelE   s   € ä!Ó#Ð#r,   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústrr+   r   r2   © r,   r*   r&   r&   9   s   „ ñð˜Só ð$˜ô $r,   r&   )ÚTCPÚUDPr9   r:   c                   ó†   — e Zd ZdZdefdedeeg df      deee	e	e	ge
f   fd„Z	 	 	 dded	ed
e	deeee         dedefd„Zy)ÚGAIResolverzp
    L{IHostnameResolver} implementation that resolves hostnames by calling
    L{getaddrinfo} in a thread.
    NÚreactorÚgetThreadPoolr$   r   c                 óJ   — || _         |€|j                  n|| _        || _        y)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)   r=   r>   r   s       r*   r+   zGAIResolver.__init__t   s-   € ð,  ˆŒà%2Ð%:ˆG×!Ò!Àð 	Ôð (ˆÕr,   ÚresolutionReceiverÚhostNameÚ
portNumberÚaddressTypesÚtransportSemanticsr-   c                 ó8  ‡ ‡‡‡‡‡— ‰ j                  «       }t        |€t        n
t        |«         Št        |   Šdt
        fˆˆˆˆ ˆfd„}t        ‰ j                  ||«      }t        ‰«      }	‰j                  |	«       |j                  dt
        ddfˆf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                  óP   •— 	 ‰j                  ‰‰‰ ‰«      S # t        $ r g cY S w xY wr/   )rB   r
   )ÚaddressFamilyrD   rE   r)   Ú
socketTypes   €€€€€r*   Úgetz(GAIResolver.resolveHostName.<locals>.get­   s:   ø€ ðØ×(Ñ(Ø˜j¨-¸óð øô ò Ø’	ðús   ƒ —%¤%Úresultc           	      óª   •— | D ]=  \  }}}}}t         |   }‰j                   |t        j                  |d«      g|¢­Ž «       Œ? ‰j	                  «        y ©Nr9   )Ú	_afToTypeÚaddressResolvedÚ_socktypeToTyperM   ÚresolutionComplete)rN   ÚfamilyÚsocktypeÚprotoÚ	cannonameÚsockaddrÚaddrTyperC   s          €r*   ÚdeliverResultsz3GAIResolver.resolveHostName.<locals>.deliverResults¹   s]   ø€ à@Fò Ñ<�˜ %¨°HÜ$ VÑ,�Ø"×2Ñ2Ùœ_×0Ñ0°¸5ÓAÐMÀHÒMõðð
 ×1Ñ1Õ3r,   )rA   Ú
_typesToAFÚ_anyÚ	frozensetÚ_transportToSocketÚ_GETADDRINFO_RESULTr!   r@   r&   ÚresolutionBeganÚaddCallback)r)   rC   rD   rE   rF   rG   ÚpoolrM   ÚdÚ
resolutionr[   rK   rL   s   ````       @@r*   ÚresolveHostNamezGAIResolver.resolveHostName�   s¤   ý€ ð. ×"Ñ"Ó$ˆÜ"Ø Ð(�D¬i¸Ó.Eñ
ˆô (Ð(:Ñ;ˆ
ð	Ô(÷ 	ñ 	ô ˜dŸm™m¨T°3Ó7ˆÜ# HÓ-ˆ
Ø×*Ñ*¨:Ô6à	
�‰ð	4Ô#6ð 	4¸4ô 	4ó 
ð	4ð Ðr,   ©r   Nr9   )r3   r4   r5   r6   r   r   r   r   r7   Úintr`   r+   r   r   r   r   r   rf   r8   r,   r*   r<   r<   m   s­   „ ñð ?CØKVñ	(à ð(ð   ¨¨\Ð)9Ñ :Ñ;ð(ð ˜s C¨¨cÐ2Ð4GÐGÑHó	(ð@ Ø;?Ø"'ñ2à/ð2ð ð2ð ð	2ð
 ˜x¨¨X©Ñ7Ñ8ð2ð  ð2ð 
ô2r,   r<   c                   ód   — e Zd ZdZ e«       Zdefd„Z	 	 	 ddede	de
deeee         d	e	d
efd„Zy)ÚSimpleResolverComplexifierzF
    A converter from L{IResolverSimple} to L{IHostnameResolver}.
    ÚsimpleResolverc                 ó   — || _         y)zW
        Construct a L{SimpleResolverComplexifier} with an L{IResolverSimple}.
        N)Ú_simpleResolver)r)   rk   s     r*   r+   z#SimpleResolverComplexifier.__init__Í   s   € ð  .ˆÕr,   NrC   rD   rE   rF   rG   r-   c                 óZ  ‡ ‡‡‡— 	 ‰j                  d«      }t        |«      Št	        ‰«      }‰j                  |«       ‰ j                  j                  ‰«      j                  ˆˆfd„«      j                  ˆˆ fd„«      j                  ˆfd„«       |S # t        $ r t        ‰«      }Y Œ’w xY w)rI   Úasciic                 ó<   •— ‰j                  t        d| ‰«      «      S rP   )rR   r   )ÚaddressrE   rC   s    €€r*   ú<lambda>z<SimpleResolverComplexifier.resolveHostName.<locals>.<lambda>ü   s   ø€ Ð 2× BÑ BÜ  w°
Ó;ó!€ r,   c                 ó„   •— | j                  t        «      rd S ‰j                  j                  d| ‰‰j                  ¬«      S )Nz'while looking up {name} with {resolver})r'   Úresolver)Úcheckr   Ú_logÚfailurerm   )ÚerrorrD   r)   s    €€r*   rr   z<SimpleResolverComplexifier.resolveHostName.<locals>.<lambda>  sD   ø€ Ø—;‘;œ~Ô.ð #€ à—Y‘Y×&Ñ&Ø=ØØ!Ø!×1Ñ1ð	 'ó ð r,   c                 ó$   •— ‰j                  «       S r/   )rT   )ÚnothingrC   s    €r*   rr   z<SimpleResolverComplexifier.resolveHostName.<locals>.<lambda>
  s   ø€ Ð);×)NÑ)NÓ)P€ r,   )
ÚencodeÚUnicodeEncodeErrorr   r#   r&   ra   rm   ÚgetHostByNamerb   Ú
addErrback)r)   rC   rD   rE   rF   rG   ÚhostName_bytesre   s   ````    r*   rf   z*SimpleResolverComplexifier.resolveHostNameÓ   sž   û€ ð0	2Ø%Ÿ_™_¨WÓ5ˆNô   Ó/ˆä# HÓ-ˆ
Ø×*Ñ*¨:Ô6à× Ñ ×.Ñ.¨xÓ8ß‰[ôó÷
 ‰Zôó	÷ ‰[ÓPÔQàÐøô? "ò 	2ô
 (¨Ó1ŠNð	2ús   †B ÂB*Â)B*rg   )r3   r4   r5   r6   r"   rv   r    r+   r   r7   rh   r   r   r   r   r   rf   r8   r,   r*   rj   rj   Å   st   „ ññ ‹8€Dð. ó .ð Ø;?Ø"'ñ9à/ð9ð ð9ð ð	9ð
 ˜x¨¨X©Ñ7Ñ8ð9ð  ð9ð 
ô9r,   rj   c                   ó@   — e Zd ZdZd
d„Zdeddfd„Zdeddfd„Zdd	„Z	y)ÚFirstOneWinszT
    An L{IResolutionReceiver} which fires a L{Deferred} with its first result.
    c                 ó    — || _         d| _        y)zp
        @param deferred: The L{Deferred} to fire when the first resolution
            result arrives.
        FN)Ú	_deferredÚ	_resolved)r)   Údeferreds     r*   r+   zFirstOneWins.__init__  s   € ð
 "ˆŒØˆ�r,   re   r-   Nc                 ó   — || _         y)zƒ
        See L{IResolutionReceiver.resolutionBegan}

        @param resolution: See L{IResolutionReceiver.resolutionBegan}
        N)Ú_resolution)r)   re   s     r*   ra   zFirstOneWins.resolutionBegan  s   € ð &ˆÕr,   rq   c                 óš   — | j                   ryd| _         t        |t        «      sJ ‚| j                  j	                  |j
                  «       y)z€
        See L{IResolutionReceiver.addressResolved}

        @param address: See L{IResolutionReceiver.addressResolved}
        NT)r„   Ú
isinstancer   rƒ   ÚcallbackÚhost)r)   rq   s     r*   rR   zFirstOneWins.addressResolved%  s=   € ð �>Š>ØØˆŒô ˜'¤;Ô/Ð/Ð/Ø�‰×Ñ §¡Õ-r,   c                 óŽ   — | j                   ry| j                  j                  t        | j                  j
                  «      «       y)z?
        See L{IResolutionReceiver.resolutionComplete}
        N)r„   rƒ   Úerrbackr   r‡   r'   r1   s    r*   rT   zFirstOneWins.resolutionComplete3  s1   € ð �>Š>ØØ�‰×Ñœ~¨d×.>Ñ.>×.CÑ.CÓDÕEr,   )r…   úDeferred[str])r-   N)
r3   r4   r5   r6   r+   r   ra   r   rR   rT   r8   r,   r*   r�   r�     s8   „ ñóð&¨/ð &¸dó &ð. xð .°Dó .ôFr,   r�   c                   ó8   — e Zd ZdZdefd„Zd
dedee   ddfd„Z	y	)ÚComplexResolverSimplifierzE
    A converter from L{IHostnameResolver} to L{IResolverSimple}
    ÚnameResolverc                 ó   — || _         y)z”
        Create a L{ComplexResolverSimplifier} with an L{IHostnameResolver}.

        @param nameResolver: The L{IHostnameResolver} to use.
        N)Ú_nameResolver)r)   r‘   s     r*   r+   z"ComplexResolverSimplifier.__init__B  s   € ð *ˆÕr,   r'   Útimeoutsr-   rŽ   c                 ór   — t        «       }| j                  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   r“   rf   r�   r   )r)   r'   r”   rN   s       r*   r}   z'ComplexResolverSimplifier.getHostByNameJ  s1   € ô #+£*ˆØ×Ñ×*Ñ*¬<¸Ó+?ÀÀqÌ;È-ÔXØˆr,   N)r8   )
r3   r4   r5   r6   r   r+   r7   r   rh   r}   r8   r,   r*   r�   r�   <  s2   „ ñð*Ð%6ó *ñ #ð °¸#±ð Èô r,   r�   N)=r6   Úsocketr   r   r   r   r   r   r	   r
   r   Útypingr   r   r   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   r   r    Útwisted.internet.threadsr!   Útwisted.loggerr"   Útwisted.python.compatr#   Útwisted.python.threadpoolr$   r&   r^   r]   r\   rQ   r_   rS   rh   r7   r`   r<   rj   r�   r�   r8   r,   r*   ú<module>r¢      s¯  ðñ
÷
÷ 
õ 
÷
÷ 
õ 
õ 'å -ß =Ý +Ý 1÷÷ õ 7Ý !Ý .áÝ4ñ ˆ_Ó÷$ð $ó ð$ñ  �+˜{Ð+Ó,€ñ ˆ{ˆmÓ˜gÙˆ{ˆmÓ˜hØˆ)ð€
ð ˆ[Øˆkð€	ð ØñÐ ð �Ø�ð€ð Ø	ØØØØØˆe�C˜�H‰o˜u S¨#¨s°CÐ%7Ñ8Ð8Ñ9ð		;ññÐ ñ ÐÓ÷Tð Tó  ðTñn ÐÓ÷Fð Fó  ðFñR Ð Ó!÷)Fð )Fó "ð)FñX ˆ_Ó÷ð ó ñr,   