o
    4˜Žj±  ã                   @   s¬  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZmZmZmZ d dlmZ d dlmZmZmZmZmZ d dlmZmZmZ d dlmZmZ dd	lmZ dd
l m!Z!m"Z" ddl#m$Z$m%Z%m&Z&m'Z'm(Z( ddl)m*Z*m+Z+m,Z,m-Z-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z< ddl=m>Z> ej?dkr¸d dlm@Z@ neddd�Z@ej?dkrÊd dl
mAZA neeBeCddf ZAedeAd�ZDdZEerâddlFmGZG G dd„ deHƒZIG d d!„ d!eHƒZJd"eKdB d#eLeKdB eMeKeKf f fd$d%„ZN	&d7d'eeKeKf d(eKd#eKdB fd)d*„ZOG d+d,„ d,ƒZPG d-d„ dƒZQe<eQe8jRd.�G d/d0„ d0e9ƒƒZSG d1d2„ d2ƒZTeLe9eKeKf ZUG d3d4„ d4e9ƒZVG d5d6„ d6ƒZWdS )8é    N)Údeque)ÚAsyncIteratorÚIteratorÚMappingÚSequence)ÚTracebackType)ÚTYPE_CHECKINGÚAnyÚTypeVarÚUnionÚcast)Ú	parse_qslÚunquoteÚ	urlencode)ÚCIMultiDictÚCIMultiDictProxyé   )ÚAbstractStreamWriter)ÚZLibCompressorÚZLibDecompressor)ÚCONTENT_DISPOSITIONÚCONTENT_ENCODINGÚCONTENT_LENGTHÚCONTENT_TRANSFER_ENCODINGÚCONTENT_TYPE)ÚCHARÚDEFAULT_CHUNK_SIZEÚTOKENÚparse_mimetypeÚreify)ÚHeadersParser)ÚBadHttpMessage)Úinternal_logger)ÚJsonPayloadÚLookupErrorÚOrderÚPayloadÚStringPayloadÚget_payloadÚpayload_type)ÚStreamReader)é   é   )ÚSelfr-   ÚBodyPartReader)Úbound)r+   é   )ÚBufferzmemoryview[int]zmemoryview[bytes]Ú_Buffer)ÚMultipartReaderÚMultipartWriterr.   ÚBadContentDispositionHeaderÚBadContentDispositionParamÚparse_content_dispositionÚcontent_disposition_filename)ÚClientResponsec                   @   ó   e Zd ZdS )r5   N©Ú__name__Ú
__module__Ú__qualname__© r?   r?   úN/var/www/kodo/Anonymous/send/lib/python3.10/site-packages/aiohttp/multipart.pyr5   D   ó    r5   c                   @   r:   )r6   Nr;   r?   r?   r?   r@   r6   H   rA   r6   ÚheaderÚreturnc              	      sØ  dt dtfdd„‰ dt dtfdd„}dt dtf‡ fdd„}dt dtfd	d
„}dt dtfdd„}d ttjtƒ¡dœdt dt dt fdd„}| sJd i fS |  d¡^}}| ¡ }ˆ |ƒsdt	 
t| ƒ¡ d i fS i }|�rf| d¡}	|	sxt	 
t| ƒ¡ qfd|	vr‡t	 
t| ƒ¡ d i fS |	 dd¡\}
}|
 ¡  ¡ }
| ¡ }|
|v r¨t	 
t| ƒ¡ d i fS ˆ |
ƒs´t	 
t|	ƒ¡ qf||
ƒrÒ||ƒrÅ||dd… ƒ}n›ˆ |ƒsÑt	 
t|	ƒ¡ qfnŽ||
ƒ�r||ƒré| dd¡\}}}|pçd}nt	 
t|	ƒ¡ qfzt||dƒ}W nf tjtf�y   t	 
t|	ƒ¡ Y qfw d}| ¡ }||ƒ�r'd}||dd…  d¡ƒ}n+ˆ |ƒ�r/d}n#|�rR|› d|d › �}||ƒ�rR| d¡ ||dd…  d¡ƒ}d}|�r`t	 
t| ƒ¡ d i fS |||
< |si| ¡ |fS )NÚstringrC   c                 S   s   t | ƒo	tt| ƒkS ©N)Úboolr   Úset©rD   r?   r?   r@   Úis_tokenO   s   z+parse_content_disposition.<locals>.is_tokenc                 S   s,   t | ƒdko| d | d   kodkS   S )Né   r   éÿÿÿÿú")ÚlenrH   r?   r?   r@   Ú	is_quotedR   s   ,z,parse_content_disposition.<locals>.is_quotedc                    s   ˆ | ƒo
|   d¡dkS )Nú'rJ   )ÚcountrH   ©rI   r?   r@   Ú
is_rfc5987U   ó   z-parse_content_disposition.<locals>.is_rfc5987c                 S   s
   |   d¡S )NÚ*)ÚendswithrH   r?   r?   r@   Úis_extended_paramX   ó   
