
    !ni              	          d dl Z d dlZd dlZd dlZd dlmZ 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mZmZ d dlmZ d dlmZ d d	lmZ d d
lmZ dD ]  Z	  eei i dg      Z n ej8                  ej:                  ej<                  hZdZ ddgZ!dZ" e# e$ e%dd             e$ e%dd            z    e$ e%dd            z    e$ e%dd            z         Z& G d de'      Z( G d d      Z) G d d      Z* G d de'      Z+ G d de'      Z, G d  d!e-      Z. G d" d#e*      Z/y# e$ r d dlmZ d dlmZ Y w xY w# e$ r dZY w xY w)$    N)Random)error)md5sha1)r   )sha)	semaphore)wsgi)socket)	get_errno)zwsaccel.utf8validatorzautobahn.utf8validator i   WebSocketWSGI	WebSockets$   258EAFA5-E914-47DA-95CA-C5AB0DC85B11  i    i  i  i  i  c                         e Zd Zd fd	Z xZS )
BadRequestc                 T    t         t        |           || _        || _        || _        y N)super	Exception__init__statusbodyheaders)selfr   r   r   	__class__s       R/home/homepc/tiktok-worker/venv/lib/python3.12/site-packages/eventlet/websocket.pyr   zBadRequest.__init__9   s%    i')	    )400 Bad RequestNN__name__
__module____qualname__r   __classcell__r   s   @r   r   r   8   s     r   r   c                   ^    e Zd ZdZefdZe	 	 	 	 dd       Zd Zd Z	d Z
d Zd	 Zd
 Zd Zy)r   a  Wraps a websocket handler function in a WSGI application.

    Use it like this::

      @websocket.WebSocketWSGI
      def my_handler(ws):
          from_browser = ws.wait()
          ws.send("from server")

    The single argument to the function will be an instance of
    :class:`WebSocket`.  To close the socket, simply return from the
    function.  Note that the server will log the websocket request at
    the time of closure.

    An optional argument max_frame_length can be given, which will set the
    maximum incoming *uncompressed* payload length of a frame. By default, this
    is set to 8MiB. Note that excessive values here might create a DOS attack
    vector.
    c                 X    || _         d | _        d| _        g | _        d | _        || _        y )NT)handlerprotocol_versionsupport_legacy_versionssupported_protocolsorigin_checkermax_frame_length)r   r(   r-   s      r   r   zWebSocketWSGI.__init__U   s1     $'+$#% " 0r   Nc                 2      fd}||S  ||      S )Nc                 F     |       }|_         |_        r|_        |S r   )r*   r,   r+   )r(   instclsr,   r*   r+   s     r   	decoratorz+WebSocketWSGI.configured.<locals>.decoratorc   s,    w<D+BD("0D"+>(Kr    )r1   r(   r+   r,   r*   r2   s   ` ``` r   
configuredzWebSocketWSGI.configured]   s     	 ?!!r   c                    |j                  dd      j                         j                  d      D cg c]  }|j                          }}d|v r#|j                  dd      j                         dk(  s |ddg       g S 	 d	|v r| j	                  |      }n(| j
                  r| j                  |      }n
t               d|v r
 |d           	 | j                  |       |j                  d       dt         j"                  _        g S c c}w # t        $ rF}|j                  }|j                  xs d
}|j                  xs g }	 ||dg|	z          |gcY d }~S d }~ww xY w# t        $ r}t        |      t        vr Y d }~d }~ww xY w)NHTTP_CONNECTIONr   ,upgradeHTTP_UPGRADE	websocketr   )
ConnectioncloseHTTP_SEC_WEBSOCKET_VERSIONr   zeventlet.set_idleT)getlowersplitstrip_handle_hybi_requestr*   _handle_legacy_requestr   r   r   r   r(   OSErrorr   ACCEPTABLE_CLIENT_ERRORS_send_closing_framer	   
WSGI_LOCALalready_handled)
r   environstart_responseparthttp_connection_partswser   r   r   s
             r   __call__zWebSocketWSGI.__call__n   s     $5r:@@BHHM!O JJL!O !O 22NB/557;F,/F.GHI	+w6..w7--009 l" ')(G'(*	LL
 	t$ +/'	O!O   	XXF66=SDiio2G636@B6M	  	|#;; <	s;   D?>D
 E 
	E;EEE	F%E<<Fc                 Z   d|v r|d   j                         }nd|v r|d   }nt        d      d|v rd| _        d|vrt               d| _        | j                  dk(  ry| j	                  |d         }| j	                  |d         }d|d	   _        |d	   j                  d      }t        j                  d
