
     fi[                        d Z ddlZddlZddlmZmZ ddlmZ ddlm	Z	m
Z
mZmZmZmZmZ erddlmZ d  ed	          D             Z G d
 d          Z G d d          ZdZdZdZdZdZeZdZdZdZdZdZ dZ!dZ" G d de          Z# G d de          Z$e$j%        e$j&        e$j'        fZ(dZ)dZ*dZ+dZ,dZ-d Z.d!Z/d!Z0 ej1        d"d          Z2 G d# d$e3          Z4 G d% d&e          Z5 G d' d(e          Z6 G d) d*e          Z7d+e8d,e9d-e8fd.Z: G d/ d0          Z; G d1 d2          Z< G d3 d4          Z= G d5 d6          Z>dS )7zY
wsproto/frame_protocol
~~~~~~~~~~~~~~~~~~~~~~

WebSocket frame protocol implementation.
    N)getincrementaldecoderIncrementalDecoder)IntEnum)	GeneratorList
NamedTupleOptionalTupleTYPE_CHECKINGUnion   )	Extensionc                 `    g | ]*t          fd t          d          D                       +S )c              3   "   K   | ]	}|z  V  
d S N ).0abs     Y/var/www/api.educacionweb.es/myenv/lib/python3.11/site-packages/wsproto/frame_protocol.py	<genexpr>z<listcomp>.<genexpr>   s'      ..aAE......       )bytesrange)r   r   s    @r   
<listcomp>r      s<    CCC1e....5::.....CCCr   r   c                   .    e Zd ZdeddfdZdedefdZdS )XorMaskerSimplemasking_keyreturnNc                     || _         d S r   )_masking_key)selfr   s     r   __init__zXorMaskerSimple.__init__   s    'r   datac                    |rt          |          }d | j        D             \  }}}}|d d d                             |          |d d d<   |dd d                             |          |dd d<   |dd d                             |          |dd d<   |dd d                             |          |dd d<   t          |          dz  }| j        |d          | j        d |         z   | _        t	          |          S |S )Nc              3   0   K   | ]}t           |         V  d S r   )
_XOR_TABLE)r   ns     r   r   z*XorMaskerSimple.process.<locals>.<genexpr>   s&      CCA*Q-CCCCCCr      r         )	bytearrayr"   	translatelenr   )r#   r%   
data_arrayr   r   cdkey_rotations           r   processzXorMaskerSimple.process   s#    	%"4JCC1BCCCJAq!Q(1o77::JsssO)!$Q$/99!<<Jqt!t)!$Q$/99!<<Jqt!t)!$Q$/99!<<Jqt!t t99q=L!,--043D]l]3SS  $$$r   )__name__
__module____qualname__r   r$   r4   r   r   r   r   r      sX        (E (d ( ( ( (E e      r   r   c                       e Zd ZdedefdZdS )XorMaskerNullr%   r    c                     |S r   r   r#   r%   s     r   r4   zXorMaskerNull.process.   s    r   N)r5   r6   r7   r   r4   r   r   r   r9   r9   -   s6        E e      r   r9   ~      }   i  l       @             c                   6    e Zd ZdZdZdZdZdZdZdZ	de
fd	Zd
S )Opcodez7
    RFC 6455, Section 5.2 - Base Framing Protocol
    r   r   r+      	   
   r    c                 &    t          | dz            S )NrF   )boolr#   s    r   	iscontrolzOpcode.iscontrol_   s    D4K   r   N)r5   r6   r7   __doc__CONTINUATIONTEXTBINARYCLOSEPINGPONGrJ   rL   r   r   r   rE   rE   H   sc         
 L D F E D D!4 ! ! ! ! ! !r   rE   c                   J    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdS )CloseReasonz8
    RFC 6455, Section 7.4.1 - Defined Status Codes
      i  i  i  i  i  i  i  i  i  i  i  i  i  N)r5   r6   r7   rM   NORMAL_CLOSURE
GOING_AWAYPROTOCOL_ERRORUNSUPPORTED_DATANO_STATUS_RCVDABNORMAL_CLOSUREINVALID_FRAME_PAYLOAD_DATAPOLICY_VIOLATIONMESSAGE_TOO_BIGMANDATORY_EXTINTERNAL_ERRORSERVICE_RESTARTTRY_AGAIN_LATERTLS_HANDSHAKE_FAILEDr   r   r   rU   rU   c   s          N J N  N  "& 
 O M
 N O O  r   rU   rV   i  i  i  i  i  z!Ic                   :     e Zd Zej        fdededdf fdZ xZS )ParseFailedmsgcoder    Nc                 X    t                                          |           || _        d S r   )superr$   rh   )r#   rg   rh   	__class__s      r   r$   zParseFailed.__init__   s(     				r   )r5   r6   r7   rU   rY   strr$   __classcell__)rk   s   @r   rf   rf      s`        ,7,F )	         r   rf   c                   .    e Zd ZU eed<   eed<   eed<   dS )RsvBitsrsv1rsv2rsv3N)r5   r6   r7   rJ   __annotations__r   r   r   ro   ro      s+         