z4parse_content_disposition.<locals>.is_extended_paramc                 S   s@   |   d¡d }|sdS |  d¡r| |d… n| |d … }| ¡ S )NrT   r   FrK   )ÚfindrU   Úisdigit)rD   ÚposÚ	substringr?   r?   r@   Úis_continuous_param[   s
   "z6parse_content_disposition.<locals>.is_continuous_paramÚ )ÚcharsÚtextr^   c                S   s   t  d|› d�d| ¡S )Nz\\([z])z\1)ÚreÚsub)r_   r^   r?   r?   r@   Úunescapeb   rS   z+parse_content_disposition.<locals>.unescapeú;r   ú=r   rK   rO   rJ   úutf-8ÚstrictTFz\/)ÚstrrF   ÚjoinÚmapr`   Úescaper   ÚsplitÚstripÚwarningsÚwarnr5   ÚpopÚlowerÚlstripr6   r   Úbuiltinsr$   ÚUnicodeDecodeErrorÚrstrip)rB   rN   rR   rV   r\   rb   ÚdisptypeÚpartsÚparamsÚitemÚkeyÚvalueÚencodingÚ_ÚfailedÚ	rstrippedÚ_valuer?   rQ   r@   r7   L   sŠ   *
þ

û



¼Fr7   Úfilenamerw   Únamec           
   	      s  d| ‰ | sd S ˆ | v r| ˆ  S || v r| | S g }t ‡ fdd„|  ¡ D ƒƒ}t|ƒD ]%\}\}}| dd¡\}}| d¡rD|d d… }|t|ƒkrP| |¡ q+ |sUd S d |¡}d|v r€| dd	¡\}	}}|	pjd
}	zt||	dƒW S  t	j
tfy   Y d S w |S )Nz%s*c                 3   s&   � | ]\}}|  ˆ ¡r||fV  qd S rE   )Ú
startswith)Ú.0ry   rz   ©Úname_sufr?   r@   Ú	<genexpr>Å   s   € ÿ
ÿz/content_disposition_filename.<locals>.<genexpr>rT   r   rK   r]   rO   rJ   re   rf   )ÚsortedÚitemsÚ	enumeraterk   rU   rg   Úappendrh   r   rr   r$   rs   )
rw   r�   rv   ÚfnparamsÚnumry   rz   r|   Útailr{   r?   r„   r@   r8   ¹   s<   ÿ

ûr8   c                   @   sp   e Zd ZdZ						ddd	„Zdd
d„Zded fdd„Zdefdd„Z	ded dB fdd„Z
ddd„ZdS )ÚMultipartResponseWrapperzzWrapper around the MultipartReader.

    It takes care about
    underlying connection and close it when it needs in.
    Úrespr9   Ústreamr3   rC   Nc                 C   s   || _ || _d S rE   )r�   r�   )Úselfr�   r�   r?   r?   r@   Ú__init__è   s   
z!MultipartResponseWrapper.__init__c                 C   ó   | S rE   r?   ©r‘   r?   r?   r@   Ú	__aiter__ð   ó   z"MultipartResponseWrapper.__aiter__)r3   r.   c                 Ã   ó    �|   ¡ I d H }|d u rt‚|S rE   ©ÚnextÚStopAsyncIteration©r‘   Úpartr?   r?   r@   Ú	__anext__ó   ó
   €z"MultipartResponseWrapper.__anext__c                 C   s   | j j ¡ S )z2Returns True when all response data had been read.)r�   ÚcontentÚat_eofr”   r?   r?   r@   r    û   ó   zMultipartResponseWrapper.at_eofc                 Ã   s.   �| j  ¡ I dH }| j  ¡ r|  ¡ I dH  |S )z#Emits next multipart reader object.N)r�   r™   r    Úrelease©r‘   rx   r?   r?   r@   r™   ÿ   s
   €
zMultipartResponseWrapper.nextc                 Ã   s   �| j  ¡ I dH  dS )z_Release the connection gracefully.

        All remaining content is read to the void.
        N)r�   r¢   r”   r?   r?   r@   r¢     s   €z MultipartResponseWrapper.release)r�   r9   r�   r3   rC   N)rC   rŽ   ©rC   N)r<   r=   r>   Ú__doc__r’   r•   r   r�   rF   r    r™   r¢   r?   r?   r?   r@   rŽ   á   s$    þý
ü

þ

þ	rŽ   c                   @   sH  e Zd ZdZdZddeejedœde	ddd	e
d
ededB dededee ddfdd„Zdedefdd„Zde	fdd„Zde	dB fdd„Zddœdede	fdd„Zefdede	fdd „Zdede	fd!d"„Zdede	fd#d$„Zde	fd%d&„ZdId'd(„Zdd)œd*edB defd+d,„Zdd)œd*edB deeef dB fd-d.„Zdd)œd*edB dee eef  fd/d0„Z!defd1d2„Z"d3e#de#e	B fd4d5„Z$defd6d7„Z%d3e#de#e	B fd8d9„Z&d3e#de'e#e	B  fd:d;„Z(d3e#de#e	B fd<d=„Z)d3e#de'e#e	B  fd>d?„Z*d3e#de#e	B fd@dA„Z+dBedefdCdD„Z,e-dedB fdEdF„ƒZ.e-dedB fdGdH„ƒZ/dS )Jr.   z&Multipart reader for single body part.i    ÚmixedN)ÚsubtypeÚdefault_charsetÚmax_decompress_sizeÚclient_max_sizeÚmax_size_error_clsÚboundaryÚheadersúCIMultiDictProxy[str]rŸ   r§   r¨   r©   rª   r«   rC   c          
      C   sÀ   || _ || _t|ƒd | _|| _|| _d| _|dk| _| jr d n| j  t	d ¡}	|	d ur:|	 