||      |z   }t        |      j                         }d}|j                  d      dk(  rd}|d|j                  d      |j                  d      |j                  d      }	|j                  d      }
|
|	d|
z   z  }	| j                  dk(  r:d|j                  d      j                         z   dz   |	j                         z   dz   }n{| j                  dk(  rad|j                  d      j                         z   dz   |j                  dd      j                         z   dz   |	j                         z   dz   z   }nt        d      |j                  |       t        ||| j                        S )Neventlet.inputgunicorn.socket8No eventlet.input or gunicorn.socket present in environ.HTTP_SEC_WEBSOCKET_KEY1L   HTTP_SEC_WEBSOCKET_KEY2K      z
wsgi.inputz>IIrM   zwsgi.url_schemehttpswssz://	HTTP_HOSTSCRIPT_NAME	PATH_INFOQUERY_STRING?sg   HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
WebSocket-Origin: HTTP_ORIGINs   
WebSocket-Location:    

sj   HTTP/1.1 101 WebSocket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Origin: s   
Sec-WebSocket-Protocol: HTTP_SEC_WEBSOCKET_PROTOCOLdefaults   
Sec-WebSocket-Location: z#Unknown WebSocket protocol version.)
get_socketr   r)   r   _extract_numbercontent_lengthreadstructpackr   digestr>   encode
ValueErrorsendallr   )r   rI   sockkey1key2key3keyresponseschemelocationqshandshake_replys               r   rC   z$WebSocketWSGI._handle_legacy_request   sy   w&+,779D'),-DVWW$/$&D!(7 l"$&D!  B&''0I(JKD''0I(JKD 45GL!0<(--a0D++eT4047C3x(H ;;()W4FKK$KK&KK$	
 [[(>b H  B&& )0M(B(I(I(KLO(( +3//*;	< ?J	J  ""b(* -4KK,F,M,M,OPS,,
 99ELLNO
R,, /7oo.?@C ##  BCC_%w(=(=>>r   c                 "   |y i }|j                  d      D ]  }|j                  d      }i }|dd  D ]  }|j                  d      }t        |      dk(  r%d||d   j                         j                         <   G|d   j                         j                  d      j                         ||d   j                         j                         <    |j	                  |d   j                         j                         g       j                  |        |S )Nr7   ;   =Tr   ")r@   lenrA   r?   
setdefaultappend)r   headerresextpartsconfigrK   key_vals           r   _parse_extension_headerz%WebSocketWSGI._parse_extension_header   s   ><<$ 		HCIIcNEFab	 _**S/w<1$9=F71:++-33569@9I9I9K9Q9QRU9V9\9\9^F71:++-3356_ NN58>>+113R8??G		H 
r   c                    |sy |j                  d      }|y |D ]  }|j                  dd      |j                  dd      d}t        t        j                  d      }|j                  d      }|9|du r||d<   n/t	        |j                  d|            |d<   d	|d   cxk  rdk  sn |j                  d
      }|<|du r	||d
<   |c S t	        |j                  d
|            |d
<   d	|d
   cxk  rdk  sn |c S  y )Npermessage-deflateserver_no_context_takeoverFclient_no_context_takeover)r   r      server_max_window_bitsTrX   client_max_window_bits)r>   minzlib	MAX_WBITSint)r   
