
    h/                     `   S r SSKrSSKrSSKJr  SSKJr  SSKJr  SSK	J
r
  SSKJr  SSKJr   " S	 S
\5      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q\" S5        Sr " S S\R>                  \R@                  5      r!\!" 5       r"\"RG                  5         \"RI                  S5        S r%S r&g)z
Banana -- s-exp based protocol.

Future Plans: This module is almost entirely stable.  The same caveat applies
to it as applies to L{twisted.spread.jelly}, however.  Read its future plans
for more details.

@author: Glyph Lefkowitz
    N)BytesIO)protocol)styles)log)	iterbytes)fullyQualifiedNamec                       \ rS rSrSrg)BananaError    N)__name__
__module____qualname____firstlineno____static_attributes__r       \/root/1688_scrapy/alibaba-scraper/venv/lib/python3.13/site-packages/twisted/spread/banana.pyr
   r
      s    r   r
   c                     U S:X  a	  U" S5        g U S:  d   S5       eU (       a$  U" [        U S-  45      5        U S-	  n U (       a  M#  g g )Nr       z!can only encode positive integers      )bytes)integerstreams     r   int2b128r      sL    !|uQ;;;;;
ugn&'(Q, 'r   c                 `    SnSn[        U 5       H  n[        U5      nX$U-  -  nUS-  nM     U$ )z
Convert an integer represented as a base 128 string into an L{int}.

@param st: The integer encoded in a byte string.
@type st: L{bytes}

@return: The integer value extracted from the byte string.
@rtype: L{int}
   r   r   )r   ord)steicharns        r   b1282intr$   )   s@     	
A	A"I	U
	a  Hr                           c                     U q g)aK  
Set the limit on the prefix length for all Banana connections
established after this call.

The prefix length limit determines how many bytes of prefix a banana
decoder will allow before rejecting a potential object as too large.

@type limit: L{int}
@param limit: The number of bytes of prefix for banana to allow when
decoding.
N)_PREFIX_LIMIT)limits    r   setPrefixLimitr0   K   s	     Mr   @   i  
 c                   @   \ rS rSrSrSS/rSr\rS r	S r
S rS	 rS
 rS rSrS rS r0 SS_SS_SS_SS_SS_SS_SS_SS_SS _S!S"_S#S$_S%S&_S'S(_S)S*_S+S,_S-S._S/S0_S1S2S3S4S5S6S7S8S9S:S;S<S=S>S?.Er0 r\R)                  5        H  u  rr\\\'   M     SDS@ jrSA rSB rSCrg)EBananaa   z
L{Banana} implements the I{Banana} s-expression protocol, client and
server.

@ivar knownDialects: These are the profiles supported by this Banana
    implementation.
@type knownDialects: L{list} of L{bytes}
   pb   noneNc                 n    Xl         SUS-  -  * S-   U l        SU l        SU l        SUS-  -  S-
  U l        g)z\
Set the prefix limit for decoding done by this protocol instance.

@see: L{setPrefixLimit}
   r   r   i   iN)prefixLimit_smallestLongInt_smallestInt_largestInt_largestLongInt)selfr/   s     r   r0   Banana.setPrefixLimitr   sI     !"#	"2 3a 7$$ UQY/!3r   c                     g)z@Surrogate for connectionMade