JJJ
JJJ
JJJJJr   ro   c                   N    e Zd ZU eed<   eed<   eed<   eed<   ee	         ed<   dS )Headerfinrsvopcodepayload_lenr   N)
r5   r6   r7   rJ   rs   ro   rE   intr	   r   r   r   r   ru   ru      sI         	III	LLLNNN%     r   ru   c                   Z    e Zd ZU eed<   eeeee	ef         f         ed<   e
ed<   e
ed<   dS )Framerx   payloadframe_finishedmessage_finishedN)r5   r6   r7   rE   rs   r   r   rl   r
   rz   rJ   r   r   r   r|   r|      sS         NNN5#uS#X.////r   r|   r%   nbytesr    c                     t          |           |k    r| S | d |         } |                     dd                              d          } | S )Nutf-8ignore)errors)r/   decodeencode)r%   r   s     r   _truncate_utf8r      sQ    
4yyF =D ;;wx;0077@@DKr   c                       e Zd Zddee         ddfdZdeddfdZdedefdZdedee         fd	Z	dd
Z
ddZdefdZdS )BufferNinitial_bytesr    c                 l    t                      | _        d| _        |r|                     |           d S d S Nr   )r-   buffer
bytes_usedfeed)r#   r   s     r   r$   zBuffer.__init__   s>    kk 	%IIm$$$$$	% 	%r   	new_bytesc                 &    | xj         |z  c_         d S r   )r   )r#   r   s     r   r   zBuffer.feed  s    y r   r   c                     |st                      S | j        | j        | j        |z            }| xj        t          |          z  c_        |S r   )r-   r   r   r/   )r#   r   r%   s      r   consume_at_mostzBuffer.consume_at_most  sI     	;;{4?T_v-EEF3t99$r   c                 p    t          | j                  | j        z
  |k     rd S |                     |          S r   )r/   r   r   r   )r#   r   s     r   consume_exactlyzBuffer.consume_exactly  s7    t{do-664##F+++r   c                 2    | j         d | j        = d| _        d S r   )r   r   rK   s    r   commitzBuffer.commit  s    K)$/)*r   c                     d| _         d S r   )r   rK   s    r   rollbackzBuffer.rollback  s    r   c                 *    t          | j                  S r   )r/   r   rK   s    r   __len__zBuffer.__len__  s    4;r   r   r    N)r5   r6   r7   r	   r   r$   r   rz   r   r   r   r   r   r   r   r   r   r      s        % %huo % % % % %!e ! ! ! ! !c e    ,c ,huo , , , ,   
                r   r   c                   &    e Zd ZddZdedefdZdS )MessageDecoderr    Nc                 "    d | _         d | _        d S r   )rx   decoderrK   s    r   r$   zMessageDecoder.__init__"  s    (,59r   framec                    |j                                         rJ | j         /|j         t          j        u rt	          d          |j         | _         n*|j         t          j        urt	          d|j         z            |j         t          j        u r t          d                      | _        |j        o|j	        }| j        |j
        }n~t          |j
        t          t          f          sJ 	 | j                            |j
        |          }n9# t          $ r,}t	          t!          |          t"          j                  d }~ww xY wt'          | j         ||j        |          }|rd | _         d | _        |S )Nzunexpected CONTINUATIONzexpected CONTINUATION, got %rr   )rx   rL   rE   rN   rf   rO   r   r   r~   r   r}   
