o
    Òó·iÕ%  ã                   @   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rxd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defdd„Zdefdd„ZdS )	ÚHostResolutionz9
    The in-progress resolution of a given hostname.
    Únamec                 C   ó
   || _ dS )zA
        Create a L{HostResolution} with the given name.
        N)r%   )Úselfr%   © r(   ú`C:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\twisted/internet/_resolver.pyÚ__init__?   ó   
zHostResolution.__init__Úreturnc                 C   s   t ƒ ‚©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                   @   s~   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d„Z				
ddedede	deeee   dedefdd„ZdS )ÚGAIResolverzp
    L{IHostnameResolver} implementation that resolves hostnames by calling
    L{getaddrinfo} in a thread.
    NÚreactorÚgetThreadPoolr#   r
   c                 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)Ú_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u rtnt|ƒ ‰ t| ‰dtf‡ ‡‡‡‡fdd„}tˆj||ƒ}tˆƒ}	ˆ 	|	¡ |j
dtddf‡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                      s*   z	ˆ  ˆˆˆ ˆ¡W S  ty   g  Y S w r-   )r=   r	   r(   )ÚaddressFamilyr?   r@   r'   Ú
socketTyper(   r)   Úget­   s   ÿÿz(GAIResolver.resolveHostName.<locals>.getÚresultc                    sF   | D ]\}}}}}t | }ˆ  |t |d¡g|¢R Ž ¡ qˆ  ¡  d S ©Nr6   )Ú	_afToTypeÚaddressResolvedÚ_socktypeToTyperF   ÚresolutionComplete)rG   ÚfamilyÚsocktypeÚprotoZ	cannonameÚ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?   r@   rA   rB   ÚpoolrF   ÚdÚ
resolutionrR   r(   )rD   r?   r@   r>   r'   rE   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   s6    üþý
ü úþýüûúùr8   c                   @   sZ   e Zd ZdZeƒ Zdefdd„Z			dded	e	d
e
deeee   de	defdd„ZdS )ÚSimpleResolverComplexifierzF
    A converter from L{IResolverSimple} to L{IHostnameResolver}.
    ÚsimpleResolverc                 C   r&   )zW
        Construct a L{SimpleResolverComplexifier} with an L{IResolverSimple}.
        N)Ú_simpleResolver)r'   ra   r(   r(   r)   r*   Í   r+   z#SimpleResolverComplexifier.__init__r   Nr6   r>   r?   r@   rA   rB   r,   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 )rC   Úasciic                    s   ˆ  td| ˆ ƒ¡S rH   )rJ   r   )Úaddress)r@   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failurerb   )Úerror)r?   r'   r(   r)   re     s   ÿüc                    s   ˆ   ¡ S r-   )rL   )ZnothingrQ   r(   r)   re   
  s    N)
ÚencodeÚUnicodeEncodeErrorr   r"   r$   rX   rb   ÚgetHostByNamerY   Z
addErrback)r'   r>   r?   r@   rA   rB   ZhostName_bytesr\   r(   )r?   r@   r>   r'   r)   r]   Ó   s"   û

ÿÿ
z*SimpleResolverComplexifier.resolveHostNamer^   )r1   r2   r3   r4   r!   rh   r   r*   r   r5   r_   r   r   r   r   r   r]   r(   r(   r(   r)   r`   Å   s(    
úþýüûúùr`   c                   @   sH   e Zd ZdZddd„Zdeddfd	d
„Zdeddfdd„Zddd„Z	dS )ÚFirstOneWinszT
    An L{IResolutionReceiver} which fires a L{Deferred} with its first result.
    ÚdeferredúDeferred[str]c                 C   s   || _ d| _dS )zp
        @param deferred: The L{Deferred} to fire when the first resolution
            result arrives.
        FN)Ú	_deferredÚ	_resolved)r'   rn   r(   r(   r)   r*     s   
zFirstOneWins.__init__r\   r,   Nc                 C   r&   )zƒ
        See L{IResolutionReceiver.resolutionBegan}

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

        @param address: See L{IResolutionReceiver.addressResolved}
        NT)rq   Ú
isinstancer   rp   ÚcallbackÚhost)r'   rd   r(   r(   r)   rJ   %  s
   zFirstOneWins.addressResolvedc                 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)   rL   3  s   zFirstOneWins.resolutionComplete)rn   ro   )r,   N)
r1   r2   r3   r4   r*   r   rX   r   rJ   rL   r(   r(   r(   r)   rm     s    
rm   c                   @   s:   e Zd ZdZdefdd„Zddedee dd	fd
d„Z	dS )ÚComplexResolverSimplifierzE
    A converter from L{IHostnameResolver} to L{IResolverSimple}
    ÚnameResolverc                 C   r&   )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  rs   z"ComplexResolverSimplifier.__init__r(   r%   Útimeoutsr,   ro   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   N)r   ry   r]   rm   r   )r'   r%   rz   rG   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   rI   rV   rK   r_   r5   rW   r8   r`   rm   rw   r(   r(   r(   r)   Ú<module>   s`   ,, 

ýþþþüÿÿWI,