¡ r3|	 ¡ s:td|	›�ƒ‚|	d urBt|	ƒnd | _d| _tƒ | _d | _d| _i | _|| _|| _|| _d S )NrJ   Fú	form-datazinvalid Content-Length: r   )r­   Ú	_boundaryrM   Ú_boundary_lenÚ_contentÚ_default_charsetÚ_at_eofÚ_is_form_dataÚgetr   ÚisasciirY   Ú
ValueErrorÚintÚ_lengthÚ_read_bytesr   Ú_unreadÚ_prev_chunkÚ_content_eofÚ_cacheÚ_max_decompress_sizeÚ_client_max_sizeÚ_max_size_error_cls)
r‘   r¬   r­   rŸ   r§   r¨   r©   rª   r«   Úlengthr?   r?   r@   r’     s&   

zBodyPartReader.__init__r‘   c                 C   r“   rE   r?   r”   r?   r?   r@   r•   9  r–   zBodyPartReader.__aiter__c                 Ã   r—   rE   r˜   r›   r?   r?   r@   r�   <  s
   €zBodyPartReader.__anext__c                 Ã   s   �|   ¡ I d H }|sd S |S rE   )Úreadr£   r?   r?   r@   r™   B  s
   €zBodyPartReader.nextF©ÚdecoderÆ   c                Ã   s    �| j rdS tƒ }| j s(| |  | j¡I dH ¡ t|ƒ| jkr%|  | j¡‚| j r|rNtƒ }|  |¡2 z3 dH W }| |¡ t|ƒ| jkrJ|  | j¡‚q26 |S |S )z»Reads body part data.

        decode: Decodes data following by encoding
                method from Content-Encoding header. If it missed
                data remains untouched
        ó    N)	r´   Ú	bytearrayÚextendÚ
read_chunkÚ
chunk_sizerM   rÁ   rÂ   Údecode_iter)r‘   rÆ   ÚdataÚdecoded_dataÚdr?   r?   r@   rÄ   H  s&   €ý
ÿþzBodyPartReader.readÚsizec                 Ã   sb  �| j rdS | jr|  |¡I dH }n|  |¡I dH }| j t¡}|rŒ| ¡ dkrŒd | 	¡ ¡}t
|ƒd }|dkrŒ|  ¡ sŒd| }d}| jrW| jd|… }| jt
|ƒd… | _t
|ƒ|krl|| j dt
|ƒ ¡I dH 7 }|sqd| _ |d | 	¡ ¡7 }||7 }t
|ƒd }|dkrŒ|  ¡ r=|  jt
|ƒ7  _| j| jkržd| _ | j r¯| j ¡ I dH dkr¯tdƒ‚|S )	zWReads body part content chunk of the specified size.

        size: chunk size
        rÇ   NÚbase64é   r   Tó   
z3Reader did not read all the data or it is malformed)r´   rº   Ú_read_chunk_from_lengthÚ_read_chunk_from_streamr­   r¶   r   rp   rh   rk   rM   r    r½   r²   rÄ   r»   Úreadliner¸   )r‘   rÐ   Úchunkr{   Ústripped_chunkÚ	remainderÚover_chunk_sizeÚ
over_chunkr?   r?   r@   rÊ   _  s<   €ðzBodyPartReader.read_chunkc                 Ã   sL   �| j d us
J dƒ‚t|| j | j ƒ}| j |¡I d H }| j ¡ r$d| _|S )Nz(Content-Length required for chunked readT)rº   Úminr»   r²   rÄ   r    r´   )r‘   rÐ   rË   r×   r?   r?   r@   rÔ   ‹  s   €
z&BodyPartReader._read_chunk_from_lengthc                 Ã   s¾  �|| j ks
J dƒ‚| jd u }|rd| j |¡I d H  | _d}t|ƒ| j k rQ|| j |¡I d H 7 }|  jt| j ¡ ƒ7  _| jdkrFtdƒ‚| jrJnt|ƒ| j k s&t|ƒ|krg| j 	||d … ¡ |d |… }| jd usnJ ‚| j| }d| j
 }|r€| |¡}n| |tdt| jƒt|ƒ ƒ¡}|dkrÏt ¡ � tjdtd� | j 	||d … ¡ W d   ƒ n1 s´w   Y  | jd |… | _|t| jƒ|… }|sÏd	| _| j|rÕdndd … }|| _|S )
Nz<Chunk size must be greater or equal than boundary length + 2rÓ   rÇ   rJ   zReading after EOFr   Úignore)ÚcategoryT)r±   r½   r²   rÄ   rM   r¾   r¹   r    r¸   Úunread_datar°   rX   Úmaxrm   Úcatch_warningsÚfilterwarningsÚDeprecationWarningr´   )r‘   rÐ   Úfirst_chunkr×   Úwindowra   ÚidxÚresultr?   r?   r@   rÕ   •  sJ   €ÿ

