
    h(T                       S r SSKJr  SSKrSSKrSSKJr  SSKJrJ	r	  SSK
JrJrJr  SSKJr  SSKJrJrJrJrJrJrJrJrJrJrJr  SS	KJrJr  SS
KJ r   SSK!J"r"J#r#  SSK$J%r%J&r&  SSK'J(r(J)r)J*r*J+r+J,r,  \RZ                  " S5      r. SSK/J0r1  \1r0 SSK
J3r4  \4r3\&S:H  r5Sr6\5(       a
  SSK
J7r7J8r8  Sr6\%Rr                  " 5       (       a   SSK:r:Sr6 " S S5      r;\	" \\\5       " S S\;\5      5       r< " S S5      r=\	" \5       " S S\=\;5      5       r>\0c  \3b	  \" \<\5        \5(       a
  \" \<\\5        \6(       a	  \" \<\5        \?" \SS5      b	  \" \<\5        S/r@g! \2 a    Sr0 Nf = f! \2 a    Sr3 Nf = f! \2 a    Sr: Nf = f)z
Posix reactor base class
    )annotationsN)Sequence)classImplementsimplementer)errortcpudp)ReactorBase)
IConnectorIHalfCloseableDescriptorIReactorFDSetIReactorMulticastIReactorProcessIReactorSocketIReactorSSLIReactorTCPIReactorUDPIReactorUNIXIReactorUNIXDatagram)CONNECTION_DONECONNECTION_LOST)ClientFactory)failurelog)platformplatformType   )SignalHandling_ChildSignalHandling_IWaker_MultiSignalHandling_WakerzFile descriptor lost)tls)sslposixF)processunixTc                      \ rS rSrSr\R                  \R                  " \R                  " 5       5      \R                  \R                  " \R                  " 5       5      04S jr
Srg)_DisconnectSelectableMixinP   z6
Mixin providing the C{_disconnectSelectable} method.
c                   U R                  U5        UR                  UR                  5      nU(       au  U(       aK  UR                  [        R                  :X  a-  [
        R                  " U5      (       a  UR                  U5        gU R                  U5        UR                  U5        gU R                  U5        UR                  [        R                  " U5      5        g)z
Utility function for disconnecting a selectable.

Supports half-close notification, isRead should be boolean indicating
whether error resulted from doRead().
N)removeReaderget	__class__r   ConnectionDoner   
providedByreadConnectionLostremoveWriterconnectionLostr   Failure)self
selectablewhyisReadfaildictfs         a/root/1688_scrapy/alibaba-scraper/venv/lib/python3.13/site-packages/twisted/internet/posixbase.py_disconnectSelectable0_DisconnectSelectableMixin._disconnectSelectableU   s      	*%LL'MMU%9%99,77
CC--a0!!*-))!,j)%%gooc&:;     N)__name__
__module____qualname____firstlineno____doc__r   r/   r   r4   ConnectionLostr<   __static_attributes__r?   r>   r;   r)   r)   P   sM       '//%2F2F2H"I  '//%2F2F2H"I
<r>   r)   c                    ^  \ rS rSr% SrSrSS jrS rSU 4S jjrS0 SSSSS4S	 jr	SS
 jr
 SS jrSS jrS S jrS!S jr S"S jr\(       a)  \R$                  \R&                  \R(                  4rS\S'   O\R$                  \R&                  4rS rS r S#S jrS$S jr  S%           S&S jjr S'S jrS$S jrS rSrU =r $ )(PosixReactorBasev   z
A basis for reactors that use file descriptors.

@ivar _childWaker: L{None} or a reference to the L{_SIGCHLDWaker}
    which is used to properly notice child process termination.
