
    \d!                     J   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                      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                      Z& e
e           G d d                      Z' e
e           G d d                      Z( e
e           G 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                       e Zd ZdZd Zd ZdS )HostResolutionz9
    The in-progress resolution of a given hostname.
    c                     || _         dS )zA
        Create a L{HostResolution} with the given name.
        N)name)selfr   s     :lib/python3.11/site-packages/twisted/internet/_resolver.py__init__zHostResolution.__init__-   s     			    c                     t                      N)NotImplementedErrorr   s    r   cancelzHostResolution.cancel3   s    !###r   N)__name__
__module____qualname____doc__r   r#    r   r   r   r   '   s<           $ $ $ $ $r   r   )TCPUDPr)   r*   c                   ,    e Zd ZdZdefdZ	 	 	 ddZdS )GAIResolverzp
    L{IHostnameResolver} implementation that resolves hostnames by calling
    L{getaddrinfo} in a thread.
    Nc                 B    || _         ||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	   s       r   r   zGAIResolver.__init__W   s3    "  %2%:G!! 	 (r   r   r)   c                 D                                      }t          |t          nt          |                   t          |          fd}t           j        ||          }t                    }	                    |	           |j	        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
        Nc                  Z    	                                 S # t          $ r g cY S w xY wr    )r1   r   )addressFamilyhostName
portNumberr   
socketTypes   r   getz(GAIResolver.resolveHostName.<locals>.get   sO    ((j-      			s    **c           	          | D ]J\  }}}}}t           |         }                     |t                              |d          g|R             K                                 d S Nr)   )	_afToTypeaddressResolved_socktypeToTyper:   resolutionComplete)resultfamilysocktypeproto	cannonamesockaddraddrTyperesolutionReceivers          r   deliverResultsz3GAIResolver.resolveHostName.<locals>.deliverResults   s    @F  <%H$V,"22H_005AAMHMMM    1133333r   )
r0   
_typesToAF_any	frozenset_transportToSocketr   r.   r   resolutionBeganaddCallback)r   rH   r7   r8   addressTypestransportSemanticspoolr:   d
resolutionrI   r6   r9   s   ````       @@r   resolveHostNamezGAIResolver.resolveHostNamen   s    . ""$$" (DDi.E.E
 ((:;
	 	 	 	 	 	 	 	 	 dmT377#H--
**:666	
	4 	4 	4 	4 
	4 r   r   Nr)   )r$   r%   r&   r'   r	   r   rU   r(   r   r   r,   r,   P   sX         
 /3 ( ( ( (6  2 2 2 2 2 2r   r,   c                   :    e Zd ZdZ e            Zd Z	 	 	 ddZdS )SimpleResolverComplexifierzF
    A converter from L{IResolverSimple} to L{IHostnameResolver}.
    c                     || _         dS )zW
        Construct a L{SimpleResolverComplexifier} with an L{IResolverSimple}.
        N)_simpleResolver)r   simpleResolvers     r   r   z#SimpleResolverComplexifier.__init__   s      .r   r   Nr)   c                     	                      d          n# t          $ r t                    Y nw xY wt                    t	                    }                    |            j                                      }fd} fd}	|                    ||	           fd}
|	                    |
           |S )r4   asciic                 P                         t          d|                      d S r<   )r>   r   )addressr8   rH   s    r   addressReceivedzCSimpleResolverComplexifier.resolveHostName.<locals>.addressReceived   s)    ..{5':/V/VWWWWWr   c                     |                      t                    s%j                            d| j                   d S d S )Nz'while looking up {name} with {resolver})r   resolver)checkr   _logfailurerZ   )errorr7   r   s    r   errorReceivedzASimpleResolverComplexifier.resolveHostName.<locals>.errorReceived   sY    ;;~.. 	!!=!!1	 "      r   c                 0                                      d S r    )r@   )rA   rH   s    r   finishz:SimpleResolverComplexifier.resolveHostName.<locals>.finish   s    1133333r   )
encodeUnicodeEncodeErrorr   r   r   rN   rZ   getHostByNameaddCallbacksrO   )r   rH   r7   r8   rP   rQ   rT   	onAddressr`   rg   ri   s   ````       r   rU   z*SimpleResolverComplexifier.resolveHostName   s!   0	,w//HH! 	, 	, 	,
 "(++HHH	,  ))#H--
**:666(66x@@		X 	X 	X 	X 	X 	X	 	 	 	 	 	 	>>>	4 	4 	4 	4 	4 	f%%%s    88rV   )r$   r%   r&   r'   r   rd   r   rU   r(   r   r   rX   rX      sY          688D. . .  : : : : : :r   rX   c                   *    e Zd ZdZd Zd Zd Zd ZdS )FirstOneWinszT
    An L{IResolutionReceiver} which fires a L{Deferred} with its first result.
    c                 "    || _         d| _        dS )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   c                     || _         dS )z
        See L{IResolutionReceiver.resolutionBegan}

        @param resolution: See L{IResolutionReceiver.resolutionBegan}
        N)_resolution)r   rT   s     r   rN   zFirstOneWins.resolutionBegan   s     &r   c                 d    | j         rdS d| _         | j                            |j                   dS )z
        See L{IResolutionReceiver.addressResolved}

        @param address: See L{IResolutionReceiver.addressResolved}
        NT)rs   rr   callbackhost)r   r_   s     r   r>   zFirstOneWins.addressResolved  s8     > 	F-----r   c                 z    | j         rdS | j                            t          | j        j                             dS )z?
        See L{IResolutionReceiver.resolutionComplete}
        N)rs   rr   errbackr   rv   r   r"   s    r   r@   zFirstOneWins.resolutionComplete  s=     > 	F~d.>.CDDEEEEEr   N)r$   r%   r&   r'   r   rN   r>   r@   r(   r   r   rp   rp      s_           & & &	. 	. 	.F F F F Fr   rp   c                        e Zd ZdZd ZddZdS )ComplexResolverSimplifierzE
    A converter from L{IHostnameResolver} to L{IResolverSimple}
    c                     || _         dS )z
        Create a L{ComplexResolverSimplifier} with an L{IHostnameResolver}.

        @param nameResolver: The L{IHostnameResolver} to use.
        N)_nameResolver)r   nameResolvers     r   r   z"ComplexResolverSimplifier.__init__  s     *r   r(   c                     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   r   rU   rp   r   )r   r   timeoutsrA   s       r   rl   z'ComplexResolverSimplifier.getHostByName&  s9     **<+?+?q;-XXXr   N)r(   )r$   r%   r&   r'   r   rl   r(   r   r   r}   r}     sA         * * *     r   r}   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   rL   rK   rJ   r=   rM   r?   r,   rX   rp   r}   r(   r   r   <module>r      s#  
                   ' & & & & & - - - - - - = = = = = = = = + + + + + + 1 1 1 1 1 1            7 6 6 6 6 6 ! ! ! ! ! ! . . . . . . _$ $ $ $ $ $ $ $  y+{+,, I{mgI{mh)
 [k	     O O O O O O O  Od G G G G G G G  GT  !!&F &F &F &F &F &F &F "!&FR _         r   