extensionsdeflater   want_config	max_wbitsmwbs          r   _negotiate_permessage_deflatez+WebSocketWSGI._negotiate_permessage_deflate   s6   ..!56? 	F
 /5jj9UW\.].4jj9UW\.]K DNNB/I**56C$;<EK 89 FJJ'?KL   89-E!FL"L **56C$;<EK 89  FJJ'?KL   89-E!FL"L ;	< r   c           	         |sy g }|j                         D ]  \  }}|j                         g}|j                         D ][  \  }}|du r|du r |j                  |j                                /|j                  |dt        |      j                                ] |j                  dj	                  |              dj	                  |      S )NFTr{   s   ; s   , )itemsrk   r   strjoin)r   parsed_extensionsr   namer   	ext_partsrr   values           r   _format_extension_headerz&WebSocketWSGI._format_extension_header  s     -335 		0LD&I$lln M
UE>d]$$SZZ\2$$c%j&A%I%I%KLM LLI./		0 zz%  r   c                 `   d|v r|d   j                         }nd|v r|d   }nt        d      |d   }|dvrt        ddg      t        |      | _        d	|vr
t               |j                  d
| j                  dk  r|j                  dd      nd      }| j                  -| j                  |j                  d      |      st        d      |j                  dd       }d }|r/d |j                  d      D        D ]  }|| j                  v s|} n |d	   }t        j                  t        |j                         t        z         j                               }	dddd|	z   g}
|r"|
j                  d|j                         z          i }| j!                  |j                  d            }| j#                  |      }|||d<   | j%                  |      }||
j                  d|z          |j'                  dj)                  |
      dz          t+        ||| j                  ||| j,                        S )NrQ   rR   rS   r=   )813z426 Upgrade Required)zSec-WebSocket-Versionz8, 13)r   r   HTTP_SEC_WEBSOCKET_KEYr`   rX   HTTP_SEC_WEBSOCKET_ORIGINr   r[   z403 Forbidden)r   rb   c              3   <   K   | ]  }|j                           y wr   )rA   ).0is     r   	<genexpr>z5WebSocketWSGI._handle_hybi_request.<locals>.<genexpr>6  s     >Aaggi>s   r7   s    HTTP/1.1 101 Switching Protocolss   Upgrade: websockets   Connection: Upgrades   Sec-WebSocket-Accept: s   Sec-WebSocket-Protocol: HTTP_SEC_WEBSOCKET_EXTENSIONSr   s   Sec-WebSocket-Extensions: s   
ra   )protocolr   r-   )rd   r   r   r   r)   r>   r,   r@   r+   base64	b64encoder   rk   PROTOCOL_GUIDrj   r   r   r   r   rm   r   RFC6455WebSocketr-   )r   rI   rn   hybi_versionorigin	protocolsnegotiated_protocolprr   rs   rw   r   r   r   formatted_exts                  r   rB   z"WebSocketWSGI._handle_hybi_request  s[   w&+,779D'),-DVWW;<},$:&H%IK K #L 1#72,%%* [[4b9025 *&&w{{;'?H 88KK =tD	">)=> 000*+'
 ./##D)E$F$M$M$OP>014x?A ""#>ATA[A[A]#]^11'++>]2^_
