
    \d                         d Z ddlmZ ddlmZmZ ddlmZmZm	Z	  G d d          Z
 eej                   G d dej                              Zd	S )
z
Lookup a name using multiple resolvers.

Future Plans: This needs someway to specify which resolver answered
the query, or someway to specify (authority|ttl|cache behavior|more?)
    )implementer)defer
interfaces)commondnserrorc                       e Zd Zd Zd ZdS )FailureHandlerc                 0    || _         || _        || _        d S N)resolverquerytimeout)selfr   r   r   s       5lib/python3.11/site-packages/twisted/names/resolve.py__init__zFailureHandler.__init__   s     
    c                     |                     t          j        t          j        t
                     |                     | j        | j                  S r   )	trapr   DomainErrorr   TimeoutErrorNotImplementedErrorr   r   r   )r   failures     r   __call__zFailureHandler.__call__   s6    S_e&8:MNNN}}TZ666r   N)__name__
__module____qualname__r   r    r   r   r
   r
      s2          
7 7 7 7 7r   r
   c                   &    e Zd ZdZd Zd ZddZdS )ResolverChainz8
    Lookup an address using multiple L{IResolver}s
    c                 R    t           j                            |            || _        dS )zi
        @type resolvers: L{list}
        @param resolvers: A L{list} of L{IResolver} providers.
        N)r   ResolverBaser   	resolvers)r   r#   s     r   r   zResolverChain.__init__%   s&    
 	$$T***"r   c                 B   | j         s%t          j        t          j                              S t          j        |||          }| j         d                             ||          }| j         dd         D ]+}|                    t          |j        ||                    },|S )aN  
        Build a L{dns.Query} for the given parameters and dispatch it
        to each L{IResolver} in C{self.resolvers} until an answer or
        L{error.AuthoritativeDomainError} is returned.

        @type name: C{str}
        @param name: DNS name to resolve.

        @type type: C{int}
        @param type: DNS record type.

        @type cls: C{int}
        @param cls: DNS record class.

        @type timeout: Sequence of C{int}
        @param timeout: Number of seconds after which to reissue the query.
            When the last timeout expires, the query is considered failed.

        @rtype: L{Deferred}
        @return: A L{Deferred} which fires with a three-tuple of lists of
            L{twisted.names.dns.RRHeader} instances.  The first element of the
            tuple gives answers.  The second element of the tuple gives
            authorities.  The third element of the tuple gives additional
            information.  The L{Deferred} may instead fail with one of the
            exceptions defined in L{twisted.names.error} or with
            C{NotImplementedError}.
        r      N)
r#   r   failr   r   r   Queryr   
addErrbackr
   )r   nameclstyper   qdrs           r   _lookupzResolverChain._lookup-   s    8 ~ 	3:e/11222IdD#&&N1##Aw//# 	B 	BA^AGQ@@AAAAr   Nc                    | j         s%t          j        t          j                              S | j         d                             ||          }| j         dd          D ]+}|                    t          |j        ||                    },|S )Nr   r%   )r#   r   r&   r   r   lookupAllRecordsr(   r
   )r   r)   r   r-   r.   s        r   r1   zResolverChain.lookupAllRecordsQ   s    
 ~ 	3:e/11222N1..tW==# 	P 	PA^A,>gNNOOAAr   r   )r   r   r   __doc__r   r/   r1   r   r   r   r    r       sQ         # # #" " "H
 
 
 
 
 
r   r    N)r2   zope.interfacer   twisted.internetr   r   twisted.namesr   r   r   r
   	IResolverr"   r    r   r   r   <module>r7      s   
  ' & & & & & . . . . . . . . , , , , , , , , , ,	7 	7 	7 	7 	7 	7 	7 	7 Z!""; ; ; ; ;F' ; ; #"; ; ;r   