
    ,h1                       U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	m
Z
 d dlmZmZ ddlmZmZ 	 ddlmZ g dZ G d	 d
ej,                        Zej0                  Zej4                  Zej8                  Zej<                  Zej@                  Z!ejD                  Z#eeefZ$ee!e#fZ% G d dej,                        Z&e&jN                  de&jP                  de&jR                  de&jT                  de&jV                  de&jX                  de&jZ                  de&j\                  de&j^                  de&j`                  de&jb                  de&jd                  de&jf                  de&jh                  de&jj                  diZ6de7d<   e&jN                  e&jP                  e&jR                  e&jT                  e&jZ                  e&j\                  e&j^                  e&j`                  e&jb                  e&jd                  e&jf                  e&jh                  hZ8e&jN                  e&jP                  e&jV                  hZ9e:e;e<fZ=ej|                   G d d             Z?ej|                   G d  d!             Z@dd"lAmBZB y# e$ r
 ddlmZ Y 0w xY w)#    )annotationsN)	GeneratorSequence)CallableUnion   )PayloadTooBigProtocolError)
apply_mask)OpcodeOP_CONTOP_TEXT	OP_BINARYOP_CLOSEOP_PINGOP_PONGDATA_OPCODESCTRL_OPCODES	CloseCodeFrameClosec                  (    e Zd ZdZd\  ZZZd\  ZZZ	y)r   z#Opcode values for WebSocket frames.)r   r      )   	   
   N)
__name__
__module____qualname____doc__CONTTEXTBINARYCLOSEPINGPONG     S/var/www/html/Resume-Scraper/venv/lib/python3.12/site-packages/websockets/frames.pyr   r   %   s    -)D$(E4r(   r   c                  L    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Zy)r   z-Close code values for WebSocket close frames.i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  N)r   r   r   r    NORMAL_CLOSURE
GOING_AWAYPROTOCOL_ERRORUNSUPPORTED_DATANO_STATUS_RCVDABNORMAL_CLOSUREINVALID_DATAPOLICY_VIOLATIONMESSAGE_TOO_BIGMANDATORY_EXTENSIONINTERNAL_ERRORSERVICE_RESTARTTRY_AGAIN_LATERBAD_GATEWAYTLS_HANDSHAKEr'   r(   r)   r   r   7   sT    7NJNNLONOOKMr(   r   OKz
going awayzprotocol errorzunsupported datazno status received [internal]zabnormal closure [internal]zinvalid frame payload datazpolicy violationzmessage too bigzmandatory extensionzinternal errorzservice restartztry again laterzbad gatewayz TLS handshake failure [internal]zdict[int, str]CLOSE_CODE_EXPLANATIONSc                      e Zd ZU dZded<   ded<   dZded<   d	Zded
<   d	Zded<   d	Zded<    e	e
j                  j                  dd            ZddZeddd	 	 	 	 	 	 	 	 	 dd       Zdd	 	 	 	 	 ddZddZy)r   aN  
    WebSocket frame.

    Attributes:
        opcode: Opcode.
        data: Payload data.
        fin: FIN bit.
        rsv1: RSV1 bit.
        rsv2: RSV2 bit.
        rsv3: RSV3 bit.

    Only these fields are needed. The MASK bit, payload length and masking-key
    are handled on the fly when parsing and serializing frames.

    r   opcodez#Union[bytes, bytearray, memoryview]dataTboolfinFrsv1rsv2rsv3WEBSOCKETS_MAX_LOG_SIZE75c                   d}t        | j                         dt        | j                        dk(  rdnd }| j                  rdnd}| j                  t        u r-t        t        | j                        j                               }n| j                  t        u rs| j                  }t        |      | j                  dz  kD  r3| j                  dz  dz
  dz  }dj                  |dd	|z   d
|| d g      }dj                  d |D              }ny| j                  t        u r)t        t        j                  | j                              }n>| j                  r0	 t        t        | j                        j                               }d}nd}t        |      | j                  kD  r$| j                  dz  dz
  }|dd	|z   dz   || d z   }dj                  t#        d|||g            }| j                  j$                   d| d| dS # t        t         f$ rw | j                  }t        |      | j                  dz  kD  r3| j                  dz  dz
  dz  }dj                  |dd	|z   d
