B `}@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__r4r4l/private/var/folders/7j/8686xlfs15q3tgljmghtvg0r0000gn/T/pip-target-isidps9b/lib/python/aiohttp/multipart.pyr,?sr,c@s eZdZdS)r-N)r1r2r3r4r4r4r5r-Csr-)headerreturncsttdddttddd}ttdfdd }ttddd }ttdd d }d ttjtd tttddd}|sdifS|d^}}|st t |difSi}x|r| d} d| krt t |difS| dd\} } | } | } | |kr,t t |difS| sJt t| qnZ|| r|| rp|| dd} n| st t| qn|| r || r| dd\} } } | pd} nt t| qyt| | d} Wn&tk rt t| wYnXnd}|| r4d}|| ddd} nT| rDd}nD|rd| |d}||r| d||ddd} d}|rt t |difS| || <qW| |fS)N)stringr7cSst|ott|kS)N)boolrset)r8r4r4r5is_tokenJsz+parse_content_disposition..is_tokencSs |d|dkodkSS)Nr"r4)r8r4r4r5 is_quotedMsz,parse_content_disposition..is_quotedcs|o|ddkS)N')count)r8)r;r4r5 is_rfc5987Psz-parse_content_disposition..is_rfc5987cSs |dS)N*)endswith)r8r4r4r5is_extended_paramSsz4parse_content_disposition..is_extended_paramcSs@|dd}|sdS|dr,||dn ||d}|S)NrCrFr<)findrDisdigit)r8posZ substringr4r4r5is_continuous_paramVs "z6parse_content_disposition..is_continuous_param)chars)textrKr7cSstd|dd|S)Nz\\([z])z\1)resub)rLrKr4r4r5unescape]sz+parse_content_disposition..unescape;r=rr<r?r@zutf-8strictTFz\/z{};{})strr9joinmaprMescapersplitwarningswarnr,poplowerstriplstripr-rUnicodeDecodeErrorformat)r6r>rBrErIrOZdisptypepartsparamsitemkeyvalueencoding_failed_valuer4)r;r5r.Gsz&                 r.filename)ranamer7c sd||sdS|kr |S||kr0||Sg}tfdd|D}xXt|D]L\}\}}|dd\}}|dr|dd}|t|kr||qXPqXW|sdSd|}d|kr|dd \} }}| pd } t|| d S|SdS) Nz%s*c3s$|]\}}|r||fVqdS)N) startswith).0rcrd)name_sufr4r5 sz/content_disposition_filename..rCrr<rJr?r@zutf-8rR) sorteditems enumeraterWrDrSappendrTr) rarjr`Zfnparamsnumrcrdrftailrer4)rmr5r/s2      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)respstreamr7cCs||_||_dS)N)rvrw)selfrvrwr4r4r5__init__sz!MultipartResponseWrapper.__init__)r7cCs|S)Nr4)rxr4r4r5 __aiter__sz"MultipartResponseWrapper.__aiter__)r)r+cs|IdH}|dkrt|S)N)nextStopAsyncIteration)rxpartr4r4r5 __anext__sz"MultipartResponseWrapper.__anext__cCs |jjS)z2Returns True when all response data had been read.)rvcontentat_eof)rxr4r4r5rszMultipartResponseWrapper.at_eofcs,|jIdH}|jr(|IdH|S)z#Emits next multipart reader object.N)rwr{rrelease)rxrbr4r4r5r{s zMultipartResponseWrapper.nextcs|jIdHdS)zPReleases the connection gracefully, reading all the content to the void.N)rvr)rxr4r4r5rsz MultipartResponseWrapper.release) r1r2r3__doc__ryrzrr~r9rr r{rr4r4r4r5rusruc@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 zCIMultiDictProxy[str]N)boundaryheadersrr7cCs`||_||_||_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)rxrrrlengthr4r4r5ryszBodyPartReader.__init__)r7cCs|S)Nr4)rxr4r4r5rz szBodyPartReader.__aiter__cs|IdH}|dkrt|S)N)r{r|)rxr}r4r4r5r~szBodyPartReader.__anext__cs|IdH}|sdS|S)N)read)rxrbr4r4r5r{szBodyPartReader.nextF)decode)rr7csF|jr dSt}x"|js2|||jIdHqW|rB||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)rxrdatar4r4r5rs zBodyPartReader.read)sizer7cs|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 rNTs z3reader did not read all the data or it is malformed) rr_read_chunk_from_length_read_chunk_from_streamrlenrreadlineAssertionError)rxrchunkZclrfr4r4r5r,s  zBodyPartReader.read_chunkcs:|jdk stdt||j|j}|j|IdH}|S)Nz(Content-Length required for chunked read)rrminrrr)rxrrrr4r4r5rBsz&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||dWdQRX||kr$|jd||_|t|j|}|sBd |_|j}||_|S) Nr@zReturns charset parameter from Content-Type header or default.rJcharset)rrrr parameters)rxrctypemimetyper4r4r5rszBodyPartReader.get_charsetcCst|jt\}}t|dS)zoReturns name specified in Content-Disposition header or None if missed or header is malformed. rj)r.rrrr/)rxrfrar4r4r5rjszBodyPartReader.namecCst|jt\}}t|dS)zsReturns filename specified in Content-Disposition header or None if missed or header is malformed. ri)r.rrrr/)rxrfrar4r4r5riszBodyPartReader.filename)%r1r2r3rrbytesr(ryrrzr~r r{r9rrrrrrrrSrLrrrr r rrrrrrrrjrir4r4r4r5r+s2"&&  r+)ordercs8eZdZeeeddfdd ZeddddZZS)BodyPartReaderPayloadN)rdargskwargsr7csTtj|f||i}|jdk r,|j|d<|jdk r@|j|d<|rP|jd|dS)Nrjri attachmentT)rT)superryrjriZset_content_disposition)rxrdrrra) __class__r4r5rys    zBodyPartReaderPayload.__init__)writerr7csN|j}|jddIdH}x0|rH|||IdH|jddIdH}qWdS)Ni)r)rhrwriter)rxrfieldrr4r4r5rs zBodyPartReaderPayload.write)r1r2r3r+rryr __classcell__r4r4)rr5rs 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)rrr7cCs:||_d||_||_d|_d|_d|_g|_dS)Nz--FT) r _get_boundaryencoderr _last_partr_at_bofr)rxrrr4r4r5ryszMultipartReader.__init__r+)r7cCs|S)Nr4)rxr4r4r5rzszMultipartReader.__aiter__cs|IdH}|dkrt|S)N)r{r|)rxr}r4r4r5r~"szMultipartReader.__anext__r0)responser7cCs||||j|j}|S)zConstructs reader instance from HTTP response. :param response: :class:`~aiohttp.client.ClientResponse` instance )response_wrapper_clsrr)clsrobjr4r4r5 from_response*s zMultipartReader.from_responsecCs|jS)zSReturns True if the final boundary was reached or False otherwise. )r)rxr4r4r5r8szMultipartReader.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_partr)rxr4r4r5r{>szMultipartReader.nextcs6x0|js0|IdH}|dkr P|IdHqWdS)z=Reads all the body parts to the void till the final boundary.N)rr{r)rxrbr4r4r5rPs zMultipartReader.releasecs|IdH}||S)z"Returns the next body part reader.N) _read_headers_get_part_reader)rxrr4r4r5rXszMultipartReader.fetch_next_partzCIMultiDictProxy[str])rr7cCs\|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 rJ multipartN)rrrtypemultipart_reader_clsrpart_reader_clsr)rxrrrr4r4r5r_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)rrrrr)rxr4r4r5rs   z(MultipartReader._maybe_release_last_part)!r1r2r3rrurrr+rr rSr(ryrrzr rr~ classmethodrr9rr{rrrrrrrrrrr4r4r4r5r)s,    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)subtyperr7csr|dk r |ntj}y|d|_Wntk rDtddYnXd|d|j}tj d|dg|_ dS)Nasciiz(boundary should contain ASCII only charsz multipart/z ; boundary=) content_type) uuiduuid4hexrrUnicodeEncodeErrorr_boundary_valuerry_parts)rxrrr)rr4r5ryszMultipartWriter.__init__)r7cCs|S)Nr4)rxr4r4r5 __enter__szMultipartWriter.__enter__)exc_typeexc_valexc_tbr7cCsdS)Nr4)rxrrrr4r4r5__exit__szMultipartWriter.__exit__cCs t|jS)N)iterr)rxr4r4r5__iter__szMultipartWriter.__iter__cCs t|jS)N)rr)rxr4r4r5__len__szMultipartWriter.__len__cCsdS)NTr4)rxr4r4r5__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=) rrMmatch_valid_tchar_regexrsearch_invalid_qdtext_char_regexrreplace)rxrdZquoted_value_contentr4r4r5rs   zMultipartWriter._boundary_valuecCs |jdS)Nr)rr)rxr4r4r5rszMultipartWriter.boundary)rrr7cCsn|dkrt}t|tr.|j|||Syt||d}Wn tk r^td|Yn X||SdS)N)rzCannot create payload from %r) r isinstancer$rupdateappend_payloadr&r" TypeError)rxrrpayloadr4r4r5rrs   zMultipartWriter.append)rr7cCs|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.rJ)rrrzunknown content encoding: rN)rJrzquoted-printablerz%unknown content transfer encoding: {}r) rrrr[rrr_rrSrrrr)rxrre te_encodingrr4r4r5r"s(    zMultipartWriter.append_payloadcCs |dkrt}|t||dS)zHelper to append JSON part.N)r)rrr!)rxrrr4r4r5 append_jsonBszMultipartWriter.append_jsoncCsVt|ttfst|dkr t}t|tr6t|}t|dd}|t ||ddS)z&Helper to append form urlencoded part.NT)doseqz!application/x-www-form-urlencoded)rr) r r r rrlistrprrr%)rxrrrr4r4r5 append_formKs   zMultipartWriter.append_formcCsxd}xX|jD]N\}}}|s(|s(|jdkr,dS|tdt|jd|jt|jd7}q W|dt|jd7}|S)zSize of the payload.rNr@)rrrrr_binary_headers)rxtotalr}rerr4r4r5r`s.zMultipartWriter.sizeT)rclose_boundaryr7csx|jD]\}}}|d|jdIdH||jIdH|sF|rt|}|r\|||rj||||IdH|IdHn||IdH|dIdHqW|r|d|jdIdHdS)z Write body.s--s Ns-- )rrrrMultipartPayloadWriterenable_compressionenable_encoding write_eof)rxrrr}rerwr4r4r5rts  zMultipartWriter.write)rN)N)N)N)T)(r1r2r3rrSr ryrr BaseExceptionrrr_Partrrrr9rrMcompiler r propertyrrrrr$rrrrrr r r rrrrr4r4)rr5r*s2   ! *r*c@s\eZdZeddddZeddddZdeddd d Zdd d d Ze ddddZ dS)rN)rr7cCs||_d|_d|_d|_dS)N)_writer _encoding _compress_encoding_buffer)rxrr4r4r5ryszMultipartPayloadWriter.__init__)rer7cCs*|dkr||_t|_n|dkr&d|_dS)Nrzquoted-printable)r%rr')rxrer4r4r5rs  z&MultipartPayloadWriter.enable_encodingrcCs,|dkrdtjntj }tj|d|_dS)Nrr)wbits)rr compressobjr&)rxre zlib_moder4r4r5rsz)MultipartPayloadWriter.enable_compression)r7cs\|jdk r.|j}|r.d|_||IdH|jdkrX|jrX|jt|jIdHdS)Nr)r&flushrr%r'r$r b64encode)rxrr4r4r5rs   z MultipartPayloadWriter.write_eof)rr7cs|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)Nrrzquoted-printable)r&compressr%r'rrdivmodrrr,r$rrb2a_qp)rxrbufdivmodZ enc_chunkZb64chunkr4r4r5rs$     $  zMultipartPayloadWriter.write)r) r1r2r3rryrSrrrrrr4r4r4r5rs  r)ri)HrrrrMrrXr collectionsrtypesrtypingrrrrrr r r r r rr urllib.parserrrZ multidictrrrhdrsrrrrrZhelpersrrrrhttpr rr!r"r#r$r%r&r'Zstreamsr(__all__Z client_reqrepr0RuntimeWarningr,r-rSr.r/rur+Z try_firstrr)r!r*rr4r4r4r5sH  8 $   "b-z;H