Nc                    [        5       $ N)r"   r5   s    r;   _wakerFactoryPosixReactorBase._wakerFactory   s	    xr>   c                    U R                   (       dV  U R                  5       U l         U R                  R                  U R                   5        U R	                  U R                   5        gg)z
Install a `waker' to allow threads and signals to wake up the IO thread.

We use the self-pipe trick (http://cr.yp.to/docs/selfpipe.html) to wake
the reactor. On Windows we use a pair of sockets.
N)wakerrM   _internalReadersadd	addReaderrL   s    r;   installWakerPosixReactorBase.installWaker   sH     zz++-DJ!!%%djj1NN4::& r>   c                   > [         TU ]  5       n[        S:X  a+  [        U[	        U R
                  U R                  5      45      $ U$ )zR
Customize reactor signal handling to support child processes on POSIX
platforms.
r%   )super_signalsFactoryr   r!   r   _addInternalReader_removeInternalReader)r5   baseHandlingr.   s     r;   rX    PosixReactorBase._signalsFactory   sS    
 w.07"' !(//22	
 
 r>   r?   r   c
                   [         S:X  aM  U(       a(  U	b  [        S5      e[        R                  " XX4XQXgU5	      $ [        R                  " U UUUUUUUU	5	      $ [         S:X  af  Ub  [        S5      eUb  [        S5      eU(       a  [        S5      eU	(       a  [        S5      e[
        (       a  SS	KJn
  U
" XX#XE5      $ [        S
5      e[        S5      e)Nr%   z1Using childFDs is not supported with usePTY=True.win32z,Setting UID is unsupported on this platform.z,Setting GID is unsupported on this platform.z1The usePTY parameter is not supported on Windows.z1Customizing childFDs is not supported on Windows.r   )Processz:spawnProcess not available since pywin32 is not installed.z0spawnProcess only available on Windows or POSIX.)r   
ValueErrorr&   
PTYProcessr_   win32processtwisted.internet._dumbwin32procNotImplementedError)r5   processProtocol
executableargsenvpathuidgidusePTYchildFDsr_   s              r;   spawnProcessPosixReactorBase.spawnProcess   s     7"'$K  ))dRX  #
 
 W$ !OPP !OPP !TUU !TUU|CtjRR)P  &B r>   c                V    [         R                  " XX4U 5      nUR                  5         U$ )zwConnects a given L{DatagramProtocol} to the given numeric UDP port.

@returns: object conforming to L{IListeningPort}.
)r	   PortstartListening)r5   portprotocol	interfacemaxPacketSizeps         r;   	listenUDPPosixReactorBase.listenUDP   s'    
 HHTYtD	r>   c                V    [         R                  " XX4X5      nUR                  5         U$ )zConnects a given DatagramProtocol to the given numeric UDP port.

EXPERIMENTAL.

@returns: object conforming to IListeningPort.
)r	   MulticastPortrr   )r5   rs   rt   ru   rv   listenMultiplerw   s          r;   listenMulticast PosixReactorBase.listenMulticast   s.     Id
 	
r>   c                z    [         (       d   S5       e[        R                  " XX0U5      nUR                  5         U$ NUNIX support is not present)unixEnabledr'   	Connectorconnect)r5   addressfactorytimeoutcheckPIDcs         r;   connectUNIXPosixReactorBase.connectUNIX  s2    {999{NN7WHE			r>   c                z    [         (       d   S5       e[        R                  " XX4X5      nUR                  5         U$ r   )r   r'   rq   rr   )r5   r   r   backlogmodewantPIDrw   s          r;   
listenUNIXPosixReactorBase.listenUNIX  s5    {999{IIgtE	r>   c                z    [         (       d   S5       e[        R                  " XX4U 5      nUR                  5         U$ )z{
Connects a given L{DatagramProtocol} to the given path.

EXPERIMENTAL.

@returns: object conforming to L{IListeningPort}.
r   )r   r'   DatagramPortrr   )r5   r   rt   rv   r   rw   s         r;   listenUNIXDatagram#PosixReactorBase.listenUNIXDatagram  s9     {999{gdK	r>   c                z    [         (       d   S5       e[        R                  " XX4XP5      nUR                  5         U$ )zL
Connects a L{ConnectedDatagramProtocol} instance to a path.

EXPERIMENTAL.
r   )r   r'   ConnectedDatagramPortrr   )r5   r   rt   rv   r   bindAddressrw   s          r;   connectUNIXDatagram$PosixReactorBase.connectUNIXDatagram  s>     {999{&&}K
 	
r>   zSequence[socket.AddressFamily]_supportedAddressFamiliesc                0   X R                   ;  a  [        R                  " U5      e[        (       a5  U[        R
                  :X  a!  [        R                  R                  XU5      nO [        R                  R                  XX#5      nUR                  5         U$ )a  
Create a new L{IListeningPort} from an already-initialized socket.

This just dispatches to a suitable port implementation (eg from
L{IReactorTCP}, etc) based on the specified C{addressFamily}.

@see: L{twisted.internet.interfaces.IReactorSocket.adoptStreamPort}
)r   r   UnsupportedAddressFamilyr   socketAF_UNIXr'   rq   _fromListeningDescriptorr   rr   )r5   fileDescriptoraddressFamilyr   rw   s        r;   adoptStreamPort PosixReactorBase.adoptStreamPort:  ss      > >>00??;=FNN:		224QA11mA 	
r>   c                
   X R                   ;  a  [        R                  " U5      e[        (       a4  U[        R
                  :X  a   [        R                  R                  XU 5      $ [        R                  R                  XX05      $ )zO
@see:
    L{twisted.internet.interfaces.IReactorSocket.adoptStreamConnection}
)
r   r   r   r   r   r   r'   Server_fromConnectedSocketr   )r5   r   r   r   s       r;   adoptStreamConnection&PosixReactorBase.adoptStreamConnectionO  sd    
  > >>00??;=FNN:;;33NTRR::22w r>   c                    U[         R                  [         R                  4;  a  [        R                  " U5      e[
        R                  R                  XX#US9nUR                  5         U$ )N)rv   )	r   AF_INETAF_INET6r   r   r	   rq   r   rr   )r5   r   r   rt   rv   rw   s         r;   adoptDatagramPort"PosixReactorBase.adoptDatagramPort^  s]      AA00??HH--- . 
 	
r>   c                V    [         R                  " XX4U 5      nUR                  5         U$ rK   )r   rq   rr   )r5   rs   r   r   ru   rw   s         r;   	listenTCPPosixReactorBase.listenTCPl  s%    HHTG=	r>   c                V    [         R                  " XX4XP5      nUR                  5         U$ rK   )r   r   r   )r5   hostrs   r   r   r   r   s          r;   
connectTCPPosixReactorBase.connectTCPq  s$     MM$gJ			r>   c           	         [         b*  [         R                  USU5      nU R                  XXuU5      $ [        b*  [        R	                  XX4XVU 5      nUR                  5         U$  S5       e)NTSSL support is not present)r#   TLSMemoryBIOFactoryr   r$   r   r   )	r5   r   rs   r   contextFactoryr   r   
tlsFactoryr   s	            r;   
connectSSLPosixReactorBase.connectSSL  sg     ?00wOJ??4zKPP_GW4A IIKH6665r>   c                    [         b2  [         R                  USU5      nU R                  XXE5      nSUl        U$ [        b)  [        R                  XX4XP5      nUR                  5         U$  S5       e)NFTLSr   )r#   r   r   _typer$   rq   rr   )r5   rs   r   r   r   ru   r   rw   s           r;   	listenSSLPosixReactorBase.listenSSL  sj    ?00PJ>>$GGDDJK_QAH6665r>   c                    [        U5      U R                  -
  nU H  nU R                  U5        M     [        U5      nU H  nU R                  U5        M     [	        X5-  5      $ )a/  
Remove all readers and writers, and list of removed L{IReadDescriptor}s
and L{IWriteDescriptor}s.

Meant for calling from subclasses, to implement removeAll, like::

  def removeAll(self):
      return self._removeAll(self._reads, self._writes)

where C{self._reads} and C{self._writes} are iterables.
)setrQ   r,   r2   list)r5   readerswritersremovedReadersreaderremovedWriterswriters          r;   
_removeAllPosixReactorBase._removeAll  sc     W(=(==$Ff% % W$Ff% % N344r>   )rP   )returnr    )r   r   )     )r   r   F)   r   )2     r   )r   r   )r   r   N)r   )r   r   )g      >@N)r   strrs   intr   z'ClientFactory'r   floatr   ztuple[str, int] | Noner   r   )r   N)!r@   rA   rB   rC   rD   _childWakerrM   rT   rX   rn   rx   r}   r   r   r   r   r   r   r   r   r   r   __annotations__r   r   r   r   r   r   r   r   rF   __classcell__)r.   s   @r;   rH   rH   v   s'    K
'< 6t PU" NR" NNOONNE
!#A 	
 NNOO%
!
*  FJ
 .2

 
 !	

 
 ,
 

 LP775 5r>   rH   c                      \ rS rSrSrS rSrg)_PollLikeMixini  a  
Mixin for poll-like reactors.

Subclasses must define the following attributes::

  - _POLL_DISCONNECTED - Bitmask for events indicating a connection was
    lost.
  - _POLL_IN - Bitmask for events indicating there is input to read.
  - _POLL_OUT - Bitmask for events indicating output can be written.

Must be mixed in to a subclass of PosixReactorBase (for
_disconnectSelectable).
c                   SnSnX0R                   -  (       a2  X0R                  -  (       d  X R                  ;   a	  Sn[        nOt[        nOm UR                  5       S:X  a  [        nOQX0R                  -  (       a  UR                  5       nSnU(       d%  X0R                  -  (       a  UR                  5       nSnU(       a  U R                  XU5        gg! [         a0    [        R                  " 5       S   n[        R                  " 5          NTf = f)zO
fd is available for read or write, do the work and raise errors if
necessary.
NFTr   )_POLL_DISCONNECTED_POLL_IN_readsr   r   fileno_NO_FILEDESCdoRead	_POLL_OUTdoWriteBaseExceptionsysexc_infor   errr<   )r5   r6   fdeventr7   inReads         r;   _doReadOrWrite_PollLikeMixin._doReadOrWrite  s    
 ***EMM4I [[ 
 % & $$&", 'C}},(//1!%5>>#9 )002!& &&z?  !  llnQ'		s   C &AC 7DDr?   N)r@   rA   rB   rC   rD   r   rF   r?   r>   r;   r   r     s    7@r>   r   c                  l    \ rS rSrSrSrSrSrS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rSrg)_ContinuousPollingi  ao  
Schedule reads and writes based on the passage of time, rather than
notification.

This is useful for supporting polling filesystem files, which C{epoll(7)}
does not support.

The implementation uses L{_PollLikeMixin}, which is a bit hacky, but
re-implementing and testing the relevant code yet again is unappealing.

@ivar _reactor: The L{EPollReactor} that is using this instance.

@ivar _loop: A C{LoopingCall} that drives the polling, or L{None}.

@ivar _readers: A C{set} of C{FileDescriptor} objects that should be read
    from.

@ivar _writers: A C{set} of C{FileDescriptor} objects that should be
    written to.
r         c                Z    Xl         S U l        [        5       U l        [        5       U l        g rK   )_reactor_loopr   _readers_writers)r5   reactors     r;   __init___ContinuousPolling.__init__  s     
r>   c                t   U R                   (       d  U R                  (       ac  U R                  cU  SSKJnJn  U" U R                  5      U l        U R                  U R                  l        U R                  R                  USS9  ggU R                  (       a"  U R                  R                  5         SU l        gg)zP
Start or stop a C{LoopingCall} based on whether there are readers and
writers.
Nr   )_EPSILONLoopingCallF)now)r   r   r   twisted.internet.taskr   r   iterater   clockstartstop)r5   r   r   s      r;   
_checkLoop_ContinuousPolling._checkLoop  s    
 ==DMMzz!G(6
#'==

  

  u 5 " ZZJJOODJ r>   c                    [        U R                  5       H  nU R                  XU R                  5        M!     [        U R                  5       H  nU R                  X"U R
                  5        M!     g)zH
Call C{doRead} and C{doWrite} on all readers and writers respectively.
N)r   r   r   r   r   r   )r5   r   r   s      r;   r   _ContinuousPolling.iterate/  sR     4==)F> *4==)F? *r>   c                Z    U R                   R                  U5        U R                  5         g)zE
Add a C{FileDescriptor} for notification of data available to read.
N)r   rR   r  r5   r   s     r;   rS   _ContinuousPolling.addReader8        	&!r>   c                Z    U R                   R                  U5        U R                  5         g)zF
Add a C{FileDescriptor} for notification of data available to write.
N)r   rR   r  r5   r   s     r;   	addWriter_ContinuousPolling.addWriter?  r
  r>   c                |     U R                   R                  U5        U R                  5         g! [         a     gf = f)zI
Remove a C{FileDescriptor} from notification of data available to read.
N)r   removeKeyErrorr  r  s     r;   r,   _ContinuousPolling.removeReaderF  s9    	MM  ( 	  		   . 
;;c                |     U R                   R                  U5        U R                  5         g! [         a     gf = f)zJ
Remove a C{FileDescriptor} from notification of data available to
write.
N)r   r  r  r  r  s     r;   r2   _ContinuousPolling.removeWriterP  s9    
	MM  ( 	  		r  c                    [        U R                  U R                  -  5      nU R                  R                  5         U R                  R                  5         U$ )z!
Remove all readers and writers.
)r   r   r   clear)r5   results     r;   	removeAll_ContinuousPolling.removeAll[  sB     dmmdmm34 	r>   c                ,    [        U R                  5      $ )z
Return a list of the readers.
)r   r   rL   s    r;   
getReaders_ContinuousPolling.getReadersf       DMM""r>   c                ,    [        U R                  5      $ )z
Return a list of the writers.
)r   r   rL   s    r;   
getWriters_ContinuousPolling.getWritersl  r  r>   c                    XR                   ;   $ )a*  
Checks if the file descriptor is currently being observed for read
readiness.

@param fd: The file descriptor being checked.
@type fd: L{twisted.internet.abstract.FileDescriptor}
@return: C{True} if the file descriptor is being observed for read
    readiness, C{False} otherwise.
@rtype: C{bool}
)r   r5   r   s     r;   	isReading_ContinuousPolling.isReadingr       ]]""r>   c                    XR                   ;   $ )a,  
Checks if the file descriptor is currently being observed for write
readiness.

@param fd: The file descriptor being checked.
@type fd: L{twisted.internet.abstract.FileDescriptor}
@return: C{True} if the file descriptor is being observed for write
    readiness, C{False} otherwise.
@rtype: C{bool}
)r   r#  s     r;   	isWriting_ContinuousPolling.isWriting  r&  r>   )r   r   r   r   N)r@   rA   rB   rC   rD   r   r   r   r   r  r   rS   r  r,   r2   r  r  r   r$  r(  rF   r?   r>   r;   r   r     sV    , HI$@		####r>   r   fromfd)ArD   
__future__r   r   r   typingr   zope.interfacer   r   twisted.internetr   r   r	   twisted.internet.baser
   twisted.internet.interfacesr   r   r   r   r   r   r   r   r   r   r   twisted.internet.mainr   r   twisted.internet.protocolr   twisted.pythonr   r   twisted.python.runtimer   r   _signalsr   r   r    r!   r"   ConnectionFdescWentAwayr   twisted.protocolsr#   _tlsImportErrorr$   _sslr   processEnabledr&   r'   	isWindowsrb   r)   rH   r   r   getattr__all__r?   r>   r;   <module>r?     s  
 #  
  7 , , -    C 3 ' 9  ,,-CD- C, Cg%.N 
#< #<L [+'89x51; x5 :x5v	F@ F@R ]N#)C N# N#b ?co$k2$l4HI$o6
68T".$n5
I  
C  
C&  s6   E E( E6 E%$E%(E32E36F F