44Z@6=23556GH$""#@=#PQW\\/2[@Agt/D/D)<+<151F1FH 	Hr   c                 z    d}d}|D ]%  }|t         j                  v r||z  }|dk(  s!|dz  }' t        |      |z  S )z
        Utility function which, given a string like 'g98sd  5[]221@1', will
        return 9852211. Used to parse the Sec-WebSocket-Key headers.
        r   r    rz   )stringdigitsr   )r   r   outspaceschars        r   re   zWebSocketWSGI._extract_numberU  sS    
  	Dv}}$t!		
 3x6!!r   )NNNF)r!   r"   r#   __doc__DEFAULT_MAX_FRAME_LENGTHr   classmethodr4   rO   rC   r   r   r   rB   re   r3   r   r   r   r   @   sZ    ( 2J 1 '+"&+0	" " (T<?| $L! 7Hr"r   c                   >    e Zd ZdZd
dZd Zd Zd Zd ZddZ	d Z
y	)r   a{  A websocket object that handles the details of
    serialization/deserialization to the socket.

    The primary way to interact with a :class:`WebSocket` object is to
    call :meth:`send` and :meth:`wait` in order to pass messages back
    and forth with the browser.  Also available are the following
    properties:

    path
        The path value of the request.  This is the same as the WSGI PATH_INFO variable,
        but more convenient.
    protocol
        The value of the Websocket-Protocol header.
    origin
        The value of the 'Origin' header.
    environ
        The full WSGI environment for this request.

    c                 P   |j                  dt        j                        | _        dj	                  |j                  d      |j                  dd      |j                  dd      z   |j                  d      |j                  d      	      | _        || _        |j                  d
      | _        |j                  d      | _        |j                  d      | _	        || _
        || _        d| _        d| _        t        j                         | _        t#        j$                         | _        y)z
        :param socket: The eventlet socket
        :type socket: :class:`eventlet.greenio.GreenSocket`
        :param environ: The wsgi environment
        :param version: The WebSocket spec version to follow (default is 76)
        zwsgi.errorsz-server={shost}/{spath} client={caddr}:{cport}r[   r\   r   r]   REMOTE_ADDRREMOTE_PORT)shostspathcaddrcportr`   HTTP_WEBSOCKET_PROTOCOLFr   N)r>   sysstderrlogformatlog_contextr
   r   r   pathrI   versionwebsocket_closed_bufcollectionsdeque_msgsr   	Semaphore	_sendlock)r   rn   rI   r   s       r   r   zWebSocket.__init__y  s     ;;}cjj9JQQ++k*++mR07;;{B3OO++m,GKK4N R 

 kk-0$=>KK,	 %	 &&(
",,.r   c                     t        |t              r|j                  d      }n)t        |t              st        |      j                         }d|z   dz   }|S )zwPack the message inside ``00`` and ``FF``

        As per the dataframing section (5.3) for the websocket spec
        utf-8       )
isinstancer   rk   bytesr   messagepackeds      r   _pack_messagezWebSocket._pack_message  sL    
 gs#nnW-GGU+'l))+G7"W,r   c                 4   g }d}| j                   }|r~|d   }|dk(  rD|j                  d      }|dk(  rn]|j                  |d| j                  dd             ||dz   d }n-|dk(  r|d   dk(  s
J d	|z         d
| _        nt        d|z        |r~|| _         |S )a1   Parses for messages in the buffer *buf*.  It is assumed that
        the buffer contains the start character for a message, but that it
        may contain only part of the rest of the message.

        Returns an array of messages, and the buffer remainder that
        didn't contain any full messages.r   r   rz   r   replaceN   z Unexpected closing handshake: %rTz6Don't understand how to parse this type of message: %r)r   findr   decoder   rl   )r   msgsend_idxbuf
frame_types        r   _parse_messageszWebSocket._parse_messages  s     iiQJQ((7+b=C'N11'9EF'A+,'s"1v{L$F$LL{(,% !Y\_!_``   	r   c                    | j                  |      }| j                  j                          	 | j                  j	                  |       | j                  j                          y# | j                  j                          w xY w)zSend a message to the browser.

        *message* should be convertable to a string; unicode objects should be
        encodable as utf-8.  Raises socket.error with errno of 32
        (broken pipe) if the socket has already been closed by the client.N)r   r   acquirer
   rm   releaser   s      r   sendzWebSocket.send  s^     ##G, 	 	%KK'NN""$DNN""$s   A# #A?c                 D   | j                   s{| j                  ry| j                  j                  d      }|dk(  ry| xj                  |z  c_        | j                         }| j                   j                  |       | j                   s{| j                   j                         S )a"  Waits for and deserializes messages.

        Returns a single message; the oldest not yet processed. If the client
        has already closed the connection, returns None.  This is different
        from normal socket behavior because the empty string is a valid
        websocket message.Ni  r   )r   r   r
   recvr   r   extendpopleft)r   deltar   s      r   waitzWebSocket.wait  s     **$$KK$$T*E|III'')DJJd# ** zz!!##r   c                     | j                   dk(  r1| j                  s$	 | j                  j                  d       d| _        yyy# t        $ r |s Y w xY w)z3Sends the closing frame to the client, if required.rU   s    TN)r   r   r
   rm   rD   )r   ignore_send_errorss     r   rF   zWebSocket._send_closing_frame  s]    <<2d&;&;##K0 %)D! '<   * *s   A AAc                    	 | j                  d       | j                  j                  d       | j                  j                          y# t        $ r]}|j                  t        j
                  k7  r6| j                  j                  dj                  | j                  |             Y d}~|d}~ww xY w# | j                  j                          w xY w)cForcibly close the websocket; generally it is preferable to
        return from the handler method.T {ctx} socket shutdown error: {e}ctxrN   N)rF   r
   shutdownrD   errnoENOTCONNr   writer   r   r<   )r   rN   s     r   r<   zWebSocket.close  s    	 $$T*KK  &
 KK	  	eww%..(AHHTM]M]abHcd	e KKs*   ,A	 		B/AB*%B2 *B//B2 2CN)rU   F)r!   r"   r#   r   r   r   r   r   r   rF   r<   r3   r   r   r   r   d  s*    (/0
:%$(
)
 r   c                       e Zd Zy)ConnectionClosedErrorNr!   r"   r#   r3   r   r   r  r        r   r  c                        e Zd Z fdZ xZS )FailedConnectionErrorc                 B    t         |   ||       || _        || _        y r   )r   r   r   r   )r   r   r   r   s      r   r   zFailedConnectionError.__init__  s     )r   r    r%   s   @r   r  r    s     r   r  c                       e Zd Zy)ProtocolErrorNr  r3   r   r   r
  r
    r  r   r
  c                        e Zd Zddddef fd	Z G d d      Zd Zd Zd	 Z G d
 d      Z	e
dd       Zd Zd ZddZ	 	 ddZd Zd Zd ZddZddZ xZS )r      NFc                     t         |   |||       | j                         | _        || _        || _        |xs i | _        d | _        d | _        || _	        d | _
        y r   )r   r   _iter_framesiteratorclientr   r   _deflate_enc_deflate_decr-   _remote_close_data)	r   rn   rI   r   r   r  r   r-   r   s	           r   r   zRFC6455WebSocket.__init__  s^    w0))+ $*   0"&r   c                        e Zd Zd Zd ZddZy)RFC6455WebSocket.UTF8Decoderc                     t         rt         j                         | _        nd | _        t        j                  d      } |       | _        y )Nutf8)utf8validatorUtf8Validator	validatorcodecsgetincrementaldecoderdecoder)r   decoderclasss     r   r   z%RFC6455WebSocket.UTF8Decoder.__init__  s5    !.!<!<!>!%!77?L'>DLr   c                     | j                   r| j                   j                          | j                  j                          y r   )r  resetr  )r   s    r   r   z"RFC6455WebSocket.UTF8Decoder.reset  s)    ~~$$&LL r   c                     | j                   r-| j                   j                  |      \  }}}}|st        d      | j                  j	                  ||      S )NzData is not valid unicode)r  validaterl   r  r   )r   datafinalvalideocpc_it_is          r   r   z#RFC6455WebSocket.UTF8Decoder.decode!  sL    ~~(,(?(?(E%tS#$%@AA<<&&tU33r   Nr  )r!   r"   r#   r   r   r   r3   r   r   UTF8Decoderr    s    	*	!
	4r   r)  c                       j                   j                  d      y  fd}j                   j                  rdnd      r |       S  j                   |        _         j                  S )Nr   c                      t        j                  t         j                  t         j                   j	                  j
                  rdndt         j                               S )Nr   r   )r   compressobjZ_DEFAULT_COMPRESSIONDEFLATEDr>   r  r   optionsr   s   r   _makez;RFC6455WebSocket._get_permessage_deflate_enc.<locals>._make-  sL    ##D$>$>%,[[T[[1I6N15&A %AB Br   r   r   )r   r>   r  r  )r   r1  r0  s   ` @r   _get_permessage_deflate_encz,RFC6455WebSocket._get_permessage_deflate_enc(  sk    //%%&:;?	B ;;t{{38: 7N  ($)G!$$$r   c                       j                   j                  d      |sy  fd}j                   j                  rdnd      r |       S  j                   |        _         j                  S )Nr   c                      t        j                   j                  j                  rdndt         j                               S )Nr   r   )r   decompressobjr>   r  r   r/  s   r   r1  z;RFC6455WebSocket._get_permessage_deflate_dec.<locals>._makeA  s=    %%w{{t{{3K8P37>>(C 'C D Dr   r   r   )r   r>   r  r  )r   rsv1r1  r0  s   `  @r   _get_permessage_deflate_decz,RFC6455WebSocket._get_permessage_deflate_dec<  sm    //%%&:;?$	D
 ;;t{{38: 7N  ($)G!$$$r   c                     d}t        |      |k  rG| j                  j                  |t        |      z
        }|s
t               ||z   }t        |      |k  rG|S )Nr   )r}   r
   r   r  )r   numbytesr#  ds       r   
