U v`K@s dZddlmZddlmZddlmZddlmZddlm Z m Z dd Z d d Z Gd d d ej ZGdddeZGdddeZddZddZddZddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/Zd0d1Z d2S)3zHypertext Transfer Protocol.)print_function)absolute_import) OrderedDict)dpkt)BytesIO iteritemscCst}|dd}|s q|dd}t|ddkrNtd||d}t|dkrr|d ptd}||krt ||t k r||g||<|| |q|||<q|S)z6Return dict of HTTP headers parsed from a file object.asciiignore:rrzinvalid header: %r) rreadlinestripdecodesplitlenr UnpackErrorlowerlstriptypelistappend)fdlinel_kvra/private/var/folders/0j/yyfkg7712236ncpm167bvylc27vst9/T/pip-unpacked-wheel-y9gppv54/dpkt/http.py parse_headers s    r cCs|dddkrg}d}z|ddd}Wntk rRtdYnXt|d }|dkrjd }||}| rq|rt ||kr| |qqq|st d d |}nZd |krt|d }||}t ||krt d|t |nd|kr|}nd }|S)zCReturn HTTP body parsed from a file object, given HTTP header dict.transfer-encodingr chunkedFNrrmissing chunk sizeTpremature end of chunked bodycontent-lengthzshort body (missing %d bytes) content-type)getrr r IndexErrorrrintreadrrrNeedDatajoin)rheadersrZ found_endsznbufbodyrrr parse_body(s8           r4c@sReZdZdZeZiZdZdZddZ dddZ dd Z d d Z d d Z ddZdS)MessagezHypertext Transfer Protocol headers + body. TODO: Longer class information.... Attributes: __hdr__: Header fields of HTTP. TODO. NcOsj|r||dnRt|_d|_d|_|jD]\}}t|||q2t|D]\}}t|||qPdS)Nrr&) unpackrr/r3data__hdr_defaults__itemssetattrr)selfargskwargsrrrrr__init__^szMessage.__init__TcCs:t|}t||_|r&t||j|_nd|_||_dS)Nr&)rr r/r4r3r,r7)r;r2is_body_allowedrrrrr6ks  zMessage.unpackcCsdddt|jDS)Nr cSsg|] }d|qS)z%s: %s r).0trrr xsz$Message.pack_hdr..)r.rr/r;rrrpack_hdrwszMessage.pack_hdrcCs tt|S)N)rstrrCrrr__len__zszMessage.__len__cCsd||jddfS)Nz%s %sutf8r )rDr3rrCrrr__str__}szMessage.__str__cCs|ddd|jpdS)Nr r s r&)rDencoder3rCrrr __bytes__szMessage.__bytes__)T)__name__ __module__ __qualname____doc__r __metaclass__r8r/r3r>r6rDrFrHrJrrrrr5Os  r5c@sBeZdZdZddddZedZdZdd Z d d Z d d Z dS)RequestzHypertext Transfer Protocol Request. TODO: Longer class information.... Attributes: __hdr__: Header fields of HTTP request. TODO. GET/1.0)methoduriversion)'rQPUTZICYCOPYHEADZLOCKZMOVEZPOLLPOSTZBCOPYZBMOVEZMKCOLTRACEZLABELZMERGEDELETEZSEARCHZUNLOCKZREPORTZUPDATEZNOTIFYZBDELETECONNECTOPTIONSZCHECKINZPROPFINDZCHECKOUTZCCM_POSTZ SUBSCRIBEZ PROPPATCHZ BPROPFINDZ BPROPPATCHZ UNCHECKOUTZ MKACTIVITYZ MKWORKSPACEZ UNSUBSCRIBEZ RPC_CONNECTzVERSION-CONTROLzBASELINE-CONTROLHTTPcCst|}|dd}|}t|dkr>td||d|jkr^td|dt|dkrrd|_ n>|d |j std|d|dt|j d d|_ |d|_ |d |_ t||dS) Nr r zinvalid request: %rrzinvalid http method: %r0.9zinvalid http version: %rr)rr rrrrrr_Request__methodsrV startswith_Request__protorTrUr5r6r,)r;r2rrrrrrr6s     zRequest.unpackcCs"d|j|j|j|jft|S)N %s %s %s/%s )rTrUrdrVr5rHrCrrrrHs zRequest.__str__cCs.d|j|j|j|jf}|ddt|S)Nrer r )rTrUrdrVrIr5rJr;Zstr_outrrrrJszRequest.__bytes__N) rKrLrMrNr8dictfromkeysrbrdr6rHrJrrrrrPs  rPc@s8eZdZdZddddZdZddZd d Zd d Zd S)ResponsezHypertext Transfer Protocol Response. TODO: Longer class information.... Attributes: __hdr__: Header fields of HTTP Response. TODO. rS200OK)rVstatusreasonr_cCst|}|}|dddd}t|dksP|d|jrP|ds^t d||dt|jdd|_ |d|_ t|dkr|dnd|_ t|j dkod t|j kod kn}t|||dS) Nr r r`rrzinvalid response: %rr i0)rr rrrrrc_Response__protoisdigitrrrVrlrmr+r5r6r,)r;r2rrrr?rrrr6s(  ,zResponse.unpackcCs"d|j|j|j|jft|S)N %s/%s %s %s )rprVrlrmr5rHrCrrrrHs zResponse.__str__cCs.d|j|j|j|jf}|ddt|S)Nrrr r )rprVrlrmrIr5rJrfrrrrJszResponse.__bytes__N) rKrLrMrNr8rpr6rHrJrrrrris ricCs\d}t|}|jdkst|jdks(t|jdks6t|jddksHtt|dddS)NPOST /main/redirect/ab/1,295,,00.html HTTP/1.0 Referer: http://www.email.com/login/snap/login.jhtml Connection: Keep-Alive User-Agent: Mozilla/4.75 [en] (X11; U; OpenBSD 2.8 i386; Nav) Host: ltd.snap.com Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */* Accept-Encoding: gzip Accept-Language: en Accept-Charset: iso-8859-1,*,utf-8 Content-type: application/x-www-form-urlencoded Content-length: 61 sn=em&mn=dtest4&pw=this+is+atest&fr=true&login=Sign+in&od=wwwrZ /main/redirect/ab/1,295,,00.html=sn=em&mn=dtest4&pw=this+is+atest&fr=true&login=Sign+in&od=wwwr(!application/x-www-form-urlencoded<rPrTAssertionErrorrUr3r/srrrrtest_parse_requestsr}cCst}t|dkstd|_d|_d|jd<d|jd<d|_t|}|d sRt|d s`td |ksltd |ksxtt |}|d st|dstd|kstd|ksttt |}t ||kstdS)NGET / HTTP/1.0 rZz/foo/bar/baz.htmlz text/plainr(5r'shelloz!POST /foo/bar/baz.html HTTP/1.0 z helloz content-length: 5 z content-type: text/plain s!POST /foo/bar/baz.html HTTP/1.0 s hellos content-length: 5 s content-type: text/plain ) rPrEryrTrUr/r3rcendswithbytes)r|r{rrrtest_format_requests&       rcCsVddlm}d}|d}||}t|}|jdks6t|jdksDt|jdksRtdS)Nr) unhexlifys$HTTP/1.1 200 OK Cache-control: no-cache Pragma: no-cache Content-Type: text/javascript; charset=utf-8 Content-Encoding: gzip Transfer-Encoding: chunked Set-Cookie: S=gmail=agg:gmail_yj=v2s:gmproxy=JkU; Domain=.google.com; Path=/ Server: GFE/1.3 Date: Mon, 12 Dec 2005 22:33:23 GMT A610d0a1f8b08000000000000000d0a3135320d0a6d914d4fc4201086effe0a82c99e584a4be9b6eec1e81e369e34f1e061358652da12596880bafaef85ee1a2ff231990cef303cc381a0c301e610c13ca765595435a1a4ace1db153aa49d0cfa354b00f62eaaeb86d579cd485995348ebc2a688c8e214c3759e627eb82575acf3e381e6487853158d863e6bc175a898fac208465de0a215d961769b5027b7bc27a301e0f23379c77337699329dfcc26338ea5b2f4550d6bcce84d0ceabf760271fac53d2c7d2fb94024edc040feeba195803547457d7b4d9920abc58a73bb09b2710243f46fdf3437a50748a55efb8c88b2d18edec3ce083850821f8225bb0d36a826893b8cfd89bbadad09214a4610d630d654dfd873d583b68d96a3be0646217c202bdb046c2696e23fb3ab6c47815d69f8aafcf290b5ebce76911808b004401d82f8278f6d8f74a28ae2f11701f2bc470093afefddfa359faae347f00c5a595a1e20100000d0a300d0a0d0az1.1rjrk)binasciirrirVryrlrm)rheaderr3r2r|rrrtest_chunked_responses   rcCs<d}t|}t|jdtks"tt|jddks8tdS)NsHTTP/1.x 200 OK Set-Cookie: first_cookie=cookie1; path=/; domain=.example.com Set-Cookie: second_cookie=cookie2; path=/; domain=.example.com Content-Length: 0 z set-cookier`)rirr/rryrrzrrrtest_multicookie_response8srcCs.d}t|}|jdkstt||ks*tdS)NsHTTP/1.1 200 r )rirmryrrzrrrtest_noreason_response@srcCs0t}d|_t|dkstt|dks,tdS)NsfoozHTTP/1.0 200 OK foosHTTP/1.0 200 OK foo)rir3rEryrr|rrrtest_response_with_bodyGsrcCs:d}g}|r&t|}|j}||qt|dks6tdS)NsQHTTP/1.1 304 Not Modified Content-Type: text/css Last-Modified: Wed, 14 Jan 2009 16:42:11 GMT ETag: "3a7-496e15e3" Cache-Control: private, max-age=414295 Date: Wed, 22 Sep 2010 17:55:54 GMT Connection: keep-alive Vary: Accept-Encoding HTTP/1.1 200 OK Server: Sun-ONE-Web-Server/6.1 ntCoent-length: 257 Content-Type: application/x-javascript Last-Modified: Wed, 06 Jan 2010 19:34:06 GMT ETag: "101-4b44e5ae" Accept-Ranges: bytes Content-Encoding: gzip Cache-Control: private, max-age=439726 Date: Wed, 22 Sep 2010 17:55:54 GMT Connection: keep-alive Vary: Accept-Encoding r`)rir7rrry)r{resultmsgrrrtest_body_forbidden_responseNs rc Csd}t|}|jdkst|jdks(t|jdks6td}t|}|jdksPt|jdks^t|jdksltddl}d}|jtjd d t|W5QRXdS) NsGET / HTTP/1.0 rQrRrSs GET / rarsGET / CHEESE/1.0 z$invalid http version: u?'CHEESE/1.0'match) rPrTryrUrVpytestraisesrr)r{r|rrrrtest_request_versionmsrcCsLd}t|}|jdkst|jdks(t|jdks6t|jddksHtdS)NrsrZrtrur(rvrxrzrrrtest_valid_headers  rcCs>d}t|}|jdkst|jdks(t|jddks:tdS)NsPOST /main/redirect/ab/1,295,,00.html HTTP/1.0 Referer: http://www.email.com/login/snap/login.jhtml Connection: Keep-Alive User-Agent: Mozilla/4.75 [en] (X11; U; OpenBSD 2.8 i386; Nav) Host: ltd.snap.com Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */* Accept-Encoding: gzip Accept-Language: en Accept-Charset: iso-8859-1,*,utf-8 Content-type: application/x-www-form-urlencoded Cookie: TrackID=1PWdcr3MO_C611BGWrZrtr(rv)rPrTryrUr/)Z s_weird_endr|rrrtest_weird_end_headers  rcCslddl}d}t|}|jdks"t|jdks0t|jdks>t|d|j}||j }| dshtdS)NrsHTTP/1.0 200 OK Server: SimpleHTTP/0.6 Python/2.7.12 Date: Fri, 10 Mar 2017 20:43:08 GMT Content-type: text/plain Content-Encoding: gzip Content-Length: 68 Last-Modified: Fri, 10 Mar 2017 20:40:43 GMT  ,VDԢJĜ̜T|b=.(m2rSrjrkr$sThis is a very small file) zlibrirVryrlrm decompressobj MAX_WBITS decompressr3rc)rr{r|Z decompressorr3rrrtest_gzip_responses  rcCs,tdd}|jdkstt|dks(tdS)ND)content_lengthr`)r5rryrrrrr test_messages rc Cstddl}d}|jtjddt|W5QRXd}|jtjddt|W5QRXd}|jtjddt|W5QRXd }|jtjd dt|W5QRXd }|jtjd dt|W5QRXd }|jtjddt|W5QRXd}|jtjddt|W5QRXd}|jtjddt|W5QRXd}|jtjddt|W5QRXdS)NrsINVALID / HTTP/1.0 z invalid http method: u?'INVALID'rAzinvalid response: b?'A's HTTT 200 OKz!invalid response: b?'HTTT 200 OK's HTTP TWO OKz!invalid response: b?'HTTP TWO OK's*HTTP/1.0 200 OK Invalid Header: invalid zinvalid header: s1HTTP/1.1 200 OK Transfer-Encoding: chunked r#s6HTTP/1.1 200 OK Transfer-Encoding: chunked 2 abcdr%s*HTTP/1.1 200 OK Content-Length: 68 a zshort body \(missing 65 bytes\)saaaaaaaaa bbbbbbbbbzinvalid request: u?'aaaaaaaa)rrrrrPrir-)rr{Zs_messy_headerrrr test_invalids@rcCsZd}ddddddg}tt|}t|}t|d}t||D]\}}||ks@tq@dS)NsvHTTP/1.0 200 OK Server: SimpleHTTP/0.6 Python/2.7.12 Date: Fri, 10 Mar 2017 20:43:08 GMT Content-type: text/plain zHTTP/1.0 200 OKz$server: SimpleHTTP/0.6 Python/2.7.12z#date: Fri, 10 Mar 2017 20:43:08 GMTzcontent-type: text/plainr z )rErisortedrzipry)r{respZr_strZs_arrZresp_arrZline1Zline2rrrtest_response_strs  rcCs$d}t|}d}|t|ks tdS)NsGET / HTTP/1.0 r~)rPrEry)r{r|reqrrrtest_request_strsrc CsXddl}ddlm}|d}|dddi}|jtjddt||W5QRXdS) Nrr)rs05 ERRr!r"r%r)rcompatrseekrrr-r4)rrr2r/rrrtest_parse_body$s  rN)!rN __future__rr collectionsrr rrrrr r4ZPacketr5rPrir}rrrrrrrrrrrrrrrrrrrs4    '5;1"<