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>cCs|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$) translate)rYr<rRrTcdrrr_websocket_mask_python|s ra)_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 r\r%TzInvalid window sizer$z#Extension for deflate not supported)_WS_EXT_RE_SPLITfinditergroup _WS_EXT_REmatchr rQ)rdrecompress notakeoverZextZdefextrlrrr ws_ext_parses>      rorf)rmreserver_notakeoverr>cCs^|dks|dkrtddg}|s,|d|dkrF|dt||rT|dd|S) Nr%rfzCCompress wbits must between 9 and 15, zlib does not support wbits=8zpermessage-deflateZclient_max_window_bitszserver_max_window_bits=Zserver_no_context_takeoverz; ) ValueErrorappendrOjoin)rmrerpZ enabledextrrr ws_ext_gens  rtc@seZdZdZdZdZdZdS) WSParserStater r$r]r\N)rrr READ_HEADERREAD_PAYLOAD_LENGTHREAD_PAYLOAD_MASK READ_PAYLOADrrrrrusruc@seZdZdeeeeddddZddddZe e ee fd d d Z e e ee fd d d Z e e e eeeeeefdddZdS)rTN)queue max_msg_sizermr>cCsp||_||_d|_t|_tj|_d|_d|_ d|_ t|_ d|_ d|_ d|_d|_d|_d|_d|_||_dS)NFr)rz _max_msg_size_exc bytearray_partialrurv_state_opcode _frame_fin _frame_opcode_frame_payload_tail _has_mask _frame_mask_payload_length_payload_length_flag _compressed_decompressobj _compress)r?rzr{rmrrrrFs"zWebSocketReader.__init__rJcCs|jdSrD)rzfeed_eofrLrrrrszWebSocketReader.feed_eofr<r>c CsZ|jrd|fSz ||WStk rT}z||_|j|WYdSd}~XYnXdS)NT)Tr|)r~ _feed_data ExceptionrzZ set_exception)r?r<excrrr feed_datas  zWebSocketReader.feed_datac Csx||D]f\}}}}|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||jrrt|j|jkrrt t jd t|j|jq |jr$|tjkr$t t j d ||tjkr<|j}d|_|j||jr~t|j|jkr~t t jd t|j|j|r|jt|j|j|j} |jj rt|jj } t t jd|j| |jn t!|j} |j"|tjkrVz*| d} |jttj| d t| Wn2tk rR}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 {}zcCsvg}|jr|j|d}|_d}t|}|jtjkrp||dkrd|||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|_nqd|jtjkr`|j}|dkr||dkrd|||d}|d7}t|d}||_|j rtjntj|_nqdn||dkrD||dkrd|||d}|d7}t|d}||_|j r4tjntj|_nqdn||_|j rXtjntj|_|jtjkr||dkrd|||d|_|d7}tj|_nqd|jtjkr(|j}|j}||}||kr|||_|||d|}n$d|_|||||||}|jdkrd|j r4t|j|||j |j ||j ft|_tj|_q(qdq(||d|_|S)z&Return the next frame from the socket.r|rr$r rgr\rfz*Received frame with non-zero reserved bitsz!Received fragmented control frame}z5Control frame payload cannot be larger than 125 bytesNTF~r')rrrrurvrrrrrrboolrrrrw UNPACK_LEN2rrxry UNPACK_LEN3rrr_websocket_maskrrr)r?rZframesZ start_posZ buf_lengthr<Z first_byteZ second_byterZrsv1Zrsv2Zrsv3rZhas_maskZlengthrZ chunk_lenrrrrs                       zWebSocketReader.parse_frame)T)rrrr rr rrFrrVrrrrrrrrrrrrs  |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_masklimitrandomrmrnN)protocol transportrrrrmrnr>cCsB||_||_||_|j|_||_||_d|_||_d|_d|_ dS)NFr) rrr randrangermrn_closing_limit _output_size _compressobj)r?rrrrrrmrnrrrrF;s zWebSocketWriter.__init__)rCrrmr>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) isinstancerOencoderrr-r?rCrrrr4s  zWebSocketWriter.pongcs,t|tr|d}||tjIdHdS)zSend ping message.rN)rrOrrrr,rrrrr3s  zWebSocketWriter.ping)rCr2rmr>csJt|tr|d}|r0||tj|IdHn||tj|IdHdS)rrN)rrOrrrr+r*)r?rCr2rmrrrsends   zWebSocketWriter.sendrrAcsDt|tr|d}z"|jt||tjdIdHW5d|_XdS)zs~                    4 @