_get_byteszRFC6455WebSocket._get_bytesO  sZ    $i("  CI!56A+--!8D	 $i("
 r   c                   "    e Zd ZddZddZd Zy)RFC6455WebSocket.MessageNc                 X    || _         g | _        d| _        || _        || _        || _        y )NF)r  r#  finishedopcodedecompressorr-   )r   r@  r-   r  rA  s        r   r   z!RFC6455WebSocket.Message.__init__Y  s.    "DLDI!DM DK ,D$4D!r   c                 H    || _         | j                  j                  |       y r   )r?  r#  r   )r   r#  r$  s      r   pushzRFC6455WebSocket.Message.pusha  s    !DMIIT"r   c                    dj                  | j                        }| j                  dz  sp| j                  rd| j                  j	                  |dz   | j
                        }| j                  j                  r%t        ddj                  | j
                              | j                  r&| j                  j                  || j                        }|S )Nr   rX          z;Incoming compressed frame exceeds length limit of {} bytes.)r   r#  r@  rA  
decompressr-   unconsumed_tailr  r   r  r   r?  )r   r#  s     r   getvaluez!RFC6455WebSocket.Message.getvaluee  s    88DII&D;;?t'8'8((33D;N4NPTPePef$$44/U\\]a]r]rsu u ||||**4?Kr   )NNr  )r!   r"   r#   r   rC  rI  r3   r   r   Messager=  X  s    	5	#	r   rJ  c                 p     |t               }t        |      }dj                   fd|D              S )Nr   c              3   T   K   | ]  }t        |   |z   d z     z  f       ! yw)   N)r   )r   r   r#  maskoffsets     r   r   z/RFC6455WebSocket._apply_mask.<locals>.<genexpr>w  s0     PqtAwvzQ.>)??ABPs   %()r}   ranger   )r#  rN  lengthrO  cnts   `` ` r   _apply_maskzRFC6455WebSocket._apply_maskr  s/    >YFFmxxPCPPPr   c                    |dk(  r|| _         |sd}ndt        |      dkD  rTt        j                  d|      d   }|r|t        vrt        dd      	 | j                         j                  |dd  d	      }nd}| j                  |df       t               |dk(  r| j                  |d       y |dk(  ry t        dd      # t        t        f$ r t        dd
      w xY w)NrX   r   rz   !Hr     zUnexpected close status code.   Tz)Close message data should be valid UTF-8.r   
