
    5              
       p   S r SSKrSSKrSSKrSSKrSSK7  SSKJr  SSKJ	r	   \R                  (       a  SSKrOSr  \(       d	  SSKJr  S r/ S
Q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\\\\\\\\\\4
r " S S\5      r  " S S\5      r! " S S\5      r"g! \ a    Sr Ngf = f! \ a    S	 r Nef = f)aL  
websocket - WebSocket client library for Python

Copyright (C) 2010 Hiroki Ohtani(liris)

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor,
    Boston, MA  02110-1335  USA

    N   )*)validate_utf8)Lock)XorMaskerSimplec                 6    [        U 5      R                  U5      $ N)r   process)_m_ds     "lib/third_party/websocket/_abnf.py_maskr   -   s    "2&..r22    c                     [        [        U5      5       H  nX==   XS-     -  ss'   M     [        R                  (       a  UR	                  5       $ UR                  5       $ )N   )rangelensixPY3tobytestostring)r   r   is      r   r   r   1   sG    s2wAERAYE   77::<;;= r   )ABNFcontinuous_frameframe_bufferSTATUS_NORMALSTATUS_GOING_AWAYSTATUS_PROTOCOL_ERRORSTATUS_UNSUPPORTED_DATA_TYPESTATUS_STATUS_NOT_AVAILABLESTATUS_ABNORMAL_CLOSEDSTATUS_INVALID_PAYLOADSTATUS_POLICY_VIOLATIONSTATUS_MESSAGE_TOO_BIGSTATUS_INVALID_EXTENSIONSTATUS_UNEXPECTED_CONDITIONSTATUS_BAD_GATEWAYSTATUS_TLS_HANDSHAKE_ERRORi  i  i  i  i  i  i  i  i  i  i  i  i  c                       \ rS rSrSrSrSrSrSrSr	Sr
\\\\\	\
4r\S	\S
\S\S\	S\
S0rSrSrSrSSSS\SS4S jrSS jr\S 5       rS r\SS j5       rS rS r\S 5       rSrg)r   i   zm
ABNF frame class.
see http://tools.ietf.org/html/rfc5234
and http://tools.ietf.org/html/rfc6455#section-5.2
r   r         	   
   conttextbinaryclosepingpong~   i   l             c                     Xl         X l        X0l        X@l        XPl        X`l        Uc  SnXpl        [        R                  U l	        g)z7
Constructor for ABNF.
please check RFC for arguments.
Nr6   )
finrsv1rsv2rsv3opcodemaskdataosurandomget_mask_key)selfr8   r9   r:   r;   r<   r=   r>   s           r   __init__ABNF.__init__   s=     				<D	JJr   c                 B   U R                   (       d"  U R                  (       d  U R                  (       a  [        S5      eU R                  [
        R                  ;  a  [        SU R                  5      eU R                  [
        R                  :X  a  U R                  (       d  [        S5      eU R                  [
        R                  :X  a  [        U R                  5      nU(       d  gUS:X  d  US:  a  [        S5      eUS:  a/  U(       d(  [        U R                  SS 5      (       d  [        S5      eS	[        R                  " U R                  S
S 5      -  [        R                  " U R                  SS 5      -   nU R                  U5      (       d  [        S5      egg)zF
validate the ABNF frame.
skip_utf8_validation: skip utf8 validation.
zrsv is not implemented, yetzInvalid opcode %rzInvalid ping frame.Nr   r5   zInvalid close frame.r+      r   zInvalid close opcode.)r9   r:   r;   WebSocketProtocolExceptionr<   r   OPCODESOPCODE_PINGr8   OPCODE_CLOSEr   r>   r   r   byte2int_is_valid_close_status)rB   skip_utf8_validationlcodes       r   validateABNF.validate   s6   
 99		TYY,-JKK;;dll*,-@$++NN;;$***488,-BCC;;$+++DIIAAvc01GHH1u1-		RSRT:V:V01GHHTYYq^,-/2||DIIaN/KLD..t4401HII 5 ,r   c                 L    U [         ;   =(       d    SU s=:*  =(       a    S:  $ s  $ )Ni  i  )VALID_CLOSE_STATUS)rO   s    r   rL   ABNF._is_valid_close_status   s&    ))Bdd.A.AT.AB.ABr   c                     S[        U R                  5      -   S-   [        U R                  5      -   S-   [        U R                  5      -   $ )Nzfin=z opcode=z data=)strr8   r<   r>   rB   s    r   __str__ABNF.__str__   sH    DHH%t{{+,TYY( 	(r   c           	          U[         R                  :X  a0  [        U [        R                  5      (       a  U R                  S5      n [        USSSUSU 5      $ )aN  
create frame to send text, binary and other data.

data: data to send. This is string value(byte array).
    if opcode is OPCODE_TEXT and this value is unicode,
    data value is converted into unicode string, automatically.

opcode: operation code. please see OPCODE_XXX.

fin: fin flag. if set to 0, create continue fragmentation.
utf-8r   r   )r   OPCODE_TEXT
isinstancer   	text_typeencode)r>   r<   r8   s      r   create_frameABNF.create_frame   sG     T%%%*T3==*I*I;;w'DCAq&!T22r   c                 |   [        S U R                  U R                  U R                  U R                  4 5       5      (       a  [        S5      eU R                  [        R                  ;  a  [        S5      e[        U R                  5      nU[        R                  :  a  [        S5      e[        U R                  S-  U R                  S-  -  U R                  S-  -  U R                  S-  -  U R                  -  5      nU[        R                  :  a5  U[        U R                  S-  U-  5      -  n[        R                   " U5      nOU[        R"                  :  aO  U[        U R                  S-  S	-  5      -  n[        R                   " U5      nU[$        R&                  " S
U5      -  nONU[        U R                  S-  S-  5      -  n[        R                   " U5      nU[$        R&                  " SU5      -  nU R                  (       d  X R                  -   $ U R)                  S5      nX R+                  U5      -   $ )zB
format this object to string(byte array) to send data to server.
c              3   *   #    U  H	  oS ;  v   M     g7f))r   r   N .0xs     r   	<genexpr>ABNF.format.<locals>.<genexpr>   s     T(S1(Ss   z
not 0 or 1zInvalid OPCODEzdata is too long         r   r5   !H   !Q)anyr8   r9   r:   r;   
ValueErrorr<   r   rH   r   r>   	LENGTH_63chrLENGTH_7r=   r   b	LENGTH_16structpackrA   _get_masked)rB   lengthframe_headermask_keys       r   formatABNF.format   s    T499dii(STTT\**;;dll*-..TYYT^^#/00488q=!YY!^,.2ii1n=?CyyA~N![[) * DMM!C		Q 788L55.Ldnn$C		Q 566L55.LFKKf55LC		Q 566L55.LFKKf55Lyy))++((+H"2"28"<<<r   c                     [         R                  XR                  5      n[        U[        R
                  5      (       a  UR                  S5      nX-   $ )Nr[   )r   r=   r>   r]   r   r^   r_   )rB   r|   ss      r   ry   ABNF._get_masked   s;    IIh		*h..w/H|r   c                    Uc  Sn[        U [        R                  5      (       a  [        R                  " U 5      n [        U[        R                  5      (       a  [        R                  " U5      n[        (       a  [        U5      nU S   S-  U S   S-  -  U S   S-  -  U S	   -  nU[        S
S[        U5      S-  -
  -  S5      -  n[        R                  " USS9n[        R                  " XC/5      R                  S5      n[        U5      U:  a  UR                  5       SU $ UR                  5       $ [        R                  " SU 5      n[        R                  " SU5      n[        Xg5      $ )zl
mask or unmask data. Just do xor for each byte

mask_key: 4 byte string(byte).

data: data to mask/unmask.
Nr6         r+      r   r,   r    r   zus-asciiuint32)dtypeB)r]   r   r^   ru   numpyr   bytes
frombufferbitwise_xorastyper   arrayr   )r|   r>   origlen	_mask_keyamaskedr   r   s           r   r=   	ABNF.mask   s9    <Dh..uuXHdCMM**55;D5$iG r)HQK2,==q@PPS[\]S^^I E#c$i!m!45zBBD  X6A&&q+6==hGF4y7"^^%hw//>>##S(+BS$'B= r   )r>   r8   rA   r=   r<   r9   r:   r;   N)F)r   )__name__
__module____qualname____firstlineno____doc__OPCODE_CONTr\   OPCODE_BINARYrJ   rI   OPCODE_PONGrH   
OPCODE_MAPrt   rv   rr   rC   rP   staticmethodrL   rX   r`   r}   ry   r=   __static_attributes__rd   r   r   r   r   i   s     KKMLKK KK)G
 	VVxgVVJ HII111#!"'"J8 C C(
 3 3"=B ! !r   r   c                   ^    \ 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)r   i  rl   rk   c                 h    Xl         X l        / U l        U R                  5         [	        5       U l        g r	   )recvrM   recv_bufferclearr   lock)rB   recv_fnrM   s      r   rC   frame_buffer.__init__#  s)    	$8! 

