zmc
2023-12-22 9fdbf60165db0400c2e8e6be2dc6e88138ac719a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
U
[±di[ã@s°dZddlZddlZddlmZmZddlmZddlm    Z    m
Z
m Z m Z m Z mZmZerdddlmZdd    „ed
ƒDƒZGd d „d ƒZGd d„dƒZdZdZdZdZdZeZdZdZdZdZdZ dZ!dZ"Gdd„deƒZ#Gdd„deƒZ$e$j%e$j&e$j'fZ(dZ)dZ*dZ+dZ,d Z-d!Z.d"Z/d"Z0e 1d#d¡Z2Gd$d%„d%e3ƒZ4Gd&d'„d'e ƒZ5Gd(d)„d)e ƒZ6Gd*d+„d+e ƒZ7e8e9e8d,œd-d.„Z:Gd/d0„d0ƒZ;Gd1d2„d2ƒZ<Gd3d4„d4ƒZ=Gd5d6„d6ƒZ>dS)7zY
wsproto/frame_protocol
~~~~~~~~~~~~~~~~~~~~~~
 
WebSocket frame protocol implementation.
éN)ÚgetincrementaldecoderÚIncrementalDecoder)ÚIntEnum)Ú    GeneratorÚListÚ
NamedTupleÚOptionalÚTupleÚ TYPE_CHECKINGÚUnioné)Ú    Extensioncs&g|]‰t‡fdd„tdƒDƒƒ‘qS)c3s|]}|ˆAVqdS©N©)Ú.0Úa©ÚbrúMd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\wsproto/frame_protocol.pyÚ    <genexpr>sz<listcomp>.<genexpr>é)ÚbytesÚrange)rrrrÚ
<listcomp>srrc@s,eZdZeddœdd„Zeedœdd„ZdS)ÚXorMaskerSimpleN)Ú masking_keyÚreturncCs
||_dSr)Ú _masking_key)ÚselfrrrrÚ__init__szXorMaskerSimple.__init__©ÚdatarcCsÒ|rÎt|ƒ}dd„|jDƒ\}}}}|ddd… |¡|ddd…<|ddd… |¡|ddd…<|ddd… |¡|ddd…<|ddd… |¡|ddd…<t|ƒd}|j|d…|jd|…|_t|ƒS|S)Ncss|]}t|VqdSr)Ú
_XOR_TABLE)rÚnrrrrsz*XorMaskerSimple.process.<locals>.<genexpr>ér éé)Ú    bytearrayrÚ    translateÚlenr)rr!Z
data_arrayrrÚcÚdZ key_rotationrrrÚprocesss ÿzXorMaskerSimple.process)Ú__name__Ú
__module__Ú __qualname__rrr,rrrrrsrc@seZdZeedœdd„ZdS)Ú XorMaskerNullr cCs|Srr©rr!rrrr,.szXorMaskerNull.processN)r-r.r/rr,rrrrr0-sr0é~éé}iÿÿlÿÿÿÿé€é@é ééc@s6eZdZdZdZdZdZdZdZdZ    e
dœd    d
„Z d S) ÚOpcodez7
    RFC 6455, Section 5.2 - Base Framing Protocol
    rr r%éé    é
©rcCs t|d@ƒS)Nr;)Úbool©rrrrÚ    iscontrol_szOpcode.iscontrolN) r-r.r/Ú__doc__Ú CONTINUATIONÚTEXTÚBINARYÚCLOSEÚPINGÚPONGr?rArrrrr:Hsr:c@sHeZdZdZdZdZdZdZdZdZ    dZ
d    Z d
Z d Z d Zd ZdZdZdS)Ú CloseReasonz8
    RFC 6455, Section 7.4.1 - Defined Status Codes
    éèiéiêiëiíiîiïiðiñiòióiôiõi÷N)r-r.r/rBÚNORMAL_CLOSUREZ
GOING_AWAYÚPROTOCOL_ERRORZUNSUPPORTED_DATAÚNO_STATUS_RCVDÚABNORMAL_CLOSUREÚINVALID_FRAME_PAYLOAD_DATAZPOLICY_VIOLATIONZMESSAGE_TOO_BIGZ MANDATORY_EXTÚINTERNAL_ERRORZSERVICE_RESTARTZTRY_AGAIN_LATERÚTLS_HANDSHAKE_FAILEDrrrrrIcs        rIrJi· i¸ iŸi i‡z!Ics,eZdZejfeeddœ‡fdd„ Z‡ZS)Ú ParseFailedN)ÚmsgÚcodercstƒ |¡||_dSr)ÚsuperrrT)rrSrT©Ú    __class__rrrÑs zParseFailed.__init__)r-r.r/rIrLÚstrrÚ __classcell__rrrVrrRÐs ÿþrRc@s&eZdZUeed<eed<eed<dS)ÚRsvBitsÚrsv1Úrsv2Úrsv3N)r-r.r/r?Ú__annotations__rrrrrZØs
rZc@s:eZdZUeed<eed<eed<eed<ee    ed<dS)ÚHeaderÚfinÚrsvÚopcodeÚ payload_lenrN)
r-r.r/r?r^rZr:Úintrrrrrrr_Þs
 
