B ` b@sjdZddlZddlZddlZddlZddlZddlZddlZddlm Z ddl m Z ddl m Z mZmZmZmZmZddlmZddlmZdd lmZd ZGd d d e Zd deDZGddde ZdZe djZe djZ e dj!Z"e dj#Z$e dj#Z%e dj#Z&e dj#Z'dZ(dZ)e*ddddgZ+Gddde+Z,e,ej-ddZ.e,ej/ddZ0Gdd d e1Z2Gd!d"d"e1Z3ej4Z5d#d$e6d%DZ7e8e9dd&d'd(Z:ere:Z;n0ydd)lk re:Z;YnXe8ddd*d*gZ?e@d+ZAe@d,ZBd;eeCeDeeEeDfd.d/d0ZFd-sr$c@sPeZdZdZdZdZdZdZdZdZ dZ d Z eZ eZ eZeZeZe Ze Ze Zd S) rrr  iiN)rrr CONTINUATIONTEXTBINARYPINGPONGCLOSECLOSINGCLOSEDERRORtextbinarypingpongcloseclosingclosederrorrrrr r0s"rs$258EAFA5-E914-47DA-95CA-C5AB0DC85B11z!Hz!Qz!BBz!BBHz!BBQi@i_WSMessageBasetypedataextrac@s.eZdZejdeegefedddZdS)r)loads)r?returncCs ||jS)zAReturn parsed JSON data. .. versionadded:: 0.22 )r=)selfr?rrr jsonZszWSMessage.jsonN)rrrrBr?rrrrrr rYsrcs8eZdZdZeeddfdd ZedddZZS) rz WebSocket protocol parser error.N)codemessager@cs||_t||dS)N)rCsuper__init__)rArCrD) __class__rr rFiszWebSocketError.__init__)r@cCs |jdS)Nr )args)rArrr __str__mszWebSocketError.__str__) rrr__doc__r!strrFrI __classcell__rr)rGr rfsrc@seZdZdZdS)WSHandshakeErrorz#WebSocket protocol handshake error.N)rrrrJrrrr rMqsrMcs&g|]tfddtdDqS)c3s|]}|AVqdS)Nr)r"a)brr ysz.r))bytesrange)r"r)rOr ysrSr))maskr=r@cCst|tst|t|dks&t||rdd|D\}}}}|ddd||ddd<|ddd||ddd<|ddd||ddd<|ddd||ddd<dS)awWebsocket masking function. `mask` is a `bytes` object of length 4; `data` is a `bytearray` object of any length. The contents of `data` are masked with `mask`, as specified in section 5.3 of RFC 6455. Note that this function mutates the `data` argument. This pure-python implementation may be replaced by an optimized version when available. css|]}t|VqdS)N) _XOR_TABLE)r"nrrr rPsz)_websocket_mask_python..Nr r%) isinstance bytearrayAssertionErrorlen translate)rTr=rNrOcdrrr _websocket_mask_python|s r`)_websocket_mask_cythonz^(?:;\s*(?:(server_no_context_takeover)|(client_no_context_takeover)|(server_max_window_bits(?:=(\d+))?)|(client_max_window_bits(?:=(\d+))?)))*$zpermessage-deflate([^,]+)?F)extstrisserverr@cCs|sdSd}d}xt|D]}|d}|s4d}Pt|}|rd}|r|drxt|d}|dksr|dkrxd}q|drd}Pq|d rt|d }|dks|dkrtd |d rd}Pq|std |dqW||fS) N)rFrFr rUr&TzInvalid window sizer%z#Extension for deflate not supported)_WS_EXT_RE_SPLITfinditergroup _WS_EXT_REmatchr!rM)rcrdcompress notakeoverextZdefextrkrrr ws_ext_parses>      rore)rlrdserver_notakeoverr@cCs^|dks|dkrtddg}|s,|d|dkrF|dt||rT|dd|S) Nr&rezCCompress wbits must between 9 and 15, zlib does not support wbits=8zpermessage-deflateZclient_max_window_bitszserver_max_window_bits=Zserver_no_context_takeoverz; ) ValueErrorappendrKjoin)rlrdrpZ enabledextrrr ws_ext_gens  rtc@seZdZdZdZdZdZdS) WSParserStater r%rXrUN)rrr READ_HEADERREAD_PAYLOAD_LENGTHREAD_PAYLOAD_MASK READ_PAYLOADrrrr rusruc@seZdZdeeeeddddZddddZe e ee fd d d Z e e ee fd d d Z e e e eeeeeefdddZdS)rTN)queue max_msg_sizerlr@cCsp||_||_d|_t|_tj|_d|_d|_ d|_ t|_ d|_ d|_ d|_d|_d|_d|_d|_||_dS)NFr)rz _max_msg_size_excrZ_partialrurv_state_opcode _frame_fin _frame_opcode_frame_payload_tail _has_mask _frame_mask_payload_length_payload_length_flag _compressed_decompressobj _compress)rArzr{rlrrr rFs"zWebSocketReader.__init__)r@cCs|jdS)N)rzfeed_eof)rArrr rszWebSocketReader.feed_eof)r=r@c CsR|jrd|fSy ||Stk rL}z||_|j|dSd}~XYnXdS)NT)Tr|)r~ _feed_data ExceptionrzZ set_exception)rAr=excrrr feed_datas  zWebSocketReader.feed_datac Csx||D]x\}}}}|r8|js8tjtj d|_|tjkr"t|dkrt|ddd}|dkr|t krt t j d|y|dd d}Wn0tk r}zt t jd|Wdd}~XYnXttj||} n4|rt t j d|d |d |nttjdd } |j| dq|tjkrL|jttj|d t|q|tjkrv|jttj|d t|q|tjtjfkr|jdkrt t j d |q|s|tjkr||_|j||jrt|j|jkrt t jd t|j|jq|jr*|tjkr*t t j d ||tjkrR|jdk sFt|j}d|_|j||jrt|j|jkrt t jd t|j|j|r|jt|j |j|j} |jj!rt|jj!} t t jd|j| |jn t"|j} |j#|tjkrly*| d} |jttj| d t| Wn2tk rh}zt t jd|Wdd}~XYnXq|jttj| d t| qWdS)N)wbitsr%ri zInvalid close code: zutf-8zInvalid UTF-8 text messagezInvalid close frame:  zUnexpected opcode=z Message size {} exceeds limit {}z|||d}|d7}t|d}||_|j r4tjntj|_nPn||_|j rVtjntj|_|jtjkr||dkr|||d|_|d7}tj|_nP|jtjkr,|j}|j}||}||kr|||_|||d|}n$d|_|||||||}|jdkrj|j r@|jdk s4tt|j|||j |j ||j ft|_tj|_q,Pq,W||d|_|S)z&Return the next frame from the socket.r|rr%r rfrUrez*Received frame with non-zero reserved bitsz!Received fragmented control frame}z5Control frame payload cannot be larger than 125 bytesNTF~r()rr\rrurvrrrrrrboolrrrrw UNPACK_LEN2rrxry UNPACK_LEN3rrrr[_websocket_maskrrrZ)rArframesZ start_posZ buf_lengthr=Z first_byteZ second_byterZrsv1Zrsv2Zrsv3rZhas_masklengthrZ chunk_lenrrr rs                      zWebSocketReader.parse_frame)T)rrrr rr!rrFrrQrrrrrrZrrrrr rs  |rc @seZdZdeedddeeje e e e e ddddZ de e ee ddd d Ze dd d d Zde ddddZde ddddZdeee fe ee ddddZde e ddddZdS) rFr)use_masklimitrandomrlrmN)protocol transportrrrrlrmr@cCsB||_||_||_|j|_||_||_d|_||_d|_d|_ dS)NFr) rrr randrangerlrm_closing_limit _output_size _compressobj)rArrrrrrlrmrrr rF;s zWebSocketWriter.__init__)rDrrlr@c s|jr|tj@stdd}|s&|jr|dkr|rFtjtj| d}n"|jsbtjtj|j d|_|j}||}|| |j rtj ntj }| tr|dd}|dB}t|}|j}|rd}nd}|d krtd|B|B||B} n<|d kr td|B|Bd |B|} ntd|B|Bd |B|} |r|dd } | d d} t|}t| ||| | ||jt| t| t|7_nLt|tkr|| ||n|| ||jt| t|7_|j|jkrd|_|jIdHdS)zsn                    4@