ú

 
þz&BodyPartReader._read_chunk_from_streamc                 Ã   s¶   �| j rdS | jr| j ¡ }n| j ¡ I dH }| | j¡r?| d¡}| j}| jd }||ks2||kr=d| _ | j |¡ dS |S | j ¡ I dH }| | j¡rS|dd… }| j |¡ |S )z Reads body part by line by line.rÇ   NrÓ   ó   --Téþÿÿÿ)	r´   r¼   Úpopleftr²   rÖ   r‚   r°   rt   rŠ   )r‘   ÚlineÚsliner¬   Úlast_boundaryÚ	next_liner?   r?   r@   rÖ   Â  s(   €

ûzBodyPartReader.readlinec                 Ã   s2   �| j rdS | j s|  | j¡I dH  | j r	dS dS )z0Like read(), but reads all the data to the void.N)r´   rÊ   rË   r”   r?   r?   r@   r¢   ß  s   €ÿzBodyPartReader.release)r{   r{   c                Ã   s.   �| j dd�I dH }|p| jdd�}| |¡S )z;Like read(), but assumes that body part contains text data.TrÅ   Nre   ©Údefault)rÄ   Úget_charsetrÆ   ©r‘   r{   rÍ   r?   r?   r@   r_   æ  s   €
zBodyPartReader.textc                Ã   sJ   �| j dd�I dH }|sdS |p| jdd�}ttttf t | |¡¡ƒS )z<Like read(), but assumes that body parts contains JSON data.TrÅ   Nre   rï   )	rÄ   rñ   r   Údictrg   r	   ÚjsonÚloadsrÆ   rò   r?   r?   r@   rô   î  s   €zBodyPartReader.jsonc                Ã   sr   �| j dd�I dH }|sg S |dur|}n| jdd�}z	| ¡  |¡}W n ty1   td| ƒ‚w t|d|d�S )zFLike read(), but assumes that body parts contain form urlencoded data.TrÅ   Nre   rï   z'data cannot be decoded with %s encoding)Úkeep_blank_valuesr{   )rÄ   rñ   rt   rÆ   rs   r¸   r   )r‘   r{   rÍ   Úreal_encodingrÎ   r?   r?   r@   Úformö  s"   €ÿýzBodyPartReader.formc                 C   ó   | j S )z<Returns True if the boundary was reached or False otherwise.©r´   r”   r?   r?   r@   r    
  ó   zBodyPartReader.at_eofrÍ   c                 C   s   t | jv r
|  |¡S |S )z>Apply Content-Transfer-Encoding decoding if header is present.)r   r­   Ú_decode_content_transfer)r‘   rÍ   r?   r?   r@   Ú _apply_content_transfer_decoding  s   

z/BodyPartReader._apply_content_transfer_decodingc                 C   s   | j  ot| jv S )z5Check if Content-Encoding decoding should be applied.)rµ   r   r­   r”   r?   r?   r@   Ú_needs_content_decoding  s   z&BodyPartReader._needs_content_decodingc                 C   s    |   |¡}|  ¡ r|  |¡S |S )a  Decodes data synchronously.

        Decodes data according the specified Content-Encoding
        or Content-Transfer-Encoding headers value.

        Note: For large payloads, consider using decode_iter() instead
        to avoid blocking the event loop during decompression.
        )rý   rþ   Ú_decode_content)r‘   rÍ   Údecodedr?   r?   r@   rÆ     s   
	
zBodyPartReader.decodec                 C  sB   �|   |¡}|  ¡ r|  |¡2 z	3 dH W }|V  q6 dS |V  dS )a$  Async generator that yields decoded data chunks.

        Decodes data according the specified Content-Encoding
        or Content-Transfer-Encoding headers value.

        This method offloads decompression to an executor for large payloads
        to avoid blocking the event loop.
        N)rý   rþ   Ú_decode_content_async)r‘   rÍ   r   rÏ   r?   r?   r@   rÌ   '  s   €
	ÿ
zBodyPartReader.decode_iterc                 C   sL   | j  td¡ ¡ }|dkr|S |dv rt|dd�j|| jd�S td|› �ƒ‚)Nr]   Úidentity>   ÚgzipÚdeflateT©r{   Úsuppress_deflate_header©Ú
max_lengthúunknown content encoding: )r­   r¶   r   rp   r   Údecompress_syncrÀ   ÚRuntimeError©r‘   rÍ   r{   r?   r?   r@   rÿ   7  s   þýzBodyPartReader._decode_contentc                 C  sŒ   �| j  td¡ ¡ }|dkr|V  d S |dv r?t|dd�}|j|| jd�I d H V  |jr=|jd| jd�I d H V  |js,d S d S td|› �ƒ‚)	Nr]   r  >   r  r  Tr  r  rÇ   r	  )	r­   r¶   r   rp   r   Ú
decompressrÀ   Údata_availabler  )r‘   rÍ   r{   rÏ   r?   r?   r@   r  C  s   €
þÿz$BodyPartReader._decode_content_asyncc                 C   sP   | j  td¡ ¡ }|dkrt |¡S |dkrt |¡S |dv r!|S td|› �ƒ‚)Nr]   rÑ   úquoted-printable)ÚbinaryÚ8bitÚ7bitú#unknown content transfer encoding: )	r­   r¶   r   rp   rÑ   Ú	b64decodeÚbinasciiÚa2b_qpr  r  r?   r?   r@   rü   T  s   