r_c@s@eZdZUeed<eeeee    effed<e
ed<e
ed<dS)ÚFramerbÚpayloadÚframe_finishedÚmessage_finishedN) r-r.r/r:r^r rrXr    rdr?rrrrreæs
re)r!ÚnbytesrcCs4t|ƒ|kr|S|d|…}|jddd d¡}|S)Núutf-8Úignore)Úerrors)r)ÚdecodeÚencode)r!rirrrÚ_truncate_utf8ís
  roc@s€eZdZdeeddœdd„Zeddœdd„Zeedœd    d
„Zeeedœd d „Z    dd œdd„Z
dd œdd„Z ed œdd„Z dS)ÚBufferN)Ú initial_bytesrcCs tƒ|_d|_|r| |¡dS©Nr)r'ÚbufferÚ
bytes_usedÚfeed)rrqrrrrþszBuffer.__init__)Ú    new_bytesrcCs|j|7_dSr)rs)rrvrrrrusz Buffer.feed)rircCs6|s
tƒS|j|j|j|…}|jt|ƒ7_|Sr)r'rsrtr))rrir!rrrÚconsume_at_mosts
zBuffer.consume_at_mostcCs"t|jƒ|j|krdS| |¡Sr)r)rsrtrw)rrirrrÚconsume_exactlyszBuffer.consume_exactlyr>cCs|jd|j…=d|_dSrr)rsrtr@rrrÚcommitsz Buffer.commitcCs
d|_dSrr)rtr@rrrÚrollbackszBuffer.rollbackcCs
t|jƒSr)r)rsr@rrrÚ__len__szBuffer.__len__)N) r-r.r/rrrrurdrwrxryrzr{rrrrrpýsrpc@s*eZdZddœdd„Zeedœdd„ZdS)ÚMessageDecoderNr>cCsd|_d|_dSr)rbÚdecoderr@rrrr"szMessageDecoder.__init__©Úframerc
Cs
|j ¡rt‚|jdkr6|jtjkr,tdƒ‚|j|_n|jtjk    rPtd|jƒ‚|jtjkrhtdƒƒ|_|j    or|j
}|jdkr†|j }n\t |j t tfƒsšt‚z|j |j |¡}Wn2tk
rà}ztt|ƒtjƒ‚W5d}~XYnXt|j||j    |ƒ}|rd|_d|_|S)Nzunexpected CONTINUATIONzexpected CONTINUATION, got %rrj)rbrAÚAssertionErrorr:rCrRrDrr}rgrhrfÚ
isinstancerr'rmÚUnicodeDecodeErrorrXrIrOre)rrÚfinishedr!ÚexcrrrÚ process_frame&s,
 
 
"zMessageDecoder.process_frame)r-r.r/rrer…rrrrr|!sr|c@s‚eZdZdeeedddœdd„Zeddœdd„Zee    d    œd
d „Z
ed    œd d „Z e e ee dœdd„Ze ee ddœdd„ZdS)Ú FrameDecoderNr ©ÚclientÚ
extensionsrcCs:||_|p g|_tƒ|_d|_d|_d|_d|_d|_dSrr)    rˆr‰rprsÚheaderÚeffective_opcodeÚmaskerÚpayload_requiredÚpayload_consumed©rrˆr‰rrrrHs
zFrameDecoder.__init__r cCs|j |¡dSr)rsrur1rrrÚ receive_bytesVszFrameDecoder.receive_bytesr>c    Cst|js| ¡sdS|jdk    s t‚|jdk    s.t‚|jdk    s<t‚t|jƒ|jkrPdS|jj|j    }|j 
|¡}|s~|jjdkr~dS|j  ¡|j    t|ƒ7_    |j    |jjk}|j  |¡}|j D](}| ||¡}t|tƒrÞtd|ƒ‚|}qº|r:tƒ}|j D]:}| ||jj¡}t|tƒr td|ƒ‚|dk    rö||7}qö||7}t|j|||jjƒ}|rhd|_d|_d|_ntj|_|S)Nrúerror in extension)rŠÚ parse_headerr€rŒr‹r)rsrrcrŽrwryr,r‰Zframe_inbound_payload_datarrIrRr'Zframe_inbound_completer`rer:rC)    rZpayload_remainingrfrƒÚ    extensionZpayload_ÚfinalÚresultrrrrÚprocess_bufferYsJ 
 
 
 
 
 
 
zFrameDecoder.process_bufferc    Cs¶|j d¡}|dkr"|j ¡dSt|dt@ƒ}tt|dt@ƒt|dt@ƒt|dt@ƒƒ}|dt    @}z t
|ƒ}Wn$t k
ržt d|d›ƒ‚YnX|  ¡r´|s´t dƒ‚t|dt@ƒ}|dt@}| ||¡}|dkrò|j ¡dS| |||¡|r|jrt dƒ‚|s,|js,t d    ƒ‚|rb|j d
¡}|dkrV|j ¡dSt|ƒ|_ntƒ|_|j ¡t||||dƒ|_|jj|_|jj  ¡r¦||_nd|_d|_d S) Nr%FrzInvalid opcode z#xz)Invalid attempt to fragment control framer z'client received unexpected masked framez)server received unexpected unmasked framer$T)rsrxrzr?ÚFIN_MASKrZÚ    RSV1_MASKÚ    RSV2_MASKÚ    RSV3_MASKÚ OPCODE_MASKr:Ú
ValueErrorrRrAÚ    MASK_MASKÚPAYLOAD_LEN_MASKÚparse_extended_payload_lengthÚextension_processingrˆrrŒr0ryr_rŠrbr‹rrŽ)    rr!r`rarbZhas_maskZpayload_len_shortrcrrrrr’‹sV 
ý     
 
 
 
 
zFrameDecoder.parse_header)rbrcrcCsª| ¡r|tkrtdƒ‚|tkrX|j d¡}|dkr8dSt d|¡\}|tkr¦tdƒ‚nN|tkr¦|j d¡}|dkrxdSt d|¡\}|t    kr–tdƒ‚|d?r¦td    ƒ‚|S)
Nz$Control frame with payload len > 125r%ú!Hz6Payload length used 2 bytes when 1 would have sufficedr;ú!Qz6Payload length used 8 bytes when 2 would have sufficedé?z'8-byte payload length with non-zero MSB)
rAÚMAX_PAYLOAD_NORMALrRÚPAYLOAD_LENGTH_TWO_BYTErsrxÚstructÚunpackÚPAYLOAD_LENGTH_EIGHT_BYTEÚMAX_PAYLOAD_TWO_BYTE)rrbrcr!rrrrŸÀs. ÿ ÿz*FrameDecoder.parse_extended_payload_length)rbrarcrc Cs€dddg}|jD]F}| ||||¡}t|tƒr8td|ƒ‚t|ƒD]\}}|r@d||<q@qt||ƒD]\}    }
|
rb|    sbtdƒ‚qbdS)NFr‘TzReserved bit set unexpectedly)r‰Zframe_inbound_headerrrIrRÚ    enumerateÚzip) rrbrarcZrsv_usedr“r•ÚbitÚusedÚexpectedÚfoundrrrr Þs
 
 
 
 z!FrameDecoder.extension_processing)N)r-r.r/r?rrrrrrer–r’r:rdrŸrZr rrrrr†Gs$ÿ
þ 26þ þr†c@sþeZdZeedddœdd„Zeedœdd„Zee    eddfd    œd
d „Z
e dd œd d„Z eeddfd    œdd„Z d$e    ee    ee dœdd„Zd%e e dœdd„Zd&e e dœdd„Zd'ee eefee dœdd„Zeeeedœdd „Zd(ee ee d!œd"d#„ZdS))Ú FrameProtocolr Nr‡cCsB||_dd„|Dƒ|_t|j|jƒ|_tƒ|_| ¡|_d|_dS)NcSsg|]}| ¡r|‘qSr©Zenabled©rÚextrrrrñsz*FrameProtocol.__init__.<locals>.<listcomp>)    rˆr‰r†Ú_frame_decoderr|Ú_message_decoderÚ_parse_more_genÚ _parse_moreÚ_outbound_opcoderrrrrïs 
zFrameProtocol.__init__r~c
Cs$|j}t|ttfƒst‚|s(tjdf}nèt|ƒdkr>tdƒ‚nÒt     
d|dd…¡\}|t ksd|t krltdƒ‚z t|ƒ}Wnt k
rŒYnX|tkržtdƒ‚t|tƒs¸|tkr¸tdƒ‚z|dd… d    ¡}Wn8tk
r}ztd
t|ƒtjƒ‚W5d}~XYnX||f}t|j||j|jƒS) NÚr zCLOSE with 1 byte payloadr¡r%zCLOSE with invalid codez#remote CLOSE with local-only reasonz CLOSE with unknown reserved coderjzError decoding CLOSE reason: )rfrrr'r€rIrMr)rRr¦r§ÚMIN_CLOSE_REASONÚMAX_CLOSE_REASONrœÚLOCAL_ONLY_CLOSE_REASONSÚMAX_PROTOCOL_CLOSE_REASONrmr‚rXrOrerbrgrh)rrr!rTÚreasonr„rrrÚ_process_closeús4  
 
þzFrameProtocol._process_closer>ccsjdd„|jDƒ|_d}|sf|j ¡}|dk    r^|j ¡sD|j |¡}n|jtjkr^|     |¡}d}|VqdS)NcSsg|]}| ¡r|‘qSrr±r²rrrr!sz1FrameProtocol._parse_more_gen.<locals>.<listcomp>FT)
r‰r´r–rbrArµr…r:rFr¿)rÚclosedrrrrr¶s
 
 
zFrameProtocol._parse_more_genr cCs|j |¡dSr)r´rr1rrrr0szFrameProtocol.receive_bytesccs$|jD]}|dkrq q|VqdSr)r·)rÚeventrrrÚreceived_frames3s
zFrameProtocol.received_frames)rTr¾rcCs€tƒ}|tjkrd}|dkr(|r(tdƒ‚|tkr6tj}|dk    rr|tt d|¡ƒ7}|dk    rr|t|     d¡t
dƒ7}|  t j |¡S)Nz&cannot specify a reason without a coder¡rjr%)r'rIrMÚ    TypeErrorr¼rKr¦Úpackrornr¤Ú_serialize_framer:rF)rrTr¾rfrrrÚclose:s
 ÿzFrameProtocol.closeó)rfrcCs| tj|¡Sr)rÅr:rG©rrfrrrÚpingKszFrameProtocol.pingcCs| tj|¡Sr)rÅr:rHrÈrrrÚpongNszFrameProtocol.pongT)rfr`rcCs€t|tttfƒrtj}n$t|tƒr4tj}| d¡}nt    dƒ‚|j
