B `=x @slddlZddlZddlZddlZddlZddlZddlmZddlm Z m Z m Z m Z m Z mZddlmZmZmZddlmZddlmZddlmZdd lmZmZdd lmZmZmZm Z m!Z!m"Z"dd l#m$Z$m%Z%dd l&m'Z'dd l(m)Z)m*Z*ddl+m,Z,yddl-Z-dZ.Wne/k r&dZ.YnXdZ0e1ej2Z3e4dZ5e4dZ6e4dZ7e8dddddddddddg Z9e8d dd!d"ddddddg Z:Gd#d$d$eZ;Gd%d&d&eZZ?Gd+d,d,e?Z@Gd-d.d.e?ZAGd/d0d0ZBGd1d2d2ZCe@ZDeAZEe9ZFe:ZGy2esNdd3lHm@Z@mAZAm9Z9m:Z:e@ZIeAZJe9ZKe:ZLWne/k rfYnXdS)4N)IntEnum)AnyListOptionalTupleTypeUnion) CIMultiDictCIMultiDictProxyistr)URL)hdrs) BaseProtocol) NO_EXTENSIONSBaseTimerContext) BadStatusLineContentEncodingErrorContentLengthError InvalidHeader LineTooLongTransferEncodingError) HttpVersion HttpVersion10)internal_logger) EMPTY_PAYLOAD StreamReader) RawHeadersTF) HeadersParser HttpParserHttpRequestParserHttpResponseParserRawRequestMessageRawResponseMessagez[!#$%&'*+\-.^_`|~0-9A-Za-z]+zHTTP/(\d+).(\d+)s'[\x00-\x1F\x7F()<>@,;:\[\]={} \t\\\\\"]r"methodpathversionheaders raw_headersZ should_close compressionupgradechunkedurlr#codereasonc@seZdZdZdZdZdZdS) ParseStaterr N)__name__ __module__ __qualname__ PARSE_NONE PARSE_LENGTH PARSE_CHUNKEDPARSE_UNTIL_EOFr9r9n/private/var/folders/7j/8686xlfs15q3tgljmghtvg0r0000gn/T/pip-target-isidps9b/lib/python/aiohttp/http_parser.pyr/[sr/c@s eZdZdZdZdZdZdZdS) ChunkStaterr r0r1N)r2r3r4PARSE_CHUNKED_SIZEPARSE_CHUNKED_CHUNKPARSE_CHUNKED_CHUNK_EOFPARSE_MAYBE_TRAILERSPARSE_TRAILERSr9r9r9r:r;cs r;c@s>eZdZd eeeddddZeeedefdd d Z dS) rN) max_line_size max_headersmax_field_sizereturncCs||_||_||_dS)N)rDrErF)selfrDrErFr9r9r:__init__lszHeadersParser.__init__zCIMultiDictProxy[str])linesrGcCst}g}d}|d}t|}x|ry|dd\}}Wntk rZt|dYnX|d}|}t|rt|t||j krt d | ddt |j t t|t|} |d7}||}|o|ddk} | r||g} x| rn| t|7} | |j kr.t d | ddt |j t | | ||d7}||krf||}|rl|ddk} qd }PqWd | }n0| |j krt d | ddt |j t | |}| d d } | d d } || | |||fq"Wt|t|fS) Nr :s zrequest header name {}utf8xmlcharrefreplacer) zrequest header field {}zutf-8surrogateescape)r lensplit ValueErrorrstriplstripHDRREsearchrFrformatdecodestrappendjoinaddr tuple)rHrJr'r(Z lines_idxline line_countZbnameZbvalue header_lengthZ continuationZ bvalue_lstnamevaluer9r9r: parse_headersvsn                 zHeadersParser.parse_headers)rBrCrB) r2r3r4intrIrbytesrrrer9r9r9r:rks rc@seZdZdeeeejeeeeeeeeee e ee e e e e dddd Z ejeeed d d Zed ddZddejejejfeeeee eeeee efdddZeeedeee ee e e fd ddZe ddddZdS)rNFT)protocollooplimitrDrErFtimerr-r$readallpayload_exceptionresponse_with_bodyread_until_eofauto_decompressrGcCs||_||_||_||_||_||_||_| |_| |_| |_ | |_ | |_ g|_ d|_ d|_d|_d|_||_||_t||||_dS)NrPF)rkrlrDrErFrnr-r$rorprqrr_lines_tail _upgraded_payload_payload_parser_auto_decompress_limitr_headers_parser)rHrkrlrmrDrErFrnr-r$rorprqrrrsr9r9r:rIs(zHttpParser.__init__)rJrGcCsdS)Nr9)rHrJr9r9r: parse_messageszHttpParser.parse_message)rGcCsv|jdk r|jd|_nV|jr0|j|j|jrr|jddkrP|jdy ||jStk rpdSXdS)Nz rP)rxfeed_eofrurtr\r| Exception)rHr9r9r:r~s    zHttpParser.feed_eofs rP)dataSEPEMPTYCONTENT_LENGTH METH_CONNECTSEC_WEBSOCKET_KEY1rGc Csg}|jr|j|d}|_t|}d} |j} x^| |kr|jdkr|js||| } | | krt|jst| d} q2| | kr|j|| | | d} |jd|krz||j} Wd|j X| j |} | dk ry t | } Wnt k rt|YnX| dkrt||| j kr0t|| j|_t| d|j}|jdk sVt| dk rj| dksz| jr| jst|j|j| |jd}t|| | j|| j|j|j|j|jd }|jsz||_n||krt|j|j| |jd}d|_t|| j| jd|jd |_nrt| d d d krv| dkrv|jrvt|j|j| |jd}t|| | j|| j|jd|j|jd }|jsz||_nt }|| |fn|| d|_|}Pq2|jdkr|jr|jrtPq2|r| |kr|jrt|jdk sty|j!|| d\}}Wn`t"k rl}z@|j#dk rF|jj$%|#t&|n|jj$%|d}d}Wdd}~XYnX|rd} t|}d|_q2q2Pq2W|r| |kr|| d}n|}||j|fS) NrPrr0r}r$)rnrlrm)lengthr+r$r)r-rorqrsT)r$r)rorsr-d)'rurRrlrxrvfindrtr\r|clearr'getrfrTrr*getattrr$rkAssertionErrorr+rrnrzHttpPayloadParserr)r-rorqrydonerrr feed_data BaseExceptionrppayload set_exceptionr[)rHrrrrrrmessagesZdata_lenZ start_posrlposmsgrr$rZpayload_parsereofexcr9r9r:rs                   zHttpParser.feed_datazCIMultiDictProxy[str]c Cs|j|\}}d}d}d}d}|tj}|r`|} | dkrFd}n| dkrTd}n | dkr`d}|tj} | r| } | dkr| }|tj} | rd| krd}||||||fS) zParses RFC 5322 headers from a stream. Line continuations are supported. Returns list of header name and value pairs. Header name is in upper case. NFcloseTz keep-aliver*)gzipdeflatebrr+)r{rerrZ CONNECTIONlowerZCONTENT_ENCODINGZTRANSFER_ENCODING) rHrJr'r(Z close_connencodingr*r+connvencter9r9r:res.    zHttpParser.parse_headers)valrGcCs ||_dS)zYSet connection upgraded (to websocket) mode. :param bool val: new state. N)rv)rHrr9r9r: set_upgradedszHttpParser.set_upgraded)NNrhrirjriNNNFNTFT)r2r3r4rrasyncioZAbstractEventLooprfrr[boolrrrIabcabstractmethodrrgrr|r~rrrrr rrrrerr9r9r9r:rs:<&$&rc@s$eZdZdZeeedddZdS)r zRead request status line. Exception .http_exceptions.BadStatusLine could be raised in case of any errors in status line. Returns RawRequestMessage. )rJrGcCs\|ddd}y|dd\}}}Wntk rDt|dYnXt||jkrntdt|jtt||d\}}}|d\}} } t |st|yB| dr|d dd d \} } t t | t | } nt|Wntk rt|YnX||\}}}}}}|dkr4| tkr0d }nd }t||| ||||||tj|| |d d S)Nrzutf-8rQr0zStatus line is too long#?zHTTP/.r TF)r%Z query_stringfragmentencoded)rZrSrTrrRrDrr[ partitionMETHREmatch startswithrrfrrerr"r build)rHrJr`r$r%r&Z path_partZ_hash_separatorZ url_fragmentZ_question_mark_separatorZqs_partZn1Zn2 version_or'r(rr)r*r+r9r9r:r|sN      zHttpRequestParser.parse_messageN)r2r3r4__doc__rrgrr|r9r9r9r:r sr c@s$eZdZdZeeedddZdS)r!zRead response status line and headers. BadStatusLine could be raised in case of any errors in status line. Returns RawResponseMessage)rJrGc CsT|ddd}y|dd\}}Wntk rBt|dYnXy|dd\}}Wntk rpd}YnXt||jkrtdt|jtt|t |}|dkrt|t t | dt | d}y t |}Wntk rt|dYnX|dkrt|| |\} } } } } }| dkr8|tk} t|||| | | | | | S) Nrzutf-8rQr zStatus line is too longr0i)rZrSrTrrRrDrr[VERSRErrrfgrouprerr#rU)rHrJr`r&statusr.rrZstatus_ir'r(rr)r*r+r9r9r:r|3sF      z HttpResponseParser.parse_messageN)r2r3r4rrrgrr|r9r9r9r:r!-sr!c @sjeZdZdeeeeeeeeeeeeedd ddZdddd Z de e e e ee fd d dZ dS)rNFT) rrr+r)r-r$rorqrsrGc Csd|_tj|_tj|_d|_d|_| |_ d|_ |rH|rH|j rHt ||} n|} |shtj|_| d|_ n||rvtj |_nn|dk rtj|_||_|jdkr| d|_ n>|r|dkrtj|_n(|dkrtdtj|_| d|_ | |_dS)NrrPFT)PUTPOSTz6Content-Length or Transfer-Encoding header is required)_lengthr/r5_typer;r=_chunk _chunk_size _chunk_tailryr DeflateBufferr~r7r6r8rwarningr) rHrrr+r)r-r$rorqrsZ real_payloadr9r9r:rIns@      zHttpPayloadParser.__init__)rGcCsF|jtjkr|jn*|jtjkr.tdn|jtjkrBtddS)Nz2Not enough data for satisfy content length header.z3Not enough data for satisfy transfer length header.) rr/r8rr~r6rr7r)rHr9r9r:r~s    zHttpPayloadParser.feed_eof ;)chunkr CHUNK_EXTrGc CsB|jtjkr|j}t|}||krT|||_|j|||jdkr|jdSn6d|_|j|d|||jd||dfSn|jtjkr|j r|j |}d|_ x|r|j t j kr| |}|dkr| |d|}|dkr|d|}n |d|}ytt|d} Wn@tk rbt|d|dd} |j| | dYnX||dd}| dkrt j|_ nt j|_ | |_|jn ||_ d S|j t jkr(|j}t|}||kr|||_|j||d Sd|_|j|d||||d}t j|_ |j|j t jkrh|dd|kr^|dd}t j |_ n ||_ d S|j t jkr|dd} | |kr|jd|ddfS| sd S| |dd kr| |_ d St j|_ |j t jkr| |}|dkr||dd}t j|_ q||_ d SqWn |jtjkr>|j|t|d S) Nr)TrPTrPasciirQr0)FrPr )rr/r6rrRrrr~r7rrr;r=rrfrgrTrrZrr@r>rbegin_http_chunk_receivingr?end_http_chunk_receivingrAr8) rHrrrrequiredZ chunk_lenriZsize_bsizerheadr9r9r:rs                              zHttpPayloadParser.feed_data)NFNNNFTT)rr) r2r3r4rrrfrr[rIr~rgrrr9r9r9r:rms$- rc@sreZdZdZeeeddddZeddddZ e e dd d d Z dd d dZ dd ddZdd ddZdS)rzDDeflateStream decompress stream and feed data into specified stream.N)outrrGcCsb||_d|_||_d|_|dkr8ts,tdt|_n&|dkrJdt j nt j }t j |d|_dS)NrFrzGCan not decode content-encoding: brotli (br). Please install `brotlipy`rr)wbits) rrr_started_decoding HAS_BROTLIrbrotliZ Decompressor decompressorzlib MAX_WBITS decompressobj)rHrr zlib_moder9r9r:rI/s zDeflateBuffer.__init__)rrGcCs|j|dS)N)rr)rHrr9r9r:r@szDeflateBuffer.set_exception)rrrGcCs|sdS|j|7_|jsH|jdkrH|dd@dkrHtjtj d|_y|j|}Wn"tk rzt d|jYnXd|_|r|j |t |dS)Nrr)rz#Can not decode content-encoding: %sT) rrrrrrr decompressrrrrrR)rHrrr9r9r:rCs zDeflateBuffer.feed_data)rGcCsR|j}|s|jdkrD|j|t||jdkrD|jjsDtd|j dS)Nrr) rflushrrrrRrrrr~)rHrr9r9r:r~as  zDeflateBuffer.feed_eofcCs|jdS)N)rr)rHr9r9r:rksz(DeflateBuffer.begin_http_chunk_receivingcCs|jdS)N)rr)rHr9r9r:rnsz&DeflateBuffer.end_http_chunk_receiving)r2r3r4rrrr[rIrrrgrfrr~rrr9r9r9r:r,s r)r r!r"r#)Mrr collectionsrestringrenumrtypingrrrrrrZ multidictr r r Zyarlr rrZ base_protocolrZhelpersrrZhttp_exceptionsrrrrrrZ http_writerrrlogrZstreamsrrZtypedefsrrr ImportError__all__set printableZASCIISETcompilerrrW namedtupler"r#r/r;rABCrr r!rrZHttpRequestParserPyZHttpResponseParserPyZRawRequestMessagePyZRawResponseMessagePyZ _http_parserZHttpRequestParserCZHttpResponseParserCZRawRequestMessageCZRawResponseMessageCr9r9r9r:s            ^K@@F