z'BodyPartReader._decode_content_transferrð   c                 C   s*   | j  td¡}t|ƒ}|j d| jp|¡S )z>Returns charset parameter from Content-Type header or default.r]   Úcharset)r­   r¶   r   r   Ú
parametersr³   )r‘   rð   ÚctypeÚmimetyper?   r?   r@   rñ   `  s   zBodyPartReader.get_charsetc                 C   ó   t | j t¡ƒ\}}t|dƒS )z|Returns name specified in Content-Disposition header.

        If the header is missing or malformed, returns None.
        r�   ©r7   r­   r¶   r   r8   ©r‘   r|   rw   r?   r?   r@   r�   f  ó   
zBodyPartReader.namec                 C   r  )zReturns filename specified in Content-Disposition header.

        Returns None if the header is missing or malformed.
        r€   r  r  r?   r?   r@   r€   o  r  zBodyPartReader.filenamer¤   )0r<   r=   r>   r¥   rË   r   ÚsysÚmaxsizer¸   Úbytesr*   rg   r¹   ÚtypeÚ	Exceptionr’   r-   r•   r�   r™   rF   rÄ   rÊ   rÔ   rÕ   rÖ   r¢   r_   ró   r	   rô   ÚlistÚtuplerø   r    r2   rý   rþ   rÆ   r   rÌ   rÿ   r  rü   rñ   r   r�   r€   r?   r?   r?   r@   r.     sp    öþýüúùø	÷
ö
õ$,
-
((ÿ

þ)Úorderc                       sz   e Zd ZU eed< dedededdf‡ fdd„Zddededefdd„Zddedede	fdd„Z
deddfdd„Z‡  ZS )ÚBodyPartReaderPayloadr   rz   ÚargsÚkwargsrC   Nc                    sb   t ƒ j|g|¢R i |¤Ž i }|jd ur|j|d< |jd ur#|j|d< |r/| jdi |¤Ž d S d S )Nr�   r€   Ú
attachmentT)r*  T)Úsuperr’   r�   r€   Úset_content_disposition)r‘   rz   r(  r)  rw   ©Ú	__class__r?   r@   r’   ~  s   



ÿzBodyPartReaderPayload.__init__re   rf   r{   Úerrorsc                 C   s   t dƒ‚)NzUnable to decode.©Ú	TypeError©r‘   r{   r/  r?   r?   r@   rÆ   Š  s   zBodyPartReaderPayload.decodec                 Ã   s
   �t dƒ‚)aR  Raises TypeError as body parts should be consumed via write().

        This is intentional: BodyPartReader payloads are designed for streaming
        large data (potentially gigabytes) and must be consumed only once via
        the write() method to avoid memory exhaustion. They cannot be buffered
        in memory for reuse.
        z:Unable to read body part as bytes. Use write() to consume.r0  r2  r?   r?   r@   Úas_bytes�  s   €zBodyPartReaderPayload.as_bytesÚwriterc                 Ã   sf   �| j }|jtd�I d H  }r1| |¡2 z3 d H W }| |¡I d H  q6 |jtd�I d H  }sd S d S )N)rÐ   )r   rÊ   r   rÌ   Úwrite)r‘   r4  Úfieldr×   rÏ   r?   r?   r@   r5  —  s   €ÿÿzBodyPartReaderPayload.write©re   rf   )r<   r=   r>   r.   Ú__annotations__r	   r’   rg   rÆ   r!  r3  r   r5  Ú__classcell__r?   r?   r-  r@   r'  y  s   
 
r'  c                   @   sV  e Zd ZU dZeZdZed  dB ed< e	Z
ejddedœdeeef ded	ed
ededee ddfdd„Zdedefdd„Zded e	f dB fdd„Zedddefdd„ƒZdefdd„Zded e	f dB fdd„Zd0dd„Zded e	f fdd „Zdd!ded e	f fd"d#„Zdefd$d%„Z de!fd&d'„Z"d0d(d)„Z#d0d*d+„Z$d1d,d-„Z%d0d.d/„Z&dS )2r3   zMultipart body reader.NÚmultipart_reader_clsiþ  é€   ©rª   Úmax_field_sizeÚmax_headersr«   r­   rŸ   rª   r=  r>  r«   rC   c                C   s–   t |t ƒ| _| jjdksJ dƒ‚d| jjvrtd|t  ƒ‚|| _d|  ¡   ¡ | _	|| _
|| _d | _d | _|| _|| _|| _d| _d| _g | _d S )NÚ	multipartz!multipart/* content type expectedr¬   z$boundary missed for Content-Type: %sú--FT)r   r   Ú	_mimetyper"  r  r¸   r­   Ú_get_boundaryÚencoder°   rÁ   r²   r³   Ú
_last_partÚ_max_field_sizeÚ_max_headersrÂ   r´   Ú_at_bofr¼   )r‘   r­   rŸ   rª   r=  r>  r«   r?   r?   r@   r’   ©  s$   

ÿ
zMultipartReader.__init__r‘   c                 C   r“   rE   r?   r”   r?   r?   r@   r•   Ç  r–   zMultipartReader.__aiter__c                 Ã   r—   rE   r˜   r›   r?   r?   r@   r�   Ê  rž   zMultipartReader.__anext__Úresponser9   c                 C   s   |   || |j|jƒ¡}|S )z‚Constructs reader instance from HTTP response.

        :param response: :class:`~aiohttp.client.ClientResponse` instance
        )Úresponse_wrapper_clsr­   rŸ   )ÚclsrH  Úobjr?   r?   r@   Úfrom_responseÒ  s   	ÿzMultipartReader.from_responsec                 C   rù   )z@Returns True if the final boundary was reached, false otherwise.rú   r”   r?   r?   r@   r    à  rû   zMultipartReader.at_eofc                 Ã   sê   �| j rdS |  ¡ I dH  | jr|  ¡ I dH  d| _n|  ¡ I dH  | j r'dS |  ¡ I dH }| jdu ro| jjdkrot	|t
ƒrot|j t¡ƒ\}}| d¡dkro| d¡I dH }t|ƒdkratdƒ‚| ¡  ¡ | _|  ¡ I dH }|| _| jS )	z#Emits the next multipart body part.NFr¯   r�   Ú	_charset_é    é   zInvalid default charset)r´   Ú_maybe_release_last_partrG  Ú_read_until_first_boundaryÚ_read_boundaryÚfetch_next_partrD  rA  r§   Ú
isinstancer.   r7   r­   r¶   r   rÊ   rM   r  rl   rÆ   r³   )r‘   rœ   r|   rw   r  r?   r?   r@   r™   ä  s0   €
ÿzMultipartReader.nextc                 Ã   s>   �| j s|  ¡ I dH }|du rdS | ¡ I dH  | j rdS dS )z=Reads all the body parts to the void till the final boundary.N)r´   r™   r¢   r£   r?   r?   r@   r¢     s   €üzMultipartReader.releasec                 Ã   s   �|   ¡ I dH }|  |¡S )z"Returns the next body part reader.N)Ú_read_headersÚ_get_part_reader)r‘   r­   r?   r?   r@   rS    s   €
zMultipartReader.fetch_next_partr®   c              	   C   s�   |  td¡}t|ƒ}|jdkr5| jdu r%t| ƒ|| j| j| j| j| j	d�S | j|| j| j| j| j| j	d�S | j
| j|| j| jj| j| j| j	d�S )zšDispatches the response by the `Content-Type` header.

        Returns a suitable reader instance.

        :param dict headers: Response headers
        r]   r?  Nr<  )r§   r¨   rª   r«   )r¶   r   r   r"  r:  r²   rÁ   rE  rF  rÂ   Úpart_reader_clsr°   rA  r§   r³   )r‘   r­   r  r  r?   r?   r@   rV    s:   


úú	ùz MultipartReader._get_part_readerc                 C   s(   | j jd }t|ƒdkrtd| ƒ‚|S )Nr¬   éF   z&boundary %r is too long (70 chars max))rA  r  rM   r¸   )r‘   r¬   r?   r?   r@   rB  @  s   zMultipartReader._get_boundaryc                 Ã   s"   �| j r	| j  ¡ S | j ¡ I d H S rE   )r¼   ro   r²   rÖ   r”   r?   r?   r@   Ú	_readlineG  s   €
zMultipartReader._readlinec                 Ã   sX   �	 |   ¡ I d H }|dkrtd| j ƒ‚| ¡ }|| jkrd S || jd kr+d| _d S q)NTrÇ   z#Could not find starting boundary %rrè   )rY  r¸   r°   rt   r´   ©r‘   r×   r?   r?   r@   rQ  L  s   €ÿ
õz*MultipartReader._read_until_first_boundaryc                 Ã   sœ   �|   ¡ I d H  ¡ }|| jkrd S || jd krCd| _|   ¡ I d H }|   ¡ I d H }|d d… dkr9| j |¡ d S | j ||g¡ d S td|›d| j›�ƒ‚)Nrè   TrJ   zInvalid boundary z, expected )rY  rt   r°   r´   r¼   rŠ   rÉ   r¸   )r‘   r×   Úepiloguerî   r?   r?   r@   rR  Z  s   €
zMultipartReader._read_boundaryc                 Ã   sn   �g }	 | j j| jd�I d H }| d¡}| |¡ |snt|ƒ| jkr'tdƒ‚qt| jd�}| 	|¡\}}|S )NT)Úmax_line_lengthrÓ   zToo many headers received)r=  )
r²   rÖ   rE  rt   rŠ   rM   rF  r!   r    Úparse_headers)r‘   Úlinesr×   Úparserr­   Úraw_headersr?   r?   r@   rU  q  s   €

ùzMultipartReader._read_headersc                 Ã   sD   �| j dur | j  ¡ s| j  ¡ I dH  | j | j j¡ d| _ dS dS )z8Ensures that the last read body part is read completely.N)rD  r    r¢   r¼   rÉ   r”   r?   r?   r@   rP    s   €


üz(MultipartReader._maybe_release_last_partr¤   )rC   r®   )'r<   r=   r>   r¥   rŽ   rI  r:  r"  r8  r.   rW  r  r   r¸   r   rg   r*   r¹   r#  r’   r-   r•   r   r�   ÚclassmethodrL  rF   r    r™   r¢   rS  rV  rB  r!  rY  rQ  rR  rU  rP  r?   r?   r?   r@   r3   ž  sj   
 ø
þýûúùø	
÷
þþý
þ
#

þþ

ý*


r3   c                       sà  e Zd ZU dZded< dZd9dededB ddf‡ fd	d
„Zd:dd„Zde	e
 dB de
dB dedB ddfdd„Zdee fdd„Zdefdd„Zdefdd„Ze d¡Ze d¡Zedefdd„ƒZedefdd„ƒZd;dedeeef dB defd d!„Zd"edefd#d$„Z	d;dedeeef dB defd%d&„Z 	d;de!e"eef  eeef B deeef dB defd'd(„Z#ededB fd)d*„ƒZ$d<d-ed.edefd/d0„Z%d<d-ed.ede&fd1d2„Z'	d=d3e(d4eddfd5d6„Z)d>d7d8„Z*‡  Z+S )?r4   zMultipart body writer.Nr   Tr¦   r§   r¬   rC   c                    sv   |d ur|nt  ¡ j}z| d¡| _W n ty   tdƒd ‚w d|› d| j› �}tƒ j	d |d� g | _
|dk| _d S )NÚasciiz(boundary should contain ASCII only charsz
multipart/z; boundary=)Úcontent_typer¯   )ÚuuidÚuuid4ÚhexrC  r°   ÚUnicodeEncodeErrorr¸   Ú_boundary_valuer+  r’   Ú_partsrµ   )r‘   r§   r¬   r  r-  r?   r@   r’   ’  s   
ÿzMultipartWriter.__init__c                 C   r“   rE   r?   r”   r?   r?   r@   Ú	__enter__¤  r–   zMultipartWriter.__enter__Úexc_typeÚexc_valÚexc_tbc                 C   s   d S rE   r?   )r‘   rk  rl  rm  r?   r?   r@   Ú__exit__§  s   zMultipartWriter.__exit__c                 C   ó
   t | jƒS rE   )Úiterri  r”   r?   r?   r@   Ú__iter__¯  rW   zMultipartWriter.__iter__c                 C   ro  rE   )rM   ri  r”   r?   r?   r@   Ú__len__²  rW   zMultipartWriter.__len__c                 C   s   dS )NTr?   r”   r?   r?   r@   Ú__bool__µ  r–   zMultipartWriter.__bool__s   \A[!#$%&'*+\-.^_`|~\w]+\Zs   [\x00-\x08\x0A-\x1F\x7F]c                 C   s^   | j }t | j|¡r| d¡S t | j|¡rtdƒ‚| dd¡}| dd¡}d| d¡ d S )zzWrap boundary parameter value in quotes, if necessary.

        Reads self.boundary and returns a unicode string.
        rb  z*boundary value contains invalid charactersó   \s   \\ó   "s   \"rL   )	r°   r`   ÚmatchÚ_valid_tchar_regexrÆ   ÚsearchÚ_invalid_qdtext_char_regexr¸   Úreplace)r‘   rz   Úquoted_value_contentr?   r?   r@   rh  »  s   
