U '7` 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;n0zdd)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 CONTINUATIONTEXTBINARYPINGPONGCLOSECLOSINGCLOSEDZERRORtextbinarypingpongcloseclosingclosederrorrrrrr0s"rs$258EAFA5-E914-47DA-95CA-C5AB0DC85B11z!Hz!Qz!BBz!BBHz!BBQi@_WSMessageBasetypedataZextrac@s.eZdZejdeegefedddZdS)r)loads)r=returncCs ||jS)zAReturn parsed JSON data. .. versionadded:: 0.22 )r<)selfr=rrrjsonZszWSMessage.jsonN)rrrr@r=rrrrrrrYsrcs8eZdZdZeeddfdd ZedddZZS) rz WebSocket protocol parser error.Ncodemessager>cs||_t||dSN)rBsuper__init__r?rBrC __class__rrrFiszWebSocketError.__init__r>cCs |jdS)Nr )argsr?rrr__str__mszWebSocketError.__str__) rrr__doc__r strrFrM __classcell__rrrHrrfsrc@seZdZdZdS)WSHandshakeErrorz#WebSocket protocol handshake error.N)rrrrNrrrrrQqsrQcs&g|]tfddtdDqS)c3s|]}|AVqdSrDr)r!abrr ysz.r()bytesrange)r!rrSr ysrXr()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|VqdSrD) _XOR_TABLE)r!nrrrrUsz)_websocket_mask_python..Nr r$) isinstance bytearrayAssertionErrorlen translate)rYr<rRrTcdrrr_websocket_mask_python|s re)_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}t|D]}|d}|s4d}qt|}|rd}|r|drxt|d}|dksr|dkrxd}q|drd}qq|d rt|d }|dks|dkrtd |d rd}qq|std |dq||fS) N)rFrFr rZr%TzInvalid window sizer$z#Extension for deflate not supported)_WS_EXT_RE_SPLITfinditergroup _WS_EXT_REmatchr rQ)rhricompress notakeoverZextZdefextrprrr ws_ext_parses>      rsrj)rqriserver_notakeoverr>cCs^|dks|dkrtddg}|s,|d|dkrF|dt||rT|dd|S) Nr%rjzCCompress wbits must between 9 and 15, zlib does not support wbits=8zpermessage-deflateZclient_max_window_bitszserver_max_window_bits=Zserver_no_context_takeoverz; ) ValueErrorappendrOjoin)rqrirtZ enabledextrrr ws_ext_gens  rxc@seZdZdZdZdZdZdS) WSParserStater r$r]rZN)rrr READ_HEADERREAD_PAYLOAD_LENGTHREAD_PAYLOAD_MASK READ_PAYLOADrrrrrysryc@seZdZdeeeeddddZddddZe e ee fd d d Z e e ee fd d d Z e e e eeeeeefdddZdS)rTN)queue max_msg_sizerqr>cCsp||_||_d|_t|_tj|_d|_d|_ d|_ t|_ d|_ d|_ d|_d|_d|_d|_d|_||_dS)NFr)r~ _max_msg_size_excr__partialryrz_state_opcode _frame_fin _frame_opcode_frame_payload_tail _has_mask _frame_mask_payload_length_payload_length_flag _compressed_decompressobj _compress)r?r~rrqrrrrFs"zWebSocketReader.__init__rJcCs|jdSrD)r~feed_eofrLrrrrszWebSocketReader.feed_eofr<r>c CsZ|jrd|fSz ||WStk rT}z||_|j|WYdSd}~XYnXdS)NT)Tr)r _feed_data Exceptionr~Z set_exception)r?r<excrrr feed_datas  zWebSocketReader.feed_datac Cs||D]v\}}}}|r4|js4tjtj d|_|tjkrt|dkrt|ddd}|dkr|t krt t j d|z|dd d}Wn0tk r}zt t jd|W5d}~XYnXttj||} n2|rt t j d|d |d |nttjdd } |j| dq |tjkrF|jttj|d t|q |tjkrp|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 ||tjkrL|jdk s@t|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#|tjkrfz*| d} |jttj| d t| Wn2tk rb}zt t jd|W5d}~XYnXq |jttj| d t| q dS)N)wbitsr$ri zInvalid close code: utf-8zInvalid UTF-8 text messagezInvalid close frame:  zUnexpected opcode=z Message size {} exceeds limit {}zcCsg}|jr|j|d}|_d}t|}|jtjkrp||dkrt|||d}|d7}|\}}|d?d@}|d?d@} |d?d@} |d?d@} |d @} | s| s| r|jsttjd | dkr|dkrttjd |d?d@} |d @}| dkr |d kr ttjd|j s|j dkr0| r(dnd|_ n| rBttjd t ||_ | |_ t | |_ ||_tj|_nqt|jtjkr`|j}|dkr||dkrt|||d}|d7}t|d}||_|j rtjntj|_nqtn||dkrD||dkrt|||d}|d7}t|d}||_|j r4tjntj|_nqtn||_|j rXtjntj|_|jtjkr||dkrt|||d|_|d7}tj|_nqt|jtjkr(|j}|j}||}||kr|||_|||d|}n$d|_|||||||}|jdkrt|j rD|jdk s8tt|j|||j |j ||j ft|_tj|_q(qtq(||d|_|S)z&Return the next frame from the socket.rrr$r rkrZrjz*Received frame with non-zero reserved bitsz!Received fragmented control frame}z5Control frame payload cannot be larger than 125 bytesNTF~r')rrarryrzrrrrrrboolrrrr{ UNPACK_LEN2rr|r} UNPACK_LEN3rrrr`_websocket_maskrvr_)r?rZframesZ start_posZ buf_lengthr<Z first_byteZ second_byterZrsv1Zrsv2Zrsv3rZhas_maskZlengthrZ chunk_lenrrrrs                       zWebSocketReader.parse_frame)T)rrrr rr rrFrrVrrrrrr_rrrrrrs  |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_masklimitrandomrqrrN)protocol transportrrrrqrrr>cCsB||_||_||_|j|_||_||_d|_||_d|_d|_ dS)NFr) rrr randrangerqrr_closing_limit _output_size _compressobj)r?rrrrrrqrrrrrrF;s zWebSocketWriter.__init__)rCrrqr>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)cs,t|tr|d}||tjIdHdS)zSend pong message.rN)r^rOencoderrr-r?rCrrrr4s  zWebSocketWriter.pongcs,t|tr|d}||tjIdHdS)zSend ping message.rN)r^rOrrrr,rrrrr3s  zWebSocketWriter.ping)rCr2rqr>csJt|tr|d}|r0||tj|IdHn||tj|IdHdS)rrN)r^rOrrrr+r*)r?rCr2rqrrrsends   zWebSocketWriter.sendrrAcsDt|tr|d}z"|jt||tjdIdHW5d|_XdS)zs~                    4 @