isinstancer   r-   r   UnicodeDecodeErrorrl   rU   r]   r|   )r#   r   finishedr%   excs        r   process_framezMessageDecoder.process_frame&  sk   <))+++++;|v222!";<<<,DKK\!444=LMMM<6;&&9099;;DL'BE,B<=DDemeY-?@@@@@T|**5=(CC% T T T!#c((K,RSSST dk4)=xHH 	 DKDLs   , D 
E'D>>Er   )r5   r6   r7   r$   r|   r   r   r   r   r   r   !  sJ        : : : :5 U      r   r   c                       e Zd Z	 ddedeed                  ddfdZdeddfdZdee	         fd	Z
defd
Zdededee         fdZdedededdfdZdS )FrameDecoderNclient
extensionsr   r    c                     || _         |pg | _        t                      | _        d | _        d | _        d | _        d| _        d| _        d S r   )	r   r   r   r   headereffective_opcodemaskerpayload_requiredpayload_consumedr#   r   r   s      r   r$   zFrameDecoder.__init__H  sN     $*hh(,26CG ! !r   r%   c                 :    | j                             |           d S r   )r   r   r;   s     r   receive_byteszFrameDecoder.receive_bytesV  s    r   c                    | j         s|                                 sd S | j         J | j        J | j        J t	          | j                  | j        k     rd S | j         j        | j        z
  }| j        	                    |          }|s| j         j        dk    rd S | j        
                                 | xj        t	          |          z  c_        | j        | j         j        k    }| j                            |          }| j        D ]?}|                    | |          }t          |t                    rt!          d|          |}@|rit#                      }| j        D ]N}|                    | | j         j                  }t          |t                    rt!          d|          |||z  }O||z  }t)          | j        ||| j         j                  }|rd | _         d | _        d | _        nt*          j        | _        |S )Nr   error in extension)r   parse_headerr   r   r/   r   r   ry   r   r   r   r4   r   frame_inbound_payload_datar   rU   rf   r-   frame_inbound_completerv   r|   rE   rN   )	r#   payload_remainingr}   r   	extensionpayload_finalresultr   s	            r   process_bufferzFrameDecoder.process_bufferY  s   { 	$$&& t{&&&{&&&$000t{d3334 K3d6KK+--.?@@ 	4;2Q664W-(DK,CC+%%g.. 	 	I ;;D'JJH(K00 B!"6AAAGG 	KKE!_ $ $	"99$PPfk22 D%&:FCCC%VOEuGd+WhPP 	8DK$(D!DKK$*$7D!r   c                 <   | j                             d          }|| j                                          dS t          |d         t          z            }t          t          |d         t          z            t          |d         t          z            t          |d         t          z                      }|d         t          z  }	 t          |          }n!# t          $ r t          d|d          w xY w|                                r|st          d          t          |d         t          z            }|d         t          z  }|                     ||          }|| j                                          dS |                     |||           |r| j        rt          d          |s| j        st          d	          |rL| j                             d
          }|| j                                          dS t'          |          | _        nt+                      | _        | j                                          t/          ||||d           | _        | j        j        | _        | j        j                                        r|| _        nd| _        d| _        dS )Nr+   Fr   zInvalid opcode z#xz)Invalid attempt to fragment control framer   z'client received unexpected masked framez)server received unexpected unmasked framer*   T)r   r   r   rJ   FIN_MASKro   	RSV1_MASK	RSV2_MASK	RSV3_MASKOPCODE_MASKrE   