|| d g      }dj                  d |D              }d}Y w xY w)zE
        Return a human-readable representation of a frame.

        Nz byter    s	continued   r(   r   s      c              3  $   K   | ]  }|d  
 yw02xNr'   .0bytes     r)   	<genexpr>z Frame.__str__.<locals>.<genexpr>   s     =dtCjM=   textc              3  $   K   | ]  }|d  
 ywrM   r'   rO   s     r)   rR   z Frame.__str__.<locals>.<genexpr>   s     A$4*ArS   binaryz''z...z, z [])lenr>   r@   r=   r   reprbytesdecoder   MAX_LOG_SIZEjoinr   strr   parseUnicodeDecodeErrorAttributeErrorfiltername)selfcodinglength	non_finalr>   rV   cutmetadatas           r)   __str__zFrame.__str__   s_   
 		N#5s499~/B(LM((B	;;'! dii(//12D[[I% YYF6{T..!33((A-1a76)AG#4k63$%="QR88=f==D[[H$u{{499-.DYY	"E$)),3356 Dt9t(((##q(1,C	!c'?U*T3$%[8D99VD669*EFG++""#1TF"XJa88! '7 "v;!2!2a!77,,1A5!;C XXviC'8+vsde}&UVFxxA&AA!"s   .G= =BJJN)max_size
extensionsc             #    K    |d      E d{   }t        j                  d|      \  }}|dz  rdnd}|dz  rdnd}	|dz  rdnd}
|d	z  rdnd}	 t        |d
z        }|dz  rdnd|k7  rt	        d      |dz  }|dk(  r) |d      E d{   }t        j                  d|      \  }n-|dk(  r( |d      E d{   }t        j                  d|      \  }|||kD  rt        ||      |r |d      E d{   } ||      E d{   }|rt        |      } | ||||	|
|      }|g }t        |      D ]  }|j                  ||      } |j                          |S 7 Q# t        $ r}t	        d      |d}~ww xY w7 7 7 7 ~w)a  
        Parse a WebSocket frame.

        This is a generator-based coroutine.

        Args:
            read_exact: Generator-based coroutine that reads the requested
                bytes or raises an exception if there isn't enough data.
            mask: Whether the frame should be masked i.e. whether the read
                happens on the server side.
            max_size: Maximum payload size in bytes.
            extensions: List of extensions, applied in reverse order.

        Raises:
            EOFError: If the connection is closed without a full WebSocket frame.
            PayloadTooBig: If the frame's payload size exceeds ``max_size``.
            ProtocolError: If the frame contains incorrect values.

        r   N!BB   TF@             zinvalid opcodezincorrect masking   ~   !Hr   z!Q   )rk   )
structunpackr   
ValueErrorr
   r	   r   reversedr[   check)cls
read_exactmaskrk   rl   r>   head1head2r@   rA   rB   rC   r=   excrf   
mask_bytesframe	extensions                     r)   r_   zFrame.parse   s    : %Q-'}}UD1u j(dez)tuz)tuz)tu	;EJ./F J&DEd: 344#S=(m+DdD1IVs](m+DdD1IVFX$511$.qM1J %V,,dJ/DFD#tT48J!*- 	?I$$UX$>E	? 	W (  	; 01s:	; , ,
 2 -sw   FEAFE" ,FE?-F9F:<F6F7FFAF"	E<+E77E<<FFFFrl   c               F   | j                          |g }|D ]  }|j                  |       }  t        j                         }| j                  rdnd| j
                  rdndz  | j                  rdndz  | j                  rdndz  | j                  z  }|rdnd}t        | j                        }|dk  r*|j                  t        j                  d|||z               nZ|dk  r+|j                  t        j                  d	||dz  |             n*|j                  t        j                  d
||dz  |             |r&t        j                  d      }|j                  |       |rt!        | j                        }	n| j                  }	|j                  |	       |j#                         S )aH  
        Serialize a WebSocket frame.

        Args:
            mask: Whether the frame should be masked i.e. whether the write
                happens on the client side.
            extensions: List of extensions, applied in order.

        Raises:
            ProtocolError: If the frame contains incorrect values.

        ro   r   rp   rq   rr   ru   rn   i   z!BBHz!BBQrt   rw   )r|   encodeioBytesIOr@   rA   rB   rC   r=   rX   r>   writerx   packsecretstoken_bytesr   getvalue)
rd   r   rl   r   outputr   r   rf   r   r>   s
             r)   	serializezFrame.serialize  sm   $ 	

