U '7`}@sddlZddlZddlZddlZddlZddlZddlZddlmZddl m Z ddl m Z m Z mZmZmZmZmZmZmZmZmZmZddlmZmZmZddlmZmZmZddl m!Z!m"Z"m#Z#m$Z$m%Z%dd l&m'Z'm(Z(m)Z)m*Z*dd l+m,Z,dd l-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4dd l5m6Z6d Z7e r6ddl8m9Z9Gddde:Z;Gddde:Zd'ee=e=fe=ee=dddZ?GdddZ@GdddZAe4eAe0jBdGdd d e1ZCGd!d"d"ZDee1e=e=fZEGd#d$d$e1ZFGd%d&d&ZGdS)(N)deque) TracebackType) TYPE_CHECKINGAny AsyncIteratorDictIteratorListMappingOptionalSequenceTupleTypeUnion) parse_qslunquote urlencode) CIMultiDictCIMultiDictProxy MultiMapping)CONTENT_DISPOSITIONCONTENT_ENCODINGCONTENT_LENGTHCONTENT_TRANSFER_ENCODING CONTENT_TYPE)CHARTOKENparse_mimetypereify) HeadersParser) JsonPayload LookupErrorOrderPayload StringPayload get_payload payload_type) StreamReader)MultipartReaderMultipartWriterBodyPartReaderBadContentDispositionHeaderBadContentDispositionParamparse_content_dispositioncontent_disposition_filename)ClientResponsec@s eZdZdS)r,N__name__ __module__ __qualname__r5r5D/opt/alt/python38/lib64/python3.8/site-packages/aiohttp/multipart.pyr,?sr,c@s eZdZdS)r-Nr1r5r5r5r6r-Csr-)headerreturncsttdddttddd}ttdfdd }ttddd }ttdd d }d ttjtd tttddd}|sdifS|d^}}|st t |difSi}|r| d} d| krt t |difS| dd\} } | } | } | |kr(t t |difS| sFt t| qn\|| r|| rl|| dd} n| st t| qn|| r|| r| dd\} } } | pd} nt t| qzt| | d} Wn(tk rt t| YqYnXnd}|| r2d}|| ddd} nT| rBd}nD|rd| |d}||r| d||ddd} d}|rt t |difS| || <q| |fS)N)stringr8cSst|ott|kSN)boolrsetr9r5r5r6is_tokenJsz+parse_content_disposition..is_tokencSs |d|dkodkSS)Nr"r5r=r5r5r6 is_quotedMsz,parse_content_disposition..is_quotedcs|o|ddkS)N')countr=r>r5r6 is_rfc5987Psz-parse_content_disposition..is_rfc5987cSs |dS)N*)endswithr=r5r5r6is_extended_paramSsz4parse_content_disposition..is_extended_paramcSs@|dd}|sdS|dr,||dn ||d}|S)NrGrFr?)findrHisdigit)r9posZ substringr5r5r6is_continuous_paramVs "z6parse_content_disposition..is_continuous_param)chars)textrOr8cSstd|dd|S)Nz\\([z])z\1)resub)rPrOr5r5r6unescape]sz+parse_content_disposition..unescape;r=rr?rBrCutf-8strictTFz\/z{};{})strr;joinmaprQescapersplitwarningswarnr,poplowerstriplstripr-rUnicodeDecodeErrorformat)r7rArFrIrMrSZdisptypepartsparamsitemkeyvalueencoding_Zfailed_valuer5rEr6r.Gsz&                r.filename)rfnamer8c sd||sdS|kr |S||kr0||Sg}tfdd|D}t|D]N\}\}}|dd\}}|dr|dd}|t|kr||qVqqV|sdSd|}d|kr|dd \} }}| pd } t|| d S|SdS) Nz%s*c3s$|]\}}|r||fVqdSr:) startswith).0rhriZname_sufr5r6 s z/content_disposition_filename..rGrr?rNrBrCrVrW) sorteditems enumerater\rHrXappendrYr) rfrnreZfnparamsZnumrhrirktailrjr5rqr6r/s4       r/c@steZdZdZddddddZddd d Zed dd d ZedddZ e ed dddZ ddddZ dS)MultipartResponseWrapperzzWrapper around the MultipartReader. It takes care about underlying connection and close it when it needs in. r0r)N)respstreamr8cCs||_||_dSr:)ryrz)selfryrzr5r5r6__init__sz!MultipartResponseWrapper.__init__r8cCs|Sr:r5r{r5r5r6 __aiter__sz"MultipartResponseWrapper.__aiter__)r)r+cs|IdH}|dkrt|Sr:nextStopAsyncIterationr{partr5r5r6 __anext__sz"MultipartResponseWrapper.__anext__cCs |jjS)z2Returns True when all response data had been read.)rycontentat_eofr~r5r5r6rszMultipartResponseWrapper.at_eofcs,|jIdH}|jr(|IdH|S)z#Emits next multipart reader object.N)rzrrreleaser{rgr5r5r6rs zMultipartResponseWrapper.nextcs|jIdHdS)zPReleases the connection gracefully, reading all the content to the void.N)ryrr~r5r5r6rsz MultipartResponseWrapper.release) r2r3r4__doc__r|rrrr;rr rrr5r5r5r6rxs   rxc@seZdZdZdZededdddZeddd d Z edd d Z e edd dZ dde edddZefeedddZeedddZeedddZedddZddddZdde eed d!d"Zdde ee eeefd d#d$Zdde eeeeefd d%d&Ze dd'd(Zeed)d*d+Zeed)d,d-Zeed)d.d/Z eed0d1d2Z!e"e edd3d4Z#e"e edd5d6Z$dS)7r+z&Multipart reader for single body part.i CIMultiDictProxy[str]N)boundaryheadersrr8cCs`||_||_||_d|_|jtd}|dk r6t|nd|_d|_t |_ d|_ d|_ i|_ dS)NFr)r _boundary_content_at_eofgetrint_length _read_bytesr_unread _prev_chunk _content_eof_cache)r{rrrZlengthr5r5r6r|szBodyPartReader.__init__r}cCs|Sr:r5r~r5r5r6r szBodyPartReader.__aiter__cs|IdH}|dkrt|Sr:rrr5r5r6rszBodyPartReader.__anext__cs|IdH}|sdS|Sr:)readrr5r5r6rszBodyPartReader.nextFdecode)rr8csB|jr dSt}|js0|||jIdHq|r>||S|S)zReads body part data. decode: Decodes data following by encoding method from Content-Encoding header. If it missed data remains untouched N)r bytearrayextend read_chunk chunk_sizer)r{rdatar5r5r6rs zBodyPartReader.read)sizer8cs|jr dS|jr"||IdH}n||IdH}|jt|7_|j|jkrVd|_|jr||jIdH}d|ks|td|S)zWReads body part content chunk of the specified size. size: chunk size rNT z3reader did not read all the data or it is malformed) rr_read_chunk_from_length_read_chunk_from_streamrlenrreadlineAssertionError)r{rchunkZclrfr5r5r6r,s zBodyPartReader.read_chunkcs:|jdk stdt||j|j}|j|IdH}|S)Nz(Content-Length required for chunked read)rrminrrr)r{rrrr5r5r6rBsz&BodyPartReader._read_chunk_from_lengthc sR|t|jdkstd|jdk}|r<|j|IdH|_|j|IdH}|jt|j7_|jdksxtd|jdk st|j|}d|j}|r| |}n | |t dt|jt|}|dkrBt (t j dtd|j||dW5QRX||kr$|jd||_|t|j|}|sBd |_|j}||_|S) NrCzReturns charset parameter from Content-Type header or default.rNcharset)rrrr parameters)r{rctypemimetyper5r5r6rszBodyPartReader.get_charsetcCst|jt\}}t|dS)zoReturns name specified in Content-Disposition header or None if missed or header is malformed. rnr.rrrr/r{rkrfr5r5r6rnszBodyPartReader.namecCst|jt\}}t|dS)zsReturns filename specified in Content-Disposition header or None if missed or header is malformed. rmrrr5r5r6rmszBodyPartReader.filename)%r2r3r4rrbytesr(r|rrrr rr;rrrrrrrrXrPrrrr r rrrrrrrrnrmr5r5r5r6r+s8 "&&  r+)ordercs8eZdZeeeddfdd ZeddddZZS)BodyPartReaderPayloadN)riargskwargsr8csTtj|f||i}|jdk r,|j|d<|jdk r@|j|d<|rP|jd|dS)Nrnrm attachmentT)rT)superr|rnrmZset_content_disposition)r{rirrrf __class__r5r6r|s    zBodyPartReaderPayload.__init__writerr8csJ|j}|jddIdH}|rF|||IdH|jddIdH}qdS)Ni)r)rlrwriter)r{rZfieldrr5r5r6rs zBodyPartReaderPayload.write)r2r3r4r+rr|r __classcell__r5r5rr6rs rc@s.eZdZdZeZdZeZe e e fe ddddZ e dddd Zeedefdd d Zed ed ddZedddZeedefdddZddddZedefdddZdedefdddZe dddZedddZddd d!Zddd"d#Zddd$d%Zddd&d'Z dS)(r)zMultipart body reader.N)rrr8cCs:||_d||_||_d|_d|_d|_g|_dS)Nz--FT) r _get_boundaryencoderr _last_partr_at_bofr)r{rrr5r5r6r|szMultipartReader.__init__r+r}cCs|Sr:r5r~r5r5r6rszMultipartReader.__aiter__cs|IdH}|dkrt|Sr:rrr5r5r6r"szMultipartReader.__anext__r0)responser8cCs||||j|j}|S)zConstructs reader instance from HTTP response. :param response: :class:`~aiohttp.client.ClientResponse` instance )response_wrapper_clsrr)clsrobjr5r5r6 from_response*s  zMultipartReader.from_responsecCs|jS)zSReturns True if the final boundary was reached or False otherwise. rr~r5r5r6r8szMultipartReader.at_eofcsb|jr dS|IdH|jr4|IdHd|_n|IdH|jrLdS|IdH|_|jS)z#Emits the next multipart body part.NF)r_maybe_release_last_partr_read_until_first_boundary_read_boundaryfetch_next_partrr~r5r5r6r>szMultipartReader.nextcs2|js.|IdH}|dkrq.|IdHqdS)z=Reads all the body parts to the void till the final boundary.N)rrrrr5r5r6rPs zMultipartReader.releasecs|IdH}||S)z"Returns the next body part reader.N) _read_headers_get_part_reader)r{rr5r5r6rXszMultipartReader.fetch_next_partr)rr8cCs\|td}t|}|jdkrF|jdkr8t|||jS|||jS||j||jSdS)zDispatches the response by the `Content-Type` header, returning suitable reader instance. :param dict headers: Response headers rN multipartN)rrrtypemultipart_reader_clsrpart_reader_clsr)r{rrrr5r5r6r_s   z MultipartReader._get_part_readercCsbt|jt}|jdks tdd|jkr|jdk r:|js$|jIdH|j|jjd|_dS)z8Ensures that the last read body part is read completely.N)rrrrrr~r5r5r6rs   z(MultipartReader._maybe_release_last_part)!r2r3r4rrxrrr+rr rXr(r|rrr rr classmethodrr;rrrrrrrrrrrrr5r5r5r6r)s8        r)csreZdZdZd)eeeddfdd Zdddd Zeee ee ee dd d d Z e e dd dZedddZedddZedZedZeedddZeedddZd*eeeeedddZeedddZd+eeeeeddd Zd,e e!e"eefe#eeffeeeedd!d"Z$eeedd#d$Z%d-eedd&d'd(Z&Z'S).r*zMultipart body writer.mixedN)subtyperr8csr|dk r |ntj}z|d|_Wntk rDtddYnXd|d|j}tj d|dg|_ dS)Nasciiz(boundary should contain ASCII only charsz multipart/z ; boundary=) content_type) uuidZuuid4hexrrUnicodeEncodeErrorr_boundary_valuerr|_parts)r{rrrrr5r6r|szMultipartWriter.__init__r}cCs|Sr:r5r~r5r5r6 __enter__szMultipartWriter.__enter__)exc_typeexc_valexc_tbr8cCsdSr:r5)r{r r r r5r5r6__exit__szMultipartWriter.__exit__cCs t|jSr:)iterr r~r5r5r6__iter__szMultipartWriter.__iter__cCs t|jSr:)rr r~r5r5r6__len__szMultipartWriter.__len__cCsdS)NTr5r~r5r5r6__bool__szMultipartWriter.__bool__s\A[!#$%&'*+\-.^_`|~\w]+\Zs[\x00-\x08\x0A-\x1F\x7F]cCs^|j}t|j|r|dSt|j|r4td|dd}|dd}d|ddS)zyWrap boundary parameter value in quotes, if necessary. Reads self.boundary and returns a unicode sting. rz*boundary value contains invalid characters\s\\"s\"r@) rrQmatch_valid_tchar_regexrsearch_invalid_qdtext_char_regexrreplace)r{riZquoted_value_contentr5r5r6rs   zMultipartWriter._boundary_valuecCs |jdS)Nr)rrr~r5r5r6rszMultipartWriter.boundary)rrr8cCsn|dkrt}t|tr.|j|||Szt||d}Wn tk r^td|Yn X||SdS)NrzCannot create payload from %r) r isinstancer$rupdateappend_payloadr&r" TypeError)r{rrpayloadr5r5r6rvs   zMultipartWriter.append)rr8cCs|jtd}|r,|dkr,td||dkr8d}|jtd}|dkr`td||dkrld}|j}|dk r|s|st||jt <|j |||f|S) z)Adds a new body part to multipart writer.rN)rrrrrN)rNrrrrr) rrrr`rrrdrrXrr rv)r{rrj te_encodingrr5r5r6r"s. zMultipartWriter.append_payloadcCs |dkrt}|t||dS)zHelper to append JSON part.Nr)rrr!)r{rrr5r5r6 append_jsonBszMultipartWriter.append_jsoncCsVt|ttfst|dkr t}t|tr6t|}t|dd}|t ||ddS)z&Helper to append form urlencoded part.NT)Zdoseqz!application/x-www-form-urlencoded)rr) rr r rrlistrtrrr%)r{rrrr5r5r6 append_formKs   zMultipartWriter.append_formcCsvd}|jD]P\}}}|s&|s&|jdkr,dS|tdt|jd|jt|jd7}q |dt|jd7}|S)zSize of the payload.rNrC)r rrrr_binary_headers)r{Ztotalrrjr r5r5r6r`s& zMultipartWriter.sizeT)rclose_boundaryr8cs|jD]\}}}|d|jdIdH||jIdH|sD|rt|}|rZ|||rh||||IdH|IdHn||IdH|dIdHq|r|d|jdIdHdS)z Write body.rrNs-- )r rrr%MultipartPayloadWriterenable_compressionenable_encoding write_eof)r{rr&rrjr wr5r5r6rts  zMultipartWriter.write)rN)N)N)N)T)(r2r3r4rrXr r|r r BaseExceptionrrr_Partrrrr;rrQcompilerrpropertyrrrrr$rvrr!rr r r r#rrrr5r5rr6r*sD    !    r*c@s\eZdZeddddZeddddZdeddd d Zdd d d Ze ddddZ dS)r'NrcCs||_d|_d|_d|_dSr:)_writer _encoding _compress_encoding_buffer)r{rr5r5r6r|szMultipartPayloadWriter.__init__rcCs*|dkr||_t|_n|dkr&d|_dS)Nrr)r1rr3)r{rjr5r5r6r)s  z&MultipartPayloadWriter.enable_encodingrcCs,|dkrdtjntj }tj|d|_dS)Nrr)Zwbits)rrZ compressobjr2)r{rjZ zlib_moder5r5r6r(sz)MultipartPayloadWriter.enable_compressionr}cs\|jdk r.|j}|r.d|_||IdH|jdkrX|jrX|jt|jIdHdS)Nr)r2flushrr1r3r0r b64encoderr5r5r6r*s   z MultipartPayloadWriter.write_eof)rr8cs|jdk r"|r"|j|}|s"dS|jdkr|j}|dk s>t|||rtt|d\}}|d|d||dd}|_|rt |}|j |IdHn6|jdkr|j t |IdHn|j |IdHdS)Nrrr)r2compressr1r3rrdivmodrrr5r0rrZb2a_qp)r{rZbufZdivmodZ enc_chunkZb64chunkr5r5r6rs$     $  zMultipartPayloadWriter.write)r) r2r3r4rr|rXr)r(r*rrr5r5r5r6r's  r')rm)HrrrrQrr]r collectionsrtypesrtypingrrrrrr r r r r rrZ urllib.parserrrZ multidictrrrZhdrsrrrrrZhelpersrrrrZhttpr rr!r"r#r$r%r&r'Zstreamsr(__all__Z client_reqrepr0RuntimeWarningr,r-rXr.r/rxr+Z try_firstrr)r-r*r'r5r5r5r6sR  8 $    d  !-z ;H