close_data	   
   control_codezUnknown control frame received.)r  r}   rh   unpack_fromVALID_CLOSE_STATUSr  r)  r   UnicodeDecodeErrorrl   r<   r  r   )r   r@  r#  r   s       r   _handle_control_framez&RFC6455WebSocket._handle_control_framey  s   Q;&*D#TQ++D$7:/A!A/79 9E++-44T!"XtDD JJ62,J/'))q[IIdI-s]'79 9 +J7 E/CE EEs   #B? ?Cc              #     K   d }	 	 | j                  |      }|j                  dz  r+| j                  |j                  |j                                M|r||urt	        d      |}|j
                  r|j                         }d }| # t        $ rC t        j                         \  }}}| j                  |j                  |j                  f       Y y t        $ r Y y t        $ r | j                  d        w xY ww)N)r   rX   zUnexpected message change.rX  )i  zInternal Server Error)_recv_framer@  ra  rI  RuntimeErrorr?  r  r   exc_infor<   r   r   r  r   )r   fragmented_messager   r#  exc_typexc_valexc_tbs          r   r  zRFC6455WebSocket._iter_frames  s     !	**3E*F>>A%..(8(8(:<%'9K*K&'CDD%,"##-668D)-&J  % 	E'*||~$GWfJJ7>>7??"CJD$ 	 	JJ"AJB	s0   C=BB	 	A	C:C=C:C=C::C=c                    | j                   } |d      }t        j                  d|      \  }}|dz	  dk(  }|dz	  dz  }|dz  }|r|rd| j                  vrt	        dd      |d	z  }	|	d
