U v`r@svdZddlZddlZddlmZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZd ZdZdZdZdZdZd Zd ZdZdZdZdZdZd Z d Z!d Z"d Z#d Z$dZ%dZ&dZ'dZ(ededededede de!de"de#de$de%de&de'de(d iZ)Gd!d"d"e*Z+Gd#d$d$ej,Z-Gd%d&d&ej,Z.Gd'd(d(ej,Z/Gd)d*d*ej,Z0Gd+d,d,e.Z1Gd-d.d.e1Z2Gd/d0d0e1Z3Gd1d2d2e.Z4Gd3d4d4e.Z5Gd5d6d6e.Z6Gd7d8d8e1Z7Gd9d:d:e.Z8Gd;d<dd>e.Z:Gd?d@d@e.Z;edAe2fedBe3fedCe4fe dDe5fe dEe6fe dFe7fe dGe8fe dHe9fedIe:fedJe;fi ZdRdNdOZ?GdPdQdQe=Z@dS)Sz&Hypertext Transfer Protocol Version 2.N)dpktsPRI * HTTP/2.0 SM  ZNO_ERRORZPROTOCOL_ERRORINTERNAL_ERRORZFLOW_CONTROL_ERRORZSETTINGS_TIMEOUTZ STREAM_CLOSEDZFRAME_SIZE_ERRORZREFUSED_STREAMZCANCELZCOMPRESSION_ERRORZ CONNECT_ERRORZENHANCE_YOUR_CALMZINADEQUATE_SECURITYZHTTP_1_1_REQUIREDc@s eZdZdS)HTTP2ExceptionN)__name__ __module__ __qualname__rrb/private/var/folders/0j/yyfkg7712236ncpm167bvylc27vst9/T/pip-unpacked-wheel-y9gppv54/dpkt/http2.pyrIsrc@s eZdZddeffZddZdS)PrefaceprefaceZ24scCs*tj|||jtkr tdd|_dS)NInvalid HTTP/2 preface)rPacketunpackr HTTP2_PREFACErdataselfbufrrrrRs zPreface.unpackN)rrrr__hdr__rrrrrrMsrc@s(eZdZdZdZddZeddZdS)Framez0 An HTTP/2 frame as defined in RFC 7540 )) length_bytesZ3sr)typeBr)flagsr'r) stream_idIrcCs:tj|||jd|j|_t|j|jkr6tjdSN)rrrrlengthlenNeedDatar rrrrhsz Frame.unpackcCstdd|jdS)N!Ir)structrr%r!rrrr,osz Frame.lengthN)rrr__doc__r#rpropertyr,rrrrr$Ys r$c@seZdZdZdZddZdS)Priorityz Payload of a PRIORITY frame, also used in HEADERS frame with FLAG_PRIORITY. Also used in the HEADERS frame if the PRIORITY flag is set. )) stream_depr*r)weightr'rcCsTtj||t|jdkr$td|jd@dk|_|jdM_|jd7_dS)Nr)Invalid number of bytes in PRIORITY framelir) rrrr-rrr6 exclusiver7r rrrrs zPriority.unpackN)rrrr3r#rrrrrr5tsr5c@seZdZdZdZdS)Settingz6 A key-value pair used in the SETTINGS frame. )) identifierHr)valuer*rN)rrrr3r#rrrrr:sr:c@seZdZdZddZdS) PaddedFramezo Abstract class for frame types that support the FLAG_PADDED flag: DATA, HEADERS and PUSH_PROMISE. cCszt|||jt@rn|jdkr(tdtd|jddd|_|j|jkrXtd|jd|j |_ n|j|_ dS)Nr&Missing padding length in PADDED framer'r%Missing padding bytes in PADDED frame) r$rr(HTTP2_FLAG_PADDEDr,rr1r pad_length unpadded_datar rrrrs    zPaddedFrame.unpackNrrrr3rrrrrr>sr>c@seZdZdZeddZdS) DataFramez Frame of type DATA. cCs|jSr+)rCr2rrrpayloadszDataFrame.payloadN)rrrr3r4rFrrrrrEsrEc@seZdZdZddZdS) HeadersFramez Frame of type HEADERS. cCs^t|||jt@rRt|jdkr,tdt|jdd|_|jdd|_ n|j|_ dS)Nr=Missing stream dependency in HEADERS frame with PRIORITY flag) r>rr(HTTP2_FLAG_PRIORITYr-rCrr5priorityblock_fragmentr rrrrs  zHeadersFrame.unpackNrDrrrrrGsrGc@seZdZdZddZdS) PriorityFramez! Frame of type PRIORITY. cCst||t|j|_dSr+)r$rr5rrJr rrrrs zPriorityFrame.unpackNrDrrrrrLsrLc@seZdZdZddZdS)RSTStreamFramez# Frame of type RST_STREAM. cCs6t|||jdkrtdtd|jd|_dS)Nr7Invalid number of bytes in RST_STREAM frame (must be 4)r/r)r$rr,rr1r error_coder rrrrs  zRSTStreamFrame.unpackNrDrrrrrMsrMc@seZdZdZddZdS) SettingsFramez! Frame of type SETTINGS. cCsbt|||jddkr"tdg|_d}||jkr^|jt|j||d|d7}q,dS)NrrAInvalid number of bytes in SETTINGS frame (must be multiple of 6))r$rr,rsettingsappendr:r)r!r"irrrrs  zSettingsFrame.unpackNrDrrrrrPsrPc@seZdZdZddZdS)PushPromiseFramez% Frame of type PUSH_PROMISE. cCsRt||t|jdkr"tdtd|jddd|_|jdd|_dS)Nr0Missing promised stream ID in PUSH_PROMISE framer/r) r>rr-rCrr1r promised_idrKr rrrrs  zPushPromiseFrame.unpackNrDrrrrrUsrUc@seZdZdZddZdS) PingFramez Frame of type PING. cCs"t|||jdkrtddS)Nr 1Invalid number of bytes in PING frame (must be 8))r$rr,rr rrrrs  zPingFrame.unpackNrDrrrrrXsrXc@seZdZdZddZdS) GoAwayFramez Frame of type GO_AWAY. cCsjt|||jdkrtdtd|jddd|_td|jddd|_|jdd|_dS)Nr (Invalid number of bytes in GO_AWAY framer/rr) r$rr,rr1rlast_stream_idrO debug_datar rrrrs   zGoAwayFrame.unpackNrDrrrrrZsrZc@seZdZdZddZdS)WindowUpdateFramez& Frame of type WINDOW_UPDATE. cCs6t|||jdkrtdtd|jd|_dS)Nr:Invalid number of bytes in WINDOW_UPDATE frame (must be 4)r/r)r$rr,rr1rwindow_incrementr rrrrs  zWindowUpdateFrame.unpackNrDrrrrr^ sr^c@seZdZdZddZdS)ContinuationFramez% Frame of type CONTINUATION. cCst|||j|_dSr+)r$rrrKr rrrrs zContinuationFrame.unpackNrDrrrrrasraZDATAZHEADERSZPRIORITYZ RST_STREAMZSETTINGSZ PUSH_PROMISEZPINGZGOAWAYZ WINDOW_UPDATEZ CONTINUATIONc@seZdZddZdS) FrameFactorycCsZt|dkrtjtd|ddd}t|d}|dkrNtdt||d|S)Nrr'rrzInvalid frame type: r) r-rr.r1r FRAME_TYPESgetrhex)clsr"tZ frame_typerrr__new__2s  zFrameFactory.__new__N)rrrrhrrrrrb1srbFcCsd}t|}g}|rLzt|}|t|7}Wntjk rJgdfYSX||krz*t||d}|||t|7}WqLtjk rYqYqLXqL||fS)af Attempt to parse one or more Frame's out of buf Args: buf: string containing HTTP/2 frames. May have an incomplete frame at the end. preface: expect an HTTP/2 preface at the beginning of the buffer. Returns: [Frame] int, total bytes consumed, != len(buf) if an incomplete frame was left at the end. rN)r-rrr.rbrS)r"rrTnframespframerrrframe_multi_factory<s"  rmc@seZdZdZeddZddZddZdd Zd d Z d d Z ddZ ddZ ddZ ddZddZddZddZddZddZd S)! TestFramezSome data found in real trafficcCs$tdd}t|dd\|_|_dS)Ns505249202a20485454502f322e300d0a0d0a534d0d0a0d0a00000c04000000000000040002000000050000400000000408000000000000bf000100000502000000000300000000c800000502000000000500000000640000050200000000070000000000000005020000000009000000070000000502000000000b0000000300reTr)codecsdecodermrjrT)rfrecordrrr setup_classbszTestFrame.setup_classcCs$ddl}|tjttdddS)Nrs0000010000deadbeefre)pytestraisesrr.r$rprq)r!rtrrr test_frameoszTestFrame.test_framec Csrttdd}|jdkst|jtks,t|jtks:t|j dksHt|j dksVt|j dksdt|j dksrt|j dkstttdd}|jd kst|jtkst|jtkst|j d kst|j d kst|j d kst|j d kstd dl}|t}ttd dW5QRXt|jd ks4t|t}ttddW5QRXt|jdksntdS)Ns"00000800081234567805abcd1122334455rer xV4s"3DUrss0000000001deadbeefr>[=s000000000812345678r?s00000100081234567801r@)rbrprqr,AssertionErrorr&HTTP2_FRAME_DATAr(rAr)rrBrCrFHTTP2_FLAG_END_STREAMrtrurrEstrr=)r!Zframe_data_paddedZframe_data_empty_endrterrr test_dataws@  zTestFrame.test_datac Cs^ttdd}|jdkst|jtks,t|jdks:t|jdksHt|j dksVt|j dksdt|j dksrtttdd}|jdkst|jtkst|jt kst|jdkst|j d kst|j d kst|j jd kst|j jd kst|j jd kst|j dkstddl}|t}ttd dW5QRXt|jdksZtdS)Ns0000030100deadbeeff00baarerrrx s"0000080120deadbeefcafebabe10f00baar s T龺Js0000020120deadbeef1234rH)rbrprqr,rzr&HTTP2_FRAME_HEADERSr(r)rrCrKrIrJr9r6r7rtrurrGr}r=)r!Z frame_headersZframe_headers_priortr~rrr test_headerss: zTestFrame.test_headersc Csttdd}|jdkst|jtks,t|jdks:t|jdksHt|j dksVt|j j dksft|j j dksvt|j j d kst|j j d kstddl}|t}ttd dW5QRXt|jd kstdS) Ns0000050200deadbeefcafebabe12rerrrxsryTrs0000060200deadbeefcafebabe1200r8)rbrprqr,rzr&HTTP2_FRAME_PRIORITYr(r)rrJr9r6r7rtrurrLr}r=)r!Zframe_priorityrtr~rrr test_prioritys$ zTestFrame.test_priorityc Csttdd}|jdkst|jtks,t|jdks:t|jdksHt|j dksVt|j t ksdtddl }| t}ttddW5QRXt|jdkstdS) Ns0000040300deadbeef0000000crerrrxs s0000050300deadbeef0000000c00rN)rbrprqr,rzr&HTTP2_FRAME_RST_STREAMr(r)rrOHTTP2_INADEQUATE_SECURITYrtrurrMr}r=)r!Z frame_rstrtr~rrrtest_rst_streams zTestFrame.test_rst_streamc CsLttdd}|jdkst|jtks,t|jdks:t|jdksHtt |j dksZt|j dj t ksnt|j dj dkst|j dj tkst|j dj dkstttd d}|jdkst|jtkst|jtkst|jdkstt |j dkstddl}|t}ttd dW5QRXt|j d ksHtdS) Ns*00000c040000000000000400020000000500004000rerrriri@s000000040100000000s0000050400deadbeef1234567890rQ)rbrprqr,rzr&HTTP2_FRAME_SETTINGSr(r)r-rRr;"HTTP2_SETTINGS_INITIAL_WINDOW_SIZEr=HTTP2_SETTINGS_MAX_FRAME_SIZEHTTP2_FLAG_ACKrtrurrPr})r!Zframe_settingsZframe_settings_ackrtr~rrr test_settingss4  zTestFrame.test_settingsc Csttdd}|jdkst|jtks,t|jdks:t|jdksHt|j dksVt|j dksdtddl }| t }ttddW5QRXt|jd kstdS) Ns 0000070500deadbeefcafebabe123456rer rrxl:s4Vs0000030500deadbeefcafebarV)rbrprqr,rzr&HTTP2_FRAME_PUSH_PROMISEr(r)rWrKrtrurrUr}r=)r!Zframe_pprtr~rrrtest_push_promise0s zTestFrame.test_push_promisec Csttdd}|jdkst|jtks,t|jdks:t|jdksHt|j dksVtddl }| t }t tddW5QRXt|jdkstdS) Ns"0000080600deadbeefcafebabe12345678rer rrxs4Vxs0000050600deadbeef1234567890rY)rbrprqr,rzr&HTTP2_FRAME_PINGr(r)rrtrurrXr}r=)r!Z frame_pingrtr~rrr test_pingHs zTestFrame.test_pingc Csttdd}|jdkst|jtks,t|jdks:t|jdksHt|j dksVt|j t ksdt|j dksrtddl }|t}ttddW5QRXt|jdkstdS) Ns&00000a0700deadbeef0000000000000000caferer rrxss0000050700deadbeef1234567890r[)rbrprqr,rzr&HTTP2_FRAME_GOAWAYr(r)r\rOHTTP2_NO_ERRORr]rtrurrZr}r=)r!Z frame_goawayrtr~rrr test_goaway^s  zTestFrame.test_goawayc Csttdd}|jdkst|jtks,t|jdks:t|jdksHt|j dksVtddl }| t }t tddW5QRXt|jdkstdS) Ns0000040800deadbeef12345678rerrrxrws0000050800deadbeef1234567890r_)rbrprqr,rzr&HTTP2_FRAME_WINDOW_UPDATEr(r)r`rtrurr^r}r=)r!Zframe_wurtr~rrrtest_window_updatexs zTestFrame.test_window_updatecCsZttdd}|jdkst|jtks,t|jdks:t|jdksHt|j dksVtdS)Ns0000030900deadbeeff00baarerrrxr) rbrprqr,rzr&HTTP2_FRAME_CONTINUATIONr(r)rK)r!Z frame_contrrrtest_continuationszTestFrame.test_continuationc Cs\ddl}|tjttdd|t}ttddW5QRXt|j dksXt dS)Nrs000000res000000abcddeadbeefzInvalid frame type: 0xab) rtrurr.rbrprqrr}r=rzr!rtr~rrr test_factorys zTestFrame.test_factoryc Csdddl}|tjttdd|tjtd|t}tdW5QRXt|j dks`t dS)Nr 505249202a20485454502f322e300d0aressr) rtrurr.rrprqrr}r=rzrrrr test_prefaces   zTestFrame.test_prefacecCs|jdkstt|jdks t|jdjdks4t|jdjdksHt|jdjdks\t|jd jdkspt|jdjdkst|jdjdkst|jd jdkst|jdjtkst|jdjtkst|jdjtkst|jd jtkst|jdjtkst|jdjtks(t|jd jtks>t|jdj dksTt|jdj dksjt|jdj dkst|jd j dkst|jdj dkst|jdj dkst|jd j dkst|jdj dkst|jdj dkst|jdj d kst|jd j dks0t|jdj dksFt|jdj d ks\t|jd j d ksrtt t d ddd\}}t|dkst|dkstt t dddd\}}t|dkst|dkstdS)Nr rrrrrrrrr rrreTros@505249202a20485454502f322e300d0a0d0a534d0d0a0d0a00000c0400000000)rTrzr-rjr,r&rrrr(r)rmrprq)r!rjrTrrr test_multisX   zTestFrame.test_multiN)rrrr3 classmethodrsrvrrrrrrrrrrrrrrrrrrn_s" 2))   rn)F)Ar3r1rprrrr{rrrrrrrrrr|rZHTTP2_FLAG_END_HEADERSrArIZ HTTP2_SETTINGS_HEADER_TABLE_SIZEZHTTP2_SETTINGS_ENABLE_PUSHZ%HTTP2_SETTINGS_MAX_CONCURRENT_STREAMSrrZ#HTTP2_SETTINGS_MAX_HEADER_LIST_SIZErZHTTP2_PROTOCOL_ERRORZHTTP2_INTERNAL_ERRORZHTTP2_FLOW_CONTROL_ERRORZHTTP2_SETTINGS_TIMEOUTZHTTP2_STREAM_CLOSEDZHTTP2_FRAME_SIZE_ERRORZHTTP2_REFUSED_STREAMZ HTTP2_CANCELZHTTP2_COMPRESSION_ERRORZHTTP2_CONNECT_ERRORZHTTP2_ENHANCE_YOUR_CALMrZHTTP2_HTTP_1_1_REQUIREDZerror_code_str Exceptionrrrr$r5r:r>rErGrLrMrPrUrXrZr^rarcobjectrbrmrnrrrrs           #