Called after protocol negotiation.
Nr   r>   s    r   connectionReadyBanana.connectionReady~   s    r   c                 0    Xl         U R                  5         g N)currentDialectrB   )r>   dialects     r   _selectDialectBanana._selectDialect   s    %r   c                    U R                   (       a  U R                  U5        g U R                  (       am  U H6  nX R                  ;   d  M  U R	                  U5        U R                  U5          g    [        R                  " S5        U R                  R                  5         g XR                  ;   a  U R                  U5        g [        R                  " S5        U R                  R                  5         g )NzSThe client doesn't speak any of the protocols offered by the server: disconnecting.zYThe client selected a protocol the server didn't suggest and doesn't know: disconnecting.)
rF   expressionReceivedisClientknownDialectssendEncodedrH   r   msg	transportloseConnection)r>   obj	serverVers      r   callExpressionReceivedBanana.callExpressionReceived   s    ##C( }}!$I $6$66((3++I6	 "% GG@ NN113,,,'', GGC NN113r   c                     U R                  [        5        S U l        U R                  (       d  U R	                  U R
                  5        g g rE   )r0   r.   rF   rL   rN   rM   rA   s    r   connectionMadeBanana.connectionMade   s8    M*"}}T//0 r   c                 |    U R                   nU(       a  US   S   R                  U5        g U R                  U5        g )Nr   )	listStackappendrT   )r>   itemls      r   gotItemBanana.gotItem   s0    NNbE!HOOD!''-r   r   c                 \   U R                   U-   nU R                  nU R                  nU(       Ga  U R                   U:w  d3   SR                  [	        U R                   5      [	        U5      5      5       eX l         Sn[        U5       H  nU[        :  a    O2US-   nM     XPR                  :  a  [        SU R                  4-  5      eg US U nX%US-    nX%S-   S  n	[        U5      U R                  :  a  [        SU R                  4-  5      eU[        :X  a7  [        U5      nU[        :  a  [        S5      eUR                  U/ 45        U	nGOnU[        :X  aA  [        U5      nU[        :  a  [        S5      e[        U	5      U:  a  XS  nU" U	S U 5        GO$g U[        :X  a  U	n[        U5      nU" U5        GOU[         :X  a  U	n[        U5      nU" U5        OU["        :X  a  U	n[        U5      nU" U* 5        OU[$        :X  a  U	n[        U5      * nU" U5        OU[&        :X  aD  U	n[        U5      nU R(                  U   n
U R*                  S:X  a	  U" U
5        Oa[-        S	U
< 35      eU[.        :X  a9  [        U	5      S
:  a)  U	S
S  nU" [0        R2                  " SU	S S
 5      S   5        Og [-        SU< 35      eU(       aZ  [        US   S   5      US   S   :X  a?  UR5                  5       S   n
U" U
5        U(       a  [        US   S   5      US   S   :X  a  M?  U(       a  GM  SU l         g )NzThis ain't right: {} {}r   r   z1Security precaution: more than %d bytes of prefixz9Security precaution: longer than %d bytes worth of prefixz#Security precaution: List too long.z%Security precaution: String too long.r5   zInvalid item for pb protocol    !dzInvalid Type Byte rZ   r   )bufferr[   r_   formatreprr   HIGH_BIT_SETr9   r
   lenLISTr$   
SIZE_LIMITr\   STRINGINTLONGINTLONGNEGNEGVOCABincomingVocabularyrF   NotImplementedErrorFLOATstructunpackpop)r>   chunkrd   r[   r_   poschnumtypebyterestr]   s              r   dataReceivedBanana.dataReceived   s(   u$NN	,,;;&( *C*J*JT[[!V+ ( !KC'%Ag (
 )))%K++-.  #,CC!G,H')$D3x$***!O'')*  4sm#%&KLL  #r+V#sm#%&MNNt9#!$ZFD#J'SsmW$smW$smS}nU"sm..s3&&%/DM-0MdX.VWWU"t9>!!"XFFMM$Ra9!<=),>xl*KLLYr]1%5!6)B-:J!J }}q) Yr]1%5!6)B-:J!JU fZ r   c                     [        5       e)z=Called when an expression (list, string, or int) is received.)rr   )r>   lsts     r   rK   Banana.expressionReceived  s    !##r   s   Noner   s   classr8   s   dereference   s	   reference   s
   dictionary   s   function   s   instancer   s   listrb   s   module	   s
   persistent
   s   tuple   s   unpersistable   s   copy   s   cache   s   cached   s   remote   s   local                              r               )s   lcaches   versions   logins   passwords	   challenges	   logged_ins   not_logged_ins   cachemessages   messages   answers   errors   decrefs   decaches   uncachec                 v    / U l         [        R                  " U R                  5      U l        SU l        Xl        g )Nr   )r[   copyoutgoingVocabularyoutgoingSymbolsoutgoingSymbolCountrL   )r>   rL   s     r   __init__Banana.__init__4  s-    #yy)@)@A#$  r   c                     [        5       nU R                  XR                  5        UR                  5       nU R                  R                  U5        g)z
Send the encoded representation of the given object:

@param obj: An object to encode and send.

@raise BananaError: If the given object is not an instance of one of
    the types supported by Banana.

@return: L{None}
N)r   _encodewritegetvaluerP   )r>   rR   encodeStreamvalues       r   rN   Banana.sendEncoded:  s=     yS,,-%%'U#r   c           	         [        U[        [        45      (       ag  [        U5      [        :  a  [        S[        U5      4-  5      e[        [        U5      U5        U" [        5        U H  nU R                  X25        M     g [        U[        5      (       a  XR                  :  d  XR                  :  a  [        SU4-  5      eXR                  :  a  [        U* U5        U" [        5        g US:  a  [        U* U5        U" [        5        g XR                  ::  a  [        X5        U" [         5        g [        X5        U" ["        5        g [        U[$        5      (       a*  U" [&        5        U" [(        R*                  " SU5      5        g [        U[,        5      (       a  U R.                  S:X  a6  XR0                  ;   a'  U R0                  U   n[        XB5        U" [2        5        g [        U5      [        :  a  [        S[        U5      4-  5      e[        [        U5      U5        U" [4        5        U" U5        g [        SR7                  [9        [;        U5      5      U5      5      e)Nz#list/tuple is too long to send (%d)zint is too large to send (%d)r   rc   r5   z$byte string is too long to send (%d)z#Banana cannot send {} objects: {!r})
isinstancelisttuplerh   rj   r
   r   ri   r   intr:   r=   r;   rn   ro   r<   rl   rm   floatrs   rt   packr   rF   r   rp   rk   re   r   type)r>   rR   r   elemsymbolIDs        r   r   Banana._encodeJ  s   cD%=))3x*$!"G3s8+"UVVSXu%$KT) S!!***c4H4H.H!"ASF"JKK&&&#u%gq#u%c
((($c
$gU##%L&++dC()U##""e+7K7K0K//4)es8j(%>#c(L  S5)fc
5<<&tCy13 r   )r<   r=   r;   r:   rd   rF   rL   r[   r   r   r9   )r   )r   r   r   r   __doc__rM   r9   rj   	sizeLimitr0   rB   rH   rT   rW   r_   rd   r}   rK   r   rq   itemskvr   rN   r   r   r   r   r   r3   r3   a   s    G$MKI
4
4<1. FQf$## 	!# 		#
 	a# 	q# 	Q# 	Q# 	# 	1# 	r# 	"# 	"# 	#  	"!#" 	2##$ 	2%#& 	"'#( E#J "((*1 !1 +!$ -r   r3   r6   c                 v    [        5       nU[        l        [        R                  U 5        UR	                  5       $ )zEncode a list s-expression.)r   _irP   rN   r   )r   r   s     r   encoder     s+    9LBLNN3  ""r   c                     / nUR                   [        l         [        R                  U 5        S[        l        [        ?US   $ ! S[        l        [        ?f = f)z!
Decode a banana-encoded string.
r   r   )r\   r   rK   r}   rd   )r   r^   s     r   decoder     sM     	AHHB"
	!Q4K 	!s   A A)'r   r   rt   ior   twisted.internetr   twisted.persistedr   twisted.pythonr   twisted.python.compatr   twisted.python.reflectr   	Exceptionr
   r   r$   ri   rl   rk   ro   rs   rm   rn   rp   rg   r0   r.   rj   Protocol	Ephemeralr3   r   rW   rH   r   r   r   r   r   <module>r      s   
    % $  + 5	) 	( 	

   r 
VX 0 0 Vt X       ' #r   