J# 	*I##D)D	*   88Z!YYzA/!YYzA/ "YYzA/ kk	 	 #
TYYC<LLUE56>BCe^LLVUECKHILLVUECKHI ,,Q/JLL$ dii4D99DT  r(   c                    | j                   s| j                  s| j                  rt        d      | j                  t
        v r;t        | j                        dkD  rt        d      | j                  st        d      yy)z
        Check that reserved bits and opcode have acceptable values.

        Raises:
            ProtocolError: If a reserved bit or the opcode is invalid.

        zreserved bits must be 0}   zcontrol frame too longzfragmented control frameN)	rA   rB   rC   r
   r=   r   rX   r>   r@   rd   s    r)   r|   zFrame.checkO  sh     99		TYY 9::;;,&499~##$<==88#$>??  'r(   returnr^   )
r~   z-Callable[[int], Generator[None, None, bytes]]r   r?   rk   z
int | Nonerl   %Sequence[extensions.Extension] | Noner   zGenerator[None, None, Frame])r   r?   rl   r   r   rZ   r   None)r   r   r   r    __annotations__r@   rA   rB   rC   intosenvirongetr\   rj   classmethodr_   r   r|   r'   r(   r)   r   r   |   s      N
--CD$D$D$ rzz~~&?FGL09d   $<@GAG 	G
 G :G 
&G GZ =A	9! 9! :	9!
 
9!v@r(   r   c                  P    e Zd ZU dZded<   ded<   ddZedd       ZddZdd	Z	y
)r   z
    Code and reason for WebSocket close frames.

    Attributes:
        code: Close code.
        reason: Close reason.

    r   coder^   reasonc                   d| j                   cxk  rdk  rn nd}n;d| j                   cxk  rdk  rn nd}n t        j                  | j                   d      }| j                    d| d}| j                  r| d	| j                   }|S )
zU
        Return a human-readable representation of a close code and reason.

          i  
registered  zprivate useunknownz ()rK   )r   r;   r   r   )rd   explanationresults      r)   rj   zClose.__str__o  s|    
 499#t#&KTYY%%'K155diiKKII;bQ/;;xq.Fr(   c                   t        |      dk\  rIt        j                  d|dd       \  }|dd j                         } | ||      }|j	                          |S t        |      dk(  r | t
        j                  d      S t        d      )z
        Parse the payload of a close frame.

        Args:
            data: Payload of the close frame.

        Raises:
            ProtocolError: If data is ill-formed.
            UnicodeDecodeError: If the reason isn't valid UTF-8.

        r   rv   Nr   rG   zclose frame too short)rX   rx   ry   r[   r|   r   r/   r
   )r}   r>   r   r   closes        r)   r_   zClose.parse  s}     t9>mmD$r(3GT!"X__&Ff%EKKMLY!^y//44 788r(   c                    | j                          t        j                  d| j                        | j                  j                         z   S )z:
        Serialize the payload of a close frame.

        rv   )r|   rx   r   r   r   r   r   s    r)   r   zClose.serialize  s4    
 	

{{4+dkk.@.@.BBBr(   c                    | j                   t        v s-d| j                   cxk  rdk  st        d       t        d      yy)z
        Check that the close code has a valid value for a close frame.

        Raises:
            ProtocolError: If the close code is invalid.

        r   r   zinvalid status codeN)r   EXTERNAL_CLOSE_CODESr
   r   s    r)   r|   zClose.check  sH     		11TTYY5M5M 566 6N 566 6N1r(   Nr   )r>   rZ   r   r   )r   rZ   r   )
r   r   r   r    r   rj   r   r_   r   r|   r'   r(   r)   r   r   a  s7     IK$ 9 9.C	7r(   r   r   )C
__future__r   dataclassesenumr   r   r   rx   collections.abcr   r   typingr   r   
exceptionsr	   r
   speedupsr   ImportErrorutils__all__IntEnumr   r!   r   r"   r   r#   r   r$   r   r%   r   r&   r   r   r   r   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r;   r   r   OK_CLOSE_CODESrZ   	bytearray
memoryview	BytesLike	dataclassr   r   rG   rl   r'   r(   r)   <module>r      sr   "   	 	   / " 4"$
 )T\\ ) ++
++MM	<<
++
++*') . d,. 2= =8 20!!#8.00=?+  , !! "  9j(	 a@ a@ a@H H7 H7 H7X {  "!!"s   I! !I0/I0