zMultipartWriter._boundary_valuec                 C   s   | j  d¡S )Nrb  )r°   rÆ   r”   r?   r?   r@   r¬   Û  r¡   zMultipartWriter.boundaryrK  r­   c                 C   sd   |d u rt ƒ }t|tƒr|j |¡ |  |¡S zt||d�}W n ty,   td| ƒ‚w |  |¡S )N©r­   zCannot create payload from %r)	r   rT  r&   r­   ÚupdateÚappend_payloadr(   r$   r1  )r‘   rK  r­   Úpayloadr?   r?   r@   rŠ   ß  s   

ÿ
zMultipartWriter.appendr  c                 C   sö   d}d}| j r(ttth|j ¡ @ rJ ‚t|jvr'dt| jƒ› �}|j	d|d� nH|j 
td¡ ¡ }|r>|dvr>td|› �ƒ‚|dkrDd}|j 
td¡ ¡ }|d	vrXtd
|› �ƒ‚|dkr^d}|j}|durp|sp|spt|ƒ|jt< | j |||f¡ |S )z)Adds a new body part to multipart writer.Nzsection-r¯   )r�   r]   )r  r  r  r	  r  )r]   rÑ   r  r  r  r  )rµ   r   r   r   r­   Úkeysr   rM   ri  r,  r¶   rp   r  rÐ   rg   rŠ   )r‘   r  r{   Úte_encodingr�   rÐ   r?   r?   r@   r~  î  s4   ÿÿ
€zMultipartWriter.append_payloadc                 C   s    |du rt ƒ }|  t||d�¡S )zHelper to append JSON part.Nr|  )r   r~  r#   )r‘   rK  r­   r?   r?   r@   Úappend_json  s   zMultipartWriter.append_jsonc                 C   sV   t |ttfƒs	J ‚|du rtƒ }t |tƒrt| ¡ ƒ}t|dd�}|  t||dd�¡S )z&Helper to append form urlencoded part.NT)Údoseqz!application/x-www-form-urlencoded)r­   rc  )	rT  r   r   r   r$  rˆ   r   r~  r'   )r‘   rK  r­   rÍ   r?   r?   r@   Úappend_form  s   
ÿÿzMultipartWriter.append_formc                 C   sx   d}| j D ])\}}}|j}|s|s|du r dS |tdt| jƒ d | t|jƒ d ƒ7 }q|dt| jƒ d 7 }|S )zSize of the payload.r   NrJ   rÒ   )ri  rÐ   r¹   rM   r°   Ú_binary_headers)r‘   Útotalrœ   r{   r�  Ú	part_sizer?   r?   r@   rÐ   2  s(   ÿþýüûÿ	zMultipartWriter.sizere   rf   r{   r/  c                    s   d  ‡ ‡‡fdd„ˆjD ƒ¡S )zâReturn string representation of the multipart data.

        WARNING: This method may do blocking I/O if parts contain file payloads.
        It should not be called in the event loop. Use as_bytes().decode() instead.
        r]   c                 3   s:   � | ]\}}}d ˆj  d |j ˆ ˆ¡ | ¡  V  qdS )r@  z