dkrN||_
n|j
|k    rbt dƒ‚ntj }|rrd|_
|  |||¡S)NrjzMust provide bytes or textz!Data type mismatch inside message)rrr'Ú
memoryviewr:rErXrDrnrœr¸rÃrCrÅ)rrfr`rbrrrÚ    send_dataQs
 
 
 
zFrameProtocol.send_data)r`rarbrcCsJt|ƒd>}t|jƒd>t|jƒd>t|jƒd>}t|ƒ}||B|BS)Nééér$)rdr[r\r])rr`rarbZfin_bitsZrsv_bitsZ opcode_bitsrrrÚ_make_fin_rsv_opcodehs *z"FrameProtocol._make_fin_rsv_opcode)rbrfr`rcCstdddƒ}t|jƒD]}| |||||¡\}}q| |||¡}t|ƒ}d}|tkr^|}    d}
n|tkrpt}    |}
n t    }    |}
d}|j
rŠ|    dO}    t ||    gƒ} |
dk    rÜ|  ¡r®t dƒ‚|rÈ| t t d|
¡ƒ7} n| t t d|
¡ƒ7} |j
rt d¡} t| ƒ} | | |  |¡S| |S)NFTr5z"payload too long for control framer¢r¡r$)rZÚreversedr‰Zframe_outboundrÐr)r¤r©r¥r¨rˆr'rArœr¦rÄÚosÚurandomrr,)rrbrfr`rar“Zfin_rsv_opcodeZpayload_lengthZ quad_payloadZ first_payloadZsecond_payloadrŠrrŒrrrrÅos:  
zFrameProtocol._serialize_frame)NN)rÇ)rÇ)rÇT)rÇT)r-r.r/r?rrrer¿rrr¶rrrÂrdrXrÆrÉrÊr r'rÌrZr:rÐrÅrrrrr°îs0 !ÿ þ ÿþr°)?rBrÒr¦ÚcodecsrrÚenumrÚtypingrrrrr    r
r r‰r rr"rr0r¥r¨r¤r©ZMAX_PAYLOAD_EIGHT_BYTEZMAX_FRAME_PAYLOADrržr—r˜r™ršr›r:rIrMrNrQr¼rºZMIN_PROTOCOL_CLOSE_REASONr½ZMIN_LIBRARY_CLOSE_REASONZMAX_LIBRARY_CLOSE_REASONZMIN_PRIVATE_CLOSE_REASONZMAX_PRIVATE_CLOSE_REASONr»rÄZ    NULL_MASKÚ    ExceptionrRrZr_rerrdrorpr|r†r°rrrrÚ<module>s` $ Yý $&(