vrt	        dd      |dz  dk(  }
|
s| j
                  st	        dd      |dz  }|	dz  r|st	        dd      |dkD  r,t	        dd      |	r|rt	        dd      |	s|st	        dd      |dk(  r t        j                  d |d            d   }n$|dk(  rt        j                  d |d            d   }|| j                  kD  r&t	        ddj                  || j                              |
rt        j                  d |d            }d}|r|	dz  rG|	dk(  r| j                         nd }| j                  |      }| j                  |	| j                  ||      }|s|j                  d|       |S ||k  rk| j                  j                  ||z
        }|s
t               t        |      }|
r| j!                  |||      }||z   }	 |j                  ||       ||k  rk|S # t"        t$        f$ r t	        d d!      w xY w)"NrW  z!BB   rz   rM  r   rV  zhRSV1, RSV2, RSV3: MUST be 0 unless an extension is negotiated that defines meanings for non-zero values.r   )r   rz   rW  rX   rZ  r[  zUnknown opcode received.   z9A client MUST mask all frames that it sends to the server   rX   z&Control frames must not be fragmented.}   zBAll control frames MUST have a payload length of 125 bytes or lessz=Received a non-continuation opcode within fragmented message.zAReceived continuation opcode with no previous fragments received.~   rU  r   z!QrF  z=Incoming frame of {} bytes is above length limit of {} bytes.!BBBB)r  rA  r   )r$  )rQ  rO  r   zText data must be valid utf-8)r;  rh   unpackr   r  r  r-   r   r)  r7  rJ  rC  r
   r   r  r}   rS  r`  rl   )r   r   r   r   abr?  rsv123r6  r@  maskedrQ  rN  receivedr  rA  r:  dlens                     r   rc  zRFC6455WebSocket._recv_frame  s    a}}UF+16Q;a!z,DOOC+MN N R--'.HIISCdkk' /G H HSA:+D 3> ? ?|+%& & ''( ( ''( ( S=]]4a1!4Fs]]]4a1!4FD)))'.m.t.t--// 0 0==$q'2D&1*,2aKd&&(TG;;DALll64+@+@'`llmGLLHL-  V#KK$$Vh%67/111v((Dh(OA#d??LL(L3 V#  +J7 ?/=? ??s   ;I I2c                    d}t        |t              r|j                  d      }d}d}| j                         }|xs ddz  }	|rH|rF|	sD|j	                  |      }||j                  t        j                        z  }|dd  dk(  sJ |d d }d}t        |      }
|
sd}|rH|d	vrt        d
      |s|st        d      |
dkD  rt        d      t        j                  d|dz        }n*|rdn|rdnd|z  }t        j                  d||rdndz        }|rdnd}|
dkD  rt        j                  d|dz  |
      }n9|
dkD  rt        j                  d|dz  |
      }nt        j                  d||