N)r¬   r…  rÆ   )rƒ   rœ   Ú_eÚ_te©r{   r/  r‘   r?   r@   r†   M  s   € ûÿþýü
ÿz)MultipartWriter.decode.<locals>.<genexpr>)rh   ri  r2  r?   rŠ  r@   rÆ   G  s   úzMultipartWriter.decodec                 Ã   s|   �g }| j D ](\}}}| d| j d ¡ | |j¡ | ||¡I dH }| |¡ | d¡ q| d| j d ¡ d |¡S )z‰Return bytes representation of the multipart data.

        This method is async-safe and calls as_bytes on underlying payloads.
        rè   rÓ   Nó   --
rÇ   )ri  rŠ   r°   r…  r3  rh   )r‘   r{   r/  rv   rœ   rˆ  r‰  Ú
part_bytesr?   r?   r@   r3  V  s   €

zMultipartWriter.as_bytesr4  Úclose_boundaryc                 Ã   sø   �| j D ]d\}}}| jrt|jv sJ ‚d|jt v sJ ‚| d| j d ¡I dH  | |j¡I dH  |s6|rXt|ƒ}|rA| |¡ |rH| 	|¡ | |¡I dH  | 
¡ I dH  n| |¡I dH  | d¡I dH  q|rz| d| j d ¡I dH  dS dS )zWrite body.zname=rè   rÓ   Nr‹  )ri  rµ   r   r­   r5  r°   r…  ÚMultipartPayloadWriterÚenable_compressionÚenable_encodingÚ	write_eof)r‘   r4  r�  rœ   r{   r�  Úwr?   r?   r@   r5  q  s(   €

ÿzMultipartWriter.writec                 Ã   s†   �| j rdS d| _ t| jƒD ]2\}\}}}|js@|js@z	| ¡ I dH  W q ty? } ztjd||dd� W Y d}~qd}~ww qdS )a  
        Close all part payloads that need explicit closing.

        IMPORTANT: This method must not await anything that might not finish
        immediately, as it may be called during cleanup/cancellation. Schedule
        any long-running operations without awaiting them.
        NTz%Failed to close multipart part %d: %s)Úexc_info)	Ú	_consumedr‰   ri  Ú	autocloseÚconsumedÚcloser#  r"   Úerror)r‘   ræ   rœ   r|   Úexcr?   r?   r@   r—  Ž  s    €ÿ€ÿ€üzMultipartWriter.close)r¦   N)rC   r4   rE   r7  )Tr¤   ),r<   r=   r>   r¥   r8  Ú