ValueErrorrf   rL   	MASK_MASKPAYLOAD_LEN_MASKparse_extended_payload_lengthextension_processingr   r   r   r9   r   ru   r   rx   r   r   r   )	r#   r%   rv   rw   rx   has_maskpayload_len_shortry   r   s	            r   r   zFrameDecoder.parse_header  s   {**1--<K  """547X%&&a9$%%a9$%%a9$%%
 

 a;&	=F^^FF 	= 	= 	=;;;;<<<	=  	Kc 	KIJJJQ)+,, G&6688ARSSK  """5!!&#{;;; 	I 	IGHHH 	K 	KIJJJ 	*+55a88K"$$&&&u)+66DKK'//DKS#v{DAA $ 2;'')) 	&$/D!!$%D! !ts   C C6rx   ry   c                    |                                 r|t          k    rt          d          |t          k    rP| j                            d          }|d S t          j        d|          \  }|t          k    rt          d          nn|t          k    rc| j                            d          }|d S t          j        d|          \  }|t          k    rt          d          |dz	  rt          d	          |S )
Nz$Control frame with payload len > 125r+   !Hz6Payload length used 2 bytes when 1 would have sufficedrF   !Qz6Payload length used 8 bytes when 2 would have sufficed?   z'8-byte payload length with non-zero MSB)
rL   MAX_PAYLOAD_NORMALrf   PAYLOAD_LENGTH_TWO_BYTEr   r   structunpackPAYLOAD_LENGTH_EIGHT_BYTEMAX_PAYLOAD_TWO_BYTE)r#   rx   ry   r%   s       r   r   z*FrameDecoder.parse_extended_payload_length  s     	F+0B"B"BDEEE111;..q11D|t#]466N[000!L   1 555;..q11D|t#]466N[222!L   b  M ""KLLLr   rw   c                 &   g d}| j         D ][}|                    | |||          }t          |t                    rt	          d|          t          |          D ]\  }}|rd||<   \t          ||          D ]\  }	}
|
r|	st	          d          d S )N)FFFr   TzReserved bit set unexpectedly)r   frame_inbound_headerr   rU   rf   	enumeratezip)r#   rx   rw   ry   rsv_usedr   r   bitusedexpectedfounds              r   r   z!FrameDecoder.extension_processing  s     )(( 	) 	)I33D&#{SSF&+.. @!"6???&v.. ) )	T )$(HSM)  #8S11 	C 	COHe CX C!"ABBB	C 	Cr   r   )r5   r6   r7   rJ   r	   r   r$   r   r   r|   r   r   rE   rz   r   ro   r   r   r   r   r   r   G  s       FJ" ""(0k1B(C"	" " " "% D    0 0 0 0 0d3d 3 3 3 3j+.	#   <CC#*C9<C	C C C C C Cr   r   c            	       F   e Zd Zdeded         ddfdZdedefdZdee	e         ddf         fd	Z
d
eddfdZdeeddf         fdZdde	e         de	e         defdZddedefdZddedefdZ	 ddeeeef         dedefdZdedededefdZ	 ddedededefdZdS )FrameProtocolr   r   r   r    Nc                     || _         d |D             | _        t          | j         | j                  | _        t	                      | _        |                                 | _        d | _        d S )Nc                 :    g | ]}|                                 |S r   enabledr   exts     r   r   z*FrameProtocol.__init__.<locals>.<listcomp>  s%    FFF3F3FFFr   )	r   r   r   _frame_decoderr   _message_decoder_parse_more_gen_parse_more_outbound_opcoder   s      r   r$   zFrameProtocol.__init__  sf    FF*FFF +4;HH . 0 0//1126r   r   c                    |j         }t          |t          t          f          sJ |st          j        df}n-t          |          dk    rt          d          t          j	        d|d d                   \  }|t          k     s|t          k    rt          d          	 t	          |          }n# t          $ r Y nw xY w|t          v rt          d          t          |t                    s|t          k    rt          d          	 |dd                              d	          }n<# t           $ r/}t          d
t#          |          z   t          j                  d }~ww xY w||f}t'          |j        ||j        |j                  S )N r   zCLOSE with 1 byte payloadr   r+   zCLOSE with invalid codez#remote CLOSE with local-only reasonz CLOSE with unknown reserved coder   zError decoding CLOSE reason: )r}   r   r   r-   rU   r[   r/   rf   r   r   MIN_CLOSE_REASONMAX_CLOSE_REASONr   LOCAL_ONLY_CLOSE_REASONSMAX_PROTOCOL_CLOSE_REASONr   r   rl   r]   r|   rx   r~   r   )r#   r   r%   rh   reasonr   s         r   _process_closezFrameProtocol._process_close  s   }$	 233333 	"  .3DDYY!^^9:::mD$rr(33GT&&&$1A*A*A!";<<<"4((   ///!"GHHHdK00 FT=V5V5V!"DEEEabb11%   !3c#hh>:  
 &>DU\4)=u?UVVVs*   B/ /
B<;B<D% %
E/*EEc              #   D  K   d | j         D             | _         d}|s| j                                        }|`|j                                        s| j                            |          }n,|j        t          j        k    r| 	                    |          }d}|V  |d S d S )Nc                 :    g | ]}|                                 |S r   r   r   s     r   r   z1FrameProtocol._parse_more_gen.<locals>.<listcomp>!  s%    KKK3S[[]]K3KKKr   FT)
r   r   r   rx   rL   r   r   rE   rQ   r   )r#   closedr   s      r   r   zFrameProtocol._parse_more_gen  s       LK$/KKK 
	'6688E |--// " 1??FFEE\V\11 //66E!FKKK  
	 
	 
	 
	 
	r   r%   c                 :    | j                             |           d S r   )r   r   r;   s     r   r   zFrameProtocol.receive_bytes0  s    ))$/////r   c              #   0   K   | j         D ]}| d S |V  d S r   )r   )r#   events     r   received_frameszFrameProtocol.received_frames3  s9      % 	 	E}		 	r   rh   r   c                 |   t                      }|t          j        u rd }||rt          d          |t          v rt          j        }|U|t          t          j        d|                    z  }|.|t          |	                    d          t          dz
            z  }|                     t          j        |          S )Nz&cannot specify a reason without a coder   r   r+   )r-   rU   r[   	TypeErrorr   rW   r   packr   r   r   _serialize_framerE   rQ   )r#   rh   r   r}   s       r   closezFrameProtocol.close:  s    ++;---D<F<DEEE+++-DyT4!8!8999G!>MM'**,>,B   $$V\7;;;r   r   r}   c                 B    |                      t          j        |          S r   )r   rE   rR   r#   r}   s     r   pingzFrameProtocol.pingK      $$V[':::r   c                 B    |                      t          j        |          S r   )r   rE   rS   r  s     r   pongzFrameProtocol.pongN  r  r   Trv   c                    t          |t          t          t          f          rt          j        }nFt          |t                    r"t          j        }|                    d          }nt          d          | j
        || _
        n$| j
        |urt          d          t          j        }|rd | _
        |                     |||          S )Nr   zMust provide bytes or textz!Data type mismatch inside message)r   r   r-   
memoryviewrE   rP   rl   rO   r   r   r   r   rN   r   )r#   r}   rv   rx   s       r   	send_datazFrameProtocol.send_dataQ  s     gy*=>> 	;]FF%% 	;[FnnW--GG9::: ($*D!!"&00?@@@(F 	)$(D!$$VWc:::r   rw   rx   c                     t          |          dz  }t          |j                  dz  t          |j                  dz  z   t          |j                  dz  z   }t          |          }||z  |z  S )N         r*   )rz   rp   rq   rr   )r#   rv   rw   rx   fin_bitsrsv_bitsopcode_bitss          r   _make_fin_rsv_opcodez"FrameProtocol._make_fin_rsv_opcodeh  sc    s88q=MMQ&3sx==A+=>#ch--STBTU&kk("[00r   c                    t          ddd          }t          | j                  D ]}|                    | ||||          \  }}|                     |||          }t          |          }d}|t          k    r|}	d }
n |t          k    r
t          }	|}
nt          }	|}
d}| j
        r|	dz  }	t          ||	g          }|
p|                                rt          d          |r&|t          t          j        d|
                    z  }n%|t          t          j        d|
                    z  }| j
        r>t!          j        d          }t%          |          }||z   |                    |          z   S ||z   S )NFTr?   z"payload too long for control framer   r   r*   )ro   reversedr   frame_outboundr  r/   r   r   r   r   r   r-   rL   r   r   r   osurandomr   r4   )r#   rx   r}   rv   rw   r   fin_rsv_opcodepayload_lengthquad_payloadfirst_payloadsecond_payloadr   r   r   s                 r   r   zFrameProtocol._serialize_frameo  s    eUE**!$/22 	U 	UI$33D&#wPSTTLC223VDDW///*M!NN3333M+NN5M+NL; 	$V#MNM:;;%!! G !EFFF G)FKn$E$EFFF)FKn$E$EFFF; 	B *Q--K$[11FK'&..*A*AAAr   )NN)r   )r   T)r5   r6   r7   rJ   r   r$   r|   r   r   r	   r   r   r   r   rz   rl   r   r  r  r   r-   r	  ro   rE   r  r   r   r   r   r   r     s       	7t 	7k1B 	7t 	7 	7 	7 	7WE We W W W WB8E?D$+F!G    *0% 0D 0 0 0 05$+<!=    < <(3- < <QV < < < <"; ;E ;E ; ; ; ;; ;E ;E ; ; ; ; HL; ;UIs23;@D;	; ; ; ;.1 17 1F 1s 1 1 1 1 AE2  2 2 ',2 9=2 	2  2  2  2  2  2 r   r   )?rM   r  r   codecsr   r   enumr   typingr   r   r   r	   r
   r   r   r   r   r   r(   r   r9   r   r   r   r   MAX_PAYLOAD_EIGHT_BYTEMAX_FRAME_PAYLOADr   r   r   r   r   r   r   rE   rU   r[   r\   rd   r   r   MIN_PROTOCOL_CLOSE_REASONr   MIN_LIBRARY_CLOSE_REASONMAX_LIBRARY_CLOSE_REASONMIN_PRIVATE_CLOSE_REASONMAX_PRIVATE_CLOSE_REASONr   r   	NULL_MASK	Exceptionrf   ro   ru   r|   r   rz   r   r   r   r   r   r   r   r   <module>r(     s    
			  < < < < < < < <       U U U U U U U U U U U U U U U U U U &%%%%%% DCc

CCC
       0             " *  	  			! ! ! ! !W ! ! !6T  T  T  T  T ' T  T  T r  $             FKa  	    )       j   ! ! ! ! !Z ! ! !    J          !  !  !  !  !  !  !  ! H# # # # # # # #LdC dC dC dC dC dC dC dCNs  s  s  s  s  s  s  s  s  s r   