3 gY2@sdZddlZddlZddlZddlZddlTddlmZyddlm Z ddZ Wne k rld dZ YnXd d d d ddddddddddddgZ dZ dZdZdZdZdZd Zd!Zd"Zd#Zd$Zd%Zd&Ze eeeeeeeeef ZGd'd d eZGd(d d eZGd)d d eZdS)*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)XorMaskerSimplecCst|j|S)N)rprocess)_m_dr @/Users/olari/OneDrive/sandbox/awsBlog2/lambda/websocket/_abnf.py_mask#sr cCsHx,tt|D]}||||dN<qWtjr<|jS|jSdS)N)rangelensixPY3tobytestostring)rrir r r r (s ABNFcontinuous_frame frame_buffer STATUS_NORMALSTATUS_GOING_AWAYSTATUS_PROTOCOL_ERRORSTATUS_UNSUPPORTED_DATA_TYPESTATUS_STATUS_NOT_AVAILABLESTATUS_ABNORMAL_CLOSEDSTATUS_INVALID_PAYLOADSTATUS_POLICY_VIOLATIONSTATUS_MESSAGE_TOO_BIGSTATUS_INVALID_EXTENSIONSTATUS_UNEXPECTED_CONDITIONSTATUS_BAD_GATEWAYSTATUS_TLS_HANDSHAKE_ERRORiiiiiiiiiiiiic @seZdZdZdZdZdZdZdZdZ eeeeee fZ eded ed ed ed e d iZ dZ d$Z d%ZddddeddfddZd&ddZeddZddZed'ddZddZdd Zed!d"Zd#S)(rz} ABNF frame class. see http://tools.ietf.org/html/rfc5234 and http://tools.ietf.org/html/rfc6455#section-5.2 rr ZconttextbinarycloseZpingZpong~?cCsB||_||_||_||_||_||_|dkr0d}||_tj|_ dS)zO Constructor for ABNF. please check RFC for arguments. Nr.) finrsv1rsv2rsv3opcodemaskdataosurandom get_mask_key)selfr/r0r1r2r3r4r5r r r __init__sz ABNF.__init__FcCs|js|js|jrtd|jtjkr2td|j|jtjkrN|j rNtd|jtj krt |j }|sldS|dks||dkrtd|dkr| rt |j dd rtdd t j|j d dt j|j dd}|j|std dS) z^ validate the ABNF frame. skip_utf8_validation: skip utf8 validation. zrsv is not implemented, yetzInvalid opcode %rzInvalid ping frame.Nrr+zInvalid close frame.r$rzInvalid close opcode.)r0r1r2WebSocketProtocolExceptionr3rOPCODES OPCODE_PINGr/ OPCODE_CLOSErr5rrbyte2int_is_valid_close_status)r9skip_utf8_validationlcoder r r validates$    "* z ABNF.validatecCs |tkpd|kodkSS)Ni i)VALID_CLOSE_STATUS)rDr r r rAszABNF._is_valid_close_statuscCs*dt|jdt|jdt|jS)Nzfin=z opcode=z data=)strr/r3r5)r9r r r __str__sz ABNF.__str__cCs4|tjkr t|tjr |jd}t|ddd|d|S)a 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. zutf-8rr)r OPCODE_TEXT isinstancer text_typeencode)r5r3r/r r r create_frames  zABNF.create_framecCsRtdd|j|j|j|jgDr*td|jtjkr>tdt |j }|tj krZtdt |jd>|jd>B|jd>B|jd >B|jB}|tj kr|t |jd>|B7}tj|}nl|tjkr|t |jd>d B7}tj|}|tjd |7}n0|t |jd>d B7}tj|}|tjd |7}|js6||j S|jd }||j|SdS)zR format this object to string(byte array) to send data to server. css|]}|dkVqdS)rrN)rrr ).0xr r r szABNF.format..z not 0 or 1zInvalid OPCODEzdata is too longr r+z!Hz!QN)anyr/r0r1r2 ValueErrorr3rr=rr5 LENGTH_63chrLENGTH_7r4rb LENGTH_16structpackr8 _get_masked)r9lengthZ frame_headermask_keyr r r formats."   0       z ABNF.formatcCs,tj||j}t|tjr$|jd}||S)Nzutf-8)rr4r5rJrrKrL)r9r`sr r r r^s  zABNF._get_maskedcCsZ|dkr d}t|tjr"tj|}t|tjr8tj|}tjd|}tjd|}t||S)z mask or unmask data. Just do xor for each byte mask_key: 4 byte string(byte). data: data to mask/unmask. Nr.B)rJrrKrZarrayr )r`r5rrr r r r4s       z ABNF.maskNil)F)r)__name__ __module__ __qualname____doc__ OPCODE_CONTrI OPCODE_BINARYr?r>Z OPCODE_PONGr=Z OPCODE_MAPrYr[rWr:rE staticmethodrArHrMrar^r4r r r r r_s8   !c@sleZdZdZdZddZddZddZd d Zd d Z d dZ ddZ ddZ ddZ ddZddZdS)rrSrRcCs||_||_g|_|jdS)N)recvrB recv_bufferclear)r9Zrecv_fnrBr r r r: szframe_buffer.__init__cCsd|_d|_d|_dS)N)headerr_r4)r9r r r rnszframe_buffer.clearcCs |jdkS)N)ro)r9r r r has_received_headersz frame_buffer.has_received_headerc Cs|jd}|d}tjr t|}|d?d@}|d?d@}|d?d@}|d?d@}|d@}|d}tjrnt|}|d?d@} |d @} |||||| | f|_dS) Nr$rrQrrRrSr rT) recv_strictrPY2ordro) r9roZb1r/r0r1r2r3Zb2has_mask length_bitsr r r recv_headers      zframe_buffer.recv_headercCs|js dS|jtjS)NF)ror_HEADER_MASK_INDEX)r9r r r ru3szframe_buffer.has_maskcCs |jdkS)N)r_)r9r r r has_received_length8sz frame_buffer.has_received_lengthcCsj|jtj}|d@}|dkr:|jd}tjd|d|_n,|dkr`|jd}tjd|d|_n||_dS)NrTr+r$z!Hrr%z!Q)ror_HEADER_LENGTH_INDEXrrr\unpackr_)r9bitsrvvr r r recv_length;s   zframe_buffer.recv_lengthcCs |jdkS)N)r4)r9r r r has_received_maskGszframe_buffer.has_received_maskcCs|jr|jdnd|_dS)Nr r.)rurrr4)r9r r r recv_maskJszframe_buffer.recv_maskc Cs|jr|j|j\}}}}}}}|jr4|j|j}|jrJ|j|j} |j |} |rjt j| | } |j t ||||||| } | j |j | S)N)rprwroryr~r_rrr4rrrrnrErB) r9r/r0r1r2r3ru_r_r4payloadframer r r recv_frameMs    zframe_buffer.recv_framecCs|tdd|jD}x4|dkrL|jtd|}|jj||t|8}qWtjdj|j}|dkrrg|_|S||dg|_|d|SdS)Ncss|]}t|VqdS)N)r)rNrOr r r rPksz+frame_buffer.recv_strict..ri@r.) sumrmrlminappendrrrZjoin)r9bufsizeZshortagebytes_Zunifiedr r r rrjs  zframe_buffer.recv_strictN)rerfrgrxrzr:rnrprwruryr~rrrrrr r r r r s c@s4eZdZddZddZddZddZd d Zd S) rcCs||_||_d|_d|_dS)N)fire_cont_framerB cont_datarecving_frames)r9rrBr r r r:szcontinuous_frame.__init__cCs@|j r|jtjkrtd|jr<|jtjtjfkrsh    +x