_autocloserg   r’   rj  r"  ÚBaseExceptionr   rn  r   Ú_Partrq  r¹   rr  rF   rs  r`   Úcompilerw  ry  Úpropertyrh  r¬   r	   r   r&   rŠ   r~  r‚  r   r%  r„  rÐ   rÆ   r!  r3  r   r5  r—  r9  r?   r?   r-  r@   r4   ‹  sn   
  

þýü
û

$'ÿÿÿ
þýþý
üÿÿÿ
þr4   c                   @   sj   e Zd Zdeddfdd„Zdeddfdd„Z	dded
edB ddfdd„Zddd„Z	de
ddfdd„ZdS )rŽ  r4  rC   Nc                 C   s   || _ d | _d | _d | _d S rE   )Ú_writerÚ	_encodingÚ	_compressÚ_encoding_buffer)r‘   r4  r?   r?   r@   r’   ©  s   
zMultipartPayloadWriter.__init__r{   c                 C   s0   |dkr|| _ tƒ | _d S |dkrd| _ d S d S )NrÑ   r  )r   rÈ   r¢  )r‘   r{   r?   r?   r@   r�  ¯  s   
ÿz&MultipartPayloadWriter.enable_encodingr  Ústrategyc                 C   s   t |d|d�| _d S )NT)r{   r  r£  )r   r¡  )r‘   r{   r£  r?   r?   r@   r�  ¶  s
   ýz)MultipartPayloadWriter.enable_compressionc                 Ã   sf   �| j d ur| j  ¡ }|rd | _ |  |¡I d H  | jdkr/| jr1| j t | j¡¡I d H  d S d S d S )NrÑ   )r¡  Úflushr5  r   r¢  rŸ  rÑ   Ú	b64encoderZ  r?   r?   r@   r‘  ¿  s   €


þz MultipartPayloadWriter.write_eofr×   c                 Ã   sò   �| j d ur|r| j  |¡I d H }|sd S | jdkr[| j}|d us#J ‚| |¡ |rWtt|ƒdƒ\}}|d |d … ||d d … }| _|rYt |¡}| j	 
|¡I d H  d S d S d S | jdkrn| j	 
t |¡¡I d H  d S | j	 
|¡I d H  d S )NrÑ   r+   r  )r¡  Úcompressr   r¢  rÉ   ÚdivmodrM   rÑ   r¥  rŸ  r5  r  Úb2a_qp)r‘   r×   ÚbufÚdivÚmodÚ	enc_chunkÚb64chunkr?   r?   r@   r5  Ê  s*   €


$
û
zMultipartPayloadWriter.write)r  Nr¤   )r<   r=   r>   r   r’   rg   r�  r¹   r�  r‘  r!  r5  r?   r?   r?   r@   rŽ  ¨  s    ÿÿÿ
þ
	rŽ  )r€   )XrÑ   r  rr   rô   r`   r  rd  rm   Úcollectionsr   Úcollections.abcr   r   r   r   Útypesr   Útypingr   r	   r
   r   r   Úurllib.parser   r   r   Ú	multidictr   r   Úabcr   Úcompression_utilsr   r   Úhdrsr   r   r   r   r   Úhelpersr   r   r   r   r   Úhttpr    Úhttp_exceptionsr!   Úlogr"   r  r#   r$   r%   r&   r'   r(   r)   Ústreamsr*   Úversion_infor-   r1   r!  rÈ   r2   Ú__all__Úclient_reqrepr9   ÚRuntimeWarningr5   r6   rg   r%  ró   r7   r8   rŽ   r.   Ú	try_firstr'  r3   rœ  r4   rŽ  r?   r?   r?   r@   Ú<module>   sz    $	

ÿ
þnÿ
ÿÿ
þ(/  k$ k  