
    Ng                    n   U d dl mZ d dlmZmZ d dlmZ d dlmZm	Z	 d dl
mZmZmZmZmZ d dlmZmZ d dlmZ erd dlmZ d d	lmZ d d
lmZ d dlmZ  ed      Zded<    ee       G d de	             Z ee       G d d             Z  ee       G d d             Z! ee       G d d             Z"y)    )annotations)TYPE_CHECKINGAny)defer)ReactorBaseThreadedResolver)IAddressIHostnameResolverIHostResolutionIResolutionReceiverIResolverSimple)implementerprovider)
LocalCache)Sequence)Deferred)Self)Crawleri'  zLocalCache[str, Any]dnscachec                  T     e Zd ZdZd fdZedd       Zd	dZd
d fdZddZ	 xZ
S )CachingThreadedResolverza
    Default caching resolver. IPv4 only, supports setting a timeout value for DNS requests.
    c                H    t         |   |       |t        _        || _        y N)super__init__r   limittimeout)selfreactor
cache_sizer   	__class__s       /lib/python3.12/site-packages/scrapy/resolver.pyr   z CachingThreadedResolver.__init__&   s    !#    c                    |j                   j                  d      r|j                   j                  d      }nd} | |||j                   j                  d            S )NDNSCACHE_ENABLEDDNSCACHE_SIZEr   DNS_TIMEOUT)settingsgetboolgetintgetfloatclscrawlerr   r    s       r"   from_crawlerz$CachingThreadedResolver.from_crawler+   sR    ##$67 ))00AJJ7J(8(8(A(A-(PQQr#   c                :    | j                   j                  |        y r   )r   installResolverr   s    r"   install_on_reactorz*CachingThreadedResolver.install_on_reactor3   s    $$T*r#   c                    |t         v rt        j                  t         |         S | j                  f}t        |   ||      }t         j                  r|j                  | j                  |       |S r   )	r   r   succeedr   r   getHostByNamer   addCallback_cache_result)r   namer   dr!   s       r"   r6   z%CachingThreadedResolver.getHostByName6   s\    8==$00 <</G!$0>>MM$,,d3r#   c                    |t         |<   |S r   )r   )r   resultr9   s      r"   r8   z%CachingThreadedResolver._cache_resultD   s    r#   )r   r   r    intr   floatr.   r   r   r   returnr   r@   None) )r9   strr   zSequence[int]r@   zDeferred[str])r<   r   r9   rD   r@   r   )__name__
__module____qualname____doc__r   classmethodr/   r3   r6   r8   __classcell__)r!   s   @r"   r   r       s2    
 R R+r#   r   c                      e Zd ZddZddZy)HostResolutionc                    || _         y r   )r9   )r   r9   s     r"   r   zHostResolution.__init__K   s	    	r#   c                    t               r   )NotImplementedErrorr2   s    r"   cancelzHostResolution.cancelN   s    !##r#   N)r9   rD   rA   )rE   rF   rG   r   rP   rC   r#   r"   rL   rL   I   s    $r#   rL   c                  ,    e Zd ZddZddZddZd	dZy)
_CachingResolutionReceiverc                .    || _         || _        g | _        y r   )resolutionReceiverhostName	addresses)r   rT   rU   s      r"   r   z#_CachingResolutionReceiver.__init__T   s    7I%)+r#   c                H    | j                   j                  |       || _        y r   )rT   resolutionBegan
resolution)r   rY   s     r"   rX   z*_CachingResolutionReceiver.resolutionBeganY   s    //
;$r#   c                p    | j                   j                  |       | j                  j                  |       y r   )rT   addressResolvedrV   append)r   addresss     r"   r[   z*_CachingResolutionReceiver.addressResolved]   s(    //8g&r#   c                    | j                   j                          | j                  r| j                  t        | j                  <   y y r   )rT   resolutionCompleterV   r   rU   r2   s    r"   r_   z-_CachingResolutionReceiver.resolutionCompletea   s2    224>>&*nnHT]]# r#   N)rT   r   rU   rD   )rY   r   r@   rB   )r]   r	   r@   rB   rA   )rE   rF   rG   r   rX   r[   r_   rC   r#   r"   rR   rR   R   s    ,
%'5r#   rR   c                  X    e Zd ZdZddZedd       Zd	dZ	 	 	 d
	 	 	 	 	 	 	 	 	 	 	 ddZy)CachingHostnameResolverz
    Experimental caching resolver. Resolves IPv4 and IPv6 addresses,
    does not support setting a timeout value for DNS requests.
    c                J    || _         |j                  | _        |t        _        y r   )r   nameResolveroriginal_resolverr   r   )r   r   r    s      r"   r   z CachingHostnameResolver.__init__n   s    $+4;4H4H#r#   c                    |j                   j                  d      r|j                   j                  d      }nd} | ||      S )Nr%   r&   r   )r(   r)   r*   r,   s       r"   r/   z$CachingHostnameResolver.from_crawlers   s?    ##$67 ))00AJJ7J''r#   c                :    | j                   j                  |        y r   )r   installNameResolverr2   s    r"   r3   z*CachingHostnameResolver.install_on_reactor{   s    ((.r#   Nc                   	 t         |   }|j                  t        |             |D ]  }|j                  |        |j                          |S # t        $ r, | j                  j                  t	        ||      ||||      cY S w xY wr   )	r   KeyErrorrd   resolveHostNamerR   rX   rL   r[   r_   )r   rT   rU   
portNumberaddressTypestransportSemanticsrV   addrs           r"   rj   z'CachingHostnameResolver.resolveHostName~   s    		 *I 	**>(+CDD..t4 --/!!  	))99*+=xH" 	s   	A 2BB)r   r   r    r=   r?   rA   )r   NTCP)rT   r   rU   rD   rk   r=   rl   zSequence[type[IAddress]] | Nonerm   rD   r@   r   )	rE   rF   rG   rH   r   rI   r/   r3   rj   rC   r#   r"   ra   ra   g   so    
$
 ( (/ 8<"'"/" " 	"
 6"  " 
"r#   ra   N)#
__future__r   typingr   r   twisted.internetr   twisted.internet.baser   r   twisted.internet.interfacesr	   r
   r   r   r   zope.interface.declarationsr   r   scrapy.utils.datatypesr   collections.abcr   twisted.internet.deferr   typing_extensionsr   scrapy.crawlerr   r   __annotations__r   rL   rR   ra   rC   r#   r"   <module>r|      s    " % " ?  > -(/ '& ",E!2
 2 _%. % %P _$ $ $ 

5 5 5( ," ,"  ,"r#   