z        }|rrt        t        j                               }t        d      D cg c]  }|j                  d       }}t         j#                  |||
      }t        j                  dg| }nd}dj%                  ||||f      S c c}w )NFr   Tr   rX   rE  @   )rX   rZ  r[  zUnknown control opcode.z#Control frame cannot be a fragment.rn  z$Control frame data too large (>125).z!Brl  rz   rW  i  z!BQrm  z!BHro  rM  rp  r   )r   r   rk   r2  compressflushr   Z_SYNC_FLUSHr}   r
  rh   ri   r   timerP  getrandbitsr   rS  r   )r   r   ru  continuationr$  r]  is_textcompress_bit
compressoris_control_framerQ  r   r@  
lengthdatarand_rN  maskdatas                     r   r   zRFC6455WebSocket._pack_message  s	   gs#nnW-GG557
 )-A2
 z*: ))'2Gz''(9(9::G23<#6666crlG!LWF;.#$=>>5#$IJJ|#$JKK[[|f'<=F&Q7a\-QF[[v5a'HIF%V1
E>UJ,<fEJc\UJ,<fEJT:+>?J $))+&D16q:AD$$Q':D:&227D&IG{{72T2HHxxXw?@@ ;s   G8c                 ,    | j                   D ]  }|c S  y r   )r  )r   r   s     r   r   zRFC6455WebSocket.wait8  s     	AH	r   c                     | j                   j                          	 | j                  j                  |       | j                   j	                          y # | j                   j	                          w xY wr   )r   r   r
   rm   r   )r   frames     r   _sendzRFC6455WebSocket._send<  sJ     	%KK&NN""$DNN""$s   A A.c                 j    | j                   |d<    | j                  |fi |}| j                  |       y )Nru  )r  r   r  )r   r   kwpayloads       r   r   zRFC6455WebSocket.sendC  s2    {{8$$$$W33

7r   c                    | j                   dv rm| j                  s`|@|\  }}t        |t              r|j	                  d      }t        j                  d|      |z   }nd}	 | j                  |d       d| _        y y y # t        $ r |s Y w xY w)N)rX   r  r   rU  r   rX   r\  T)	r   r   r   r   rk   rh   ri   r   rD   )r   r   rY  r   msgr#  s         r   rF   z$RFC6455WebSocket._send_closing_frameH  s    <<7"4+@+@%(c3'**W-C{{4036		$Q	/ %)D! ,A"   * *s    A= =BBc                    	 | j                  |d       | j                  j                  t        j                         | j                  j                          y# t        $ r]}|j
                  t
        j                  k7  r6| j                  j                  dj                  | j                  |             Y d}~|d}~ww xY w# | j                  j                          w xY w)r   T)rY  r   r   r   N)rF   r
   r   SHUT_WRrD   r   r   r   r   r   r   r<   )r   rY  rN   s      r   r<   zRFC6455WebSocket.closeZ  s    	 $$
t$TKK  0
 KK	  	eww%..(AHHTM]M]abHcd	e KKs*   <A 	B?"AB:5C :B??C C)Nr   r   )FFTN)FN)r!   r"   r#   r   r   r)  r2  r7  r;  rJ  staticmethodrS  ra  r  rc  r   r   r  r   rF   r<   r$   r%   s   @r   r   r     s    .04Z^":'4 4*%(%& 4 Q Q9:2KZ -2CG:Ax%
)$
 r   r   )0r   r  r   r   randomr   r
   r   SocketErrorr   rh   r   r~  r   hashlibr   r   ImportErrorr   eventletr   r	   eventlet.greeneventlet.supportr   _mod
__import__r  
ECONNRESETEPIPE	ESHUTDOWNrE   r   __all__r   setlistrP  r_  r   r   r   r   r  r  rl   r
  r   r3   r   r   <module>r     s{        '   
   !
   ! &
 @ 	D"4R"6 		 ",,ekk5??K " K
(7tT	tT	 	tT		 	tT		  a" a"H	O  O d	I 	I 	J 	_ y _ k    $  s#   D# D:#D76D7:EE