F	r   c                 .    S U l         S U l        S U l        g r	   )headerrz   r=   rW   s    r   r   frame_buffer.clear,  s    	r   c                     U R                   S L $ r	   )r   rW   s    r   has_received_header frame_buffer.has_received_header1      {{d""r   c                 4   U R                  S5      nUS   n[        R                  (       a  [        U5      nUS-	  S-  nUS-	  S-  nUS-	  S-  nUS-	  S-  nUS-  nUS   n[        R                  (       a  [        U5      nUS-	  S-  n	US	-  n
X4XVXyU
4U l        g )
Nr+   r   rj   r   rk   rl   r      rn   )recv_strictr   PY2ordr   )rB   r   b1r8   r9   r:   r;   r<   b2has_masklength_bitss              r   recv_headerframe_buffer.recv_header4  s    !!!$AY77RBAgkQw{Qw{Qw{cAY77RB7Q;4i$fLr   c                 `    U R                   (       d  gU R                   [        R                     $ )NF)r   r   _HEADER_MASK_INDEXrW   s    r   r   frame_buffer.has_maskJ  s!    {{{{<::;;r   c                     U R                   S L $ r	   )rz   rW   s    r   has_received_length frame_buffer.has_received_lengthO  r   r   c                 0   U R                   [        R                     nUS-  nUS:X  a1  U R                  S5      n[        R
                  " SU5      S   U l        g US:X  a1  U R                  S5      n[        R
                  " SU5      S   U l        g X l        g )Nrn   r5   r+   rm   r   r,   ro   )r   r   _HEADER_LENGTH_INDEXr   rw   unpackrz   )rB   bitsr   vs       r   recv_lengthframe_buffer.recv_lengthR  s    {{<<<=Tk$  #A --a03DKD   #A --a03DK%Kr   c                     U R                   S L $ r	   )r=   rW   s    r   has_received_maskframe_buffer.has_received_mask^  s    yyD  r   c                 j    U R                  5       (       a  U R                  S5      U l        g SU l        g )Nr   r6   )r   r   r=   rW   s    r   	recv_maskframe_buffer.recv_maska  s$    +/==??D$$Q'		r   c           
      P   U R                      U R                  5       (       a  U R                  5         U R                  u  pp4pVnU R	                  5       (       a  U R                  5         U R                  nU R                  5       (       a  U R                  5         U R                  n	U R                  U5      n
U(       a  [        R                  X5      n
U R                  5         [        XX4XVU
5      nUR                  U R                  5        S S S 5        U$ ! , (       d  f       W$ = fr	   )r   r   r   r   r   r   rz   r   r   r=   r   r   r   rP   rM   )rB   r8   r9   r:   r;   r<   r   _rz   r=   payloadframes               r   
recv_frameframe_buffer.recv_framed  s    YY''))  ";?;;8SFa ''))  "[[F %%'' 99D &&v.G))D2 JJLD'JENN44453 6 7 Y6 s   C?D
D%c                 ~   U[        S U R                   5       5      -
  nUS:  aL  U R                  [        SU5      5      nU R                  R	                  U5        U[        U5      -  nUS:  a  ML  [        R                  " S5      R                  U R                  5      nUS:X  a	  / U l        U$ XAS  /U l        US U $ )Nc              3   8   #    U  H  n[        U5      v   M     g 7fr	   )r   re   s     r   rh   +frame_buffer.recv_strict.<locals>.<genexpr>  s      B1AAQ1As   r   i @  r6   )	sumr   r   minappendr   r   ru   join)rB   bufsizeshortagebytes_unifieds        r   r   frame_buffer.recv_strict  s    S B1A1A BBBl YYs5(34F##F+F#H l %%)..!1!12q=!DN ' 12D8G$$r   )r   rz   r   r=   r   r   rM   N)r   r   r   r   r   r   rC   r   r   r   r   r   r   r   r   r   r   r   rd   r   r   r   r     sG    
#M,<
#
&!C>%r   r   c                   2    \ rS rSrS rS rS rS rS rSr	g)	r   i  c                 8    Xl         X l        S U l        S U l        g r	   )fire_cont_framerM   	cont_datarecving_frames)rB   r   rM   s      r   rC   continuous_frame.__init__  s    .$8!"r   c                    U R                   (       d)  UR                  [        R                  :X  a  [	        S5      eU R                   (       a:  UR                  [        R
                  [        R                  4;   a  [	        S5      eg g )NzIllegal frame)r   r<   r   r   rG   r\   r   rB   r   s     r   rP   continuous_frame.validate  sc    ""u||t7G7G'G,_==!1!143E3E FF,_== G r   c                 T   U R                   (       a"  U R                   S==   UR                  -  ss'   O\UR                  [        R                  [        R
                  4;   a  UR                  U l        UR                  UR                  /U l         UR                  (       a  S U l        g g )Nr   )r   r>   r<   r   r\   r   r   r8   r   s     r   addcontinuous_frame.add  sr    >>NN1+|| 0 0$2D2DEE&+ll##llEJJ7DN99"&D r   c                 @    UR                   =(       d    U R                  $ r	   )r8   r   r   s     r   is_firecontinuous_frame.is_fire  s    yy0D000r   c                 2   U R                   nS U l         US   Ul        U R                  (       dc  US   [        R                  :X  aL  U R
                  (       d;  [        UR                  5      (       d!  [        S[        UR                  5      -   5      eUS   U/$ )Nr   r   zcannot decode: )	r   r>   r   r   r\   rM   r   WebSocketPayloadExceptionrepr)rB   r   r>   s      r   extractcontinuous_frame.extract  s    ~~!W
##Q43C3C(CDLeLen{  }B  }G  }G  oH  oH+!D$446 6 Qr   )r   r   r   rM   N)
r   r   r   r   rC   rP   r   r   r   r   rd   r   r   r   r     s    #>	'1 r   r   )#r   r   r?   rw   r   _exceptions_utilsr   	threadingr   r   r   ImportErrorwsaccel.xormaskr   r   __all__r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   rS   objectr   r   r   rd   r   r   <module>r      s  *  	  
  ! 
ww!3	3$   # "      "  !    s!6 s!lx%6 x%v% v % k  E  	!!	!s'   B B B) B&%B&)	B54B5