o
    Fhݛ                     @   sp  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 d dlmZ d dlmZmZmZmZmZmZ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"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. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: ddl;m<Z< ej=dkrd dlm>Z> nd dlm?Z? e?dddZ>dZ@erddlAmBZB G dd deCZDG dd deCZEdeeF deeeF eeFeFf f fddZG	 d1d!e
eFeFf d"eFdeeF fd#d$ZHG d%d& d&ZIG d'd dZJe:eJe6jKd(G d)d* d*e7ZLG d+d, d,ZMee7eFeFf ZNG d-d. d.e7ZOG d/d0 d0ZPdS )2    N)deque)MappingSequence)TracebackType)TYPE_CHECKINGAnyDequeDictIteratorListOptionalTupleTypeUnioncast)	parse_qslunquote	urlencode)CIMultiDictCIMultiDictProxy   )ZLibCompressorZLibDecompressor)CONTENT_DISPOSITIONCONTENT_ENCODINGCONTENT_LENGTHCONTENT_TRANSFER_ENCODINGCONTENT_TYPE)CHARTOKENparse_mimetypereify)HeadersParser)internal_logger)JsonPayloadLookupErrorOrderPayloadStringPayloadget_payloadpayload_type)StreamReader)      )Self)TypeVarr.   BodyPartReader)bound)MultipartReaderMultipartWriterr0   BadContentDispositionHeaderBadContentDispositionParamparse_content_dispositioncontent_disposition_filename)ClientResponsec                   @      e Zd ZdS )r4   N__name__
__module____qualname__ r>   r>   D/var/www/html/venv/lib/python3.10/site-packages/aiohttp/multipart.pyr4   H       r4   c                   @   r9   )r5   Nr:   r>   r>   r>   r?   r5   L   r@   r5   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^}} |s`t	t
|  d i fS i }|rO|d}	d|	vryt	t
|  d i fS |	dd\}
}|
  }
| }|
|v rt	t
|  d i fS  |
st	t|	 qb||
r||r||dd }n |st	t|	 qbn||
r||r|dd\}}}|pd}nt	t|	 qbzt||d}W n^ ty   t	t|	 Y qbw d}||rd}||dd d}n+ |rd}n#|r;| d|d  }||r;|d ||dd d}d}|rIt	t
|  d i fS |||
< |se| |fS )NstringrB   c                 S   s   t | o	tt| kS N)boolr   setrC   r>   r>   r?   is_tokenS   s   z+parse_content_disposition.<locals>.is_tokenc                 S   s    | d | d   kodkS   S )Nr   "r>   rG   r>   r>   r?   	is_quotedV   s    z,parse_content_disposition.<locals>.is_quotedc                    s    | o
|  ddkS )N'   )countrG   rH   r>   r?   
is_rfc5987Y      z-parse_content_disposition.<locals>.is_rfc5987c                 S   s
   |  dS )N*)endswithrG   r>   r>   r?   is_extended_param\      
z4parse_content_disposition.<locals>.is_extended_paramc                 S   s@   |  dd }|sdS | dr| |d n| |d  }| S )NrR   r   FrI   )findrS   isdigit)rC   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?   unescapef   rQ   z+parse_content_disposition.<locals>.unescape;r   =r   rI   rL   rM   utf-8strictTFz\/)strrE   joinmapr^   escaper   splitwarningswarnr4   poplowerstriplstripr5   r   UnicodeDecodeError)rA   rK   rP   rT   rZ   r`   disptypepartsparamsitemkeyvalueencoding_failed_valuer>   rO   r?   r6   P   s   *





>r6   filenamers   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 rq|dd	\}	}}|	pjd
}	t||	dS |S )Nz%s*c                 3   s&    | ]\}}|  r||fV  qd S rD   )
startswith).0ru   rv   name_sufr>   r?   	<genexpr>   s    
z/content_disposition_filename.<locals>.<genexpr>rR   r   rI   r[   rL   rM   rc   rd   )	sorteditems	enumerateri   rS   re   appendrf   r   )
rs   r|   rr   fnparamsnumru   rv   rx   tailrw   r>   r   r?   r7      s4   

r7   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
ed  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.
    respr8   streamr2   rB   Nc                 C   s   || _ || _d S rD   )r   r   )selfr   r   r>   r>   r?   __init__   s   
z!MultipartResponseWrapper.__init__c                 C      | S rD   r>   r   r>   r>   r?   	__aiter__      z"MultipartResponseWrapper.__aiter__)r2   r0   c                        |   I d H }|d u rt|S rD   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   rt   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   r8   r   r2   rB   N)rB   r   rB   N)r;   r<   r=   __doc__r   r   r   r   rE   r   r   r   r   r>   r>   r>   r?   r      s$    




	r   c                   @   s  e Zd ZdZdZddddedd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e 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d>d$d%Zdd&d'ee defd(d)Zdd&d'ee deeeef  fd*d+Zdd&d'ee deeeef  fd,d-Zdefd.d/Zd0edefd1d2Zd0edefd3d4Zd0edefd5d6Z d7edefd8d9Z!e"dee fd:d;Z#e"dee fd<d=Z$dS )?r0   z&Multipart reader for single body part.i    mixedNsubtypedefault_charsetboundaryheadersCIMultiDictProxy[str]r   r   r   rB   c                C   s   || _ || _t|d | _|| _|| _d| _|dk| _| jr d n| j t	d }|d ur/t
|nd | _d| _t | _d | _d| _i | _d S )NrM   F	form-datar   )r   	_boundarylen_boundary_len_content_default_charset_at_eof_is_form_datagetr   int_length_read_bytesr   _unread_prev_chunk_content_eof_cache)r   r   r   r   r   r   lengthr>   r>   r?   r     s   	

zBodyPartReader.__init__r   c                 C   r   rD   r>   r   r>   r>   r?   r   !  r   zBodyPartReader.__aiter__c                    r   rD   r   r   r>   r>   r?   r   $  s
   zBodyPartReader.__anext__c                    s   |   I d H }|sd S |S rD   )readr   r>   r>   r?   r   *  s
   zBodyPartReader.nextFdecoder   c                   sH   | j rdS t }| j s|| | jI dH  | j r|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   	bytearrayextend
read_chunk
chunk_sizer   )r   r   datar>   r>   r?   r   0  s   
zBodyPartReader.readsizec           	         sf  | j rdS | jr| |I dH }n| |I dH }| jt}|r| dkrd|	 }t
|d }|dkr|  sd| }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rd| _ | j r| j I dH }d|ksJ 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   rm   rf   ri   r   r   r   r   r   r   readline)	r   r   chunkrw   stripped_chunk	remainderover_chunk_size
over_chunkclrfr>   r>   r?   r   @  sB   
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   o  s   
z&BodyPartReader._read_chunk_from_lengthc                    s  || j ks
J d| jd u }|r| j|I d H | _d}t|| j k rO|| j|I d H 7 }|  jt| j 7  _| jdk sDJ d| jrHnt|| j k s$t||kre| j||d   |d | }| jd uslJ | j| }d| j	 }|r~|
|}n|
|tdt| jt| }|dkrt  tjdtd | j||d   W d    n1 sw   Y  ||kr| jd | | _|t| j| }|sd	| _| j}|| _|S )
Nz<Chunk size must be greater or equal than boundary length + 2r   r,   zReading after EOFr   r   ignore)categoryT)r   r   r   r   r   r   r   r   unread_datar   rV   maxrj   catch_warningsfilterwarningsDeprecationWarningr   )r   r   first_chunkr   windowr_   idxresultr>   r>   r?   r   y  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   rstripr   )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)rw   rw   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   Nrc   default)r   get_charsetr   r   rw   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   Nrc   r   )	r   r   r   r	   re   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   Nrc   r   z'data cannot be decoded with %s encoding)keep_blank_valuesrw   )r   r   r   r   rp   
ValueErrorr   )r   rw   r   real_encodingdecoded_datar>   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   s2   t | jv r
| |}| jst| jv r| |S |S )zDecodes data.

        Decoding is done according the specified Content-Encoding
        or Content-Transfer-Encoding headers value.
        )r   r   _decode_content_transferr   r   _decode_content)r   r   r>   r>   r?   r     s
   


zBodyPartReader.decodec                 C   sF   | j td }|dkr|S |dv rt|dd|S td| )Nr[   identity>   gzipdeflateT)rw   suppress_deflate_headerunknown content encoding: )r   r   r   rm   r   decompress_syncRuntimeErrorr   r   rw   r>   r>   r?   r     s   zBodyPartReader._decode_contentc                 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   rm   r   	b64decodebinasciia2b_qpr   r   r>   r>   r?   r   
  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|   r6   r   r   r   r7   r   rx   rs   r>   r>   r?   r|        
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{   %  r
  zBodyPartReader.filenamer   )%r;   r<   r=   r   r   bytesr+   re   r   r   r.   r   r   r   rE   r   r   r   r   r   r   r   r]   r	   r   r   r   r   r   r   r   r   r   r   r!   r|   r{   r>   r>   r>   r?   r0     sN    
/
,
(()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 )BodyPartReaderPayloadrz   rv   argskwargsrB   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   rv   r  r  rs   	__class__r>   r?   r   4  s   



zBodyPartReaderPayload.__init__rc   rd   rw   errorsc                 C   s   t d)NzUnable to decode.	TypeErrorr   rw   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.r  r  r>   r>   r?   as_bytesC  s   zBodyPartReaderPayload.as_byteswriterc                    sR   | j }|jddI d H }|r'|||I d H  |jddI d H }|sd S d S )Ni   )r   )rz   r   writer   )r   r  fieldr   r>   r>   r?   r  M  s   zBodyPartReaderPayload.writerc   rd   )r;   r<   r=   r0   __annotations__r   r   re   r   r  r  r  __classcell__r>   r>   r  r?   r  /  s   
 
r  c                   @   s4  e Zd ZU dZeZdZeed   e	d< e
Zdeeef deddfddZd	edefd
dZdeed e
f  fddZedddefddZdefddZdeed e
f  fddZd)d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d)d!d"Zd)d#d$Z d*d%d&Z!d)d'd(Z"dS )+r2   zMultipart body reader.Nmultipart_reader_clsr   r   rB   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   	_mimetypetyper  r   r   _get_boundaryencoder   r   r   
_last_partr   _at_bofr   )r   r   r   r>   r>   r?   r   `  s   

zMultipartReader.__init__r   c                 C   r   rD   r>   r   r>   r>   r?   r   q  r   zMultipartReader.__aiter__c                    r   rD   r   r   r>   r>   r?   r   t  r   zMultipartReader.__anext__responser8   c                 C   s   |  || |j|j}|S )zConstructs reader instance from HTTP response.

        :param response: :class:`~aiohttp.client.ClientResponse` instance
        )response_wrapper_clsr   r   )clsr)  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_partr(  _read_until_first_boundary_read_boundaryfetch_next_partr'  r#  r   
isinstancer0   r6   r   r   r   r   r   r   rn   r   r   )r   r   rx   rs   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?   r4    s   
zMultipartReader.fetch_next_partr   c                 C   sd   | td}t|}|jdkr#| jdu rt| || jS | || jS | j| j|| j| jj	| j
dS )zDispatches 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   part_reader_clsr   r#  r   r   )r   r   r  r  r>   r>   r?   r7    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))r#  r  r   r   )r   r   r>   r>   r?   r%    s   zMultipartReader._get_boundaryc                    s"   | j r	| j  S | j I d H S rD   )r   rl   r   r   r   r>   r>   r?   	_readline  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   )r:  r   r   r   r   r   r   r>   r>   r?   r2    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   TrM   zInvalid boundary z, expected )r:  r   r   r   r   r   r   r   )r   r   epiloguer   r>   r>   r?   r3    s   
zMultipartReader._read_boundaryc                    sJ   g }	 | j  I d H }| }|| |snqt }||\}}|S rD   )r   r   rn   r   r"   parse_headers)r   linesr   parserr   raw_headersr>   r>   r?   r6    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)r'  r   r   r   r   r   r>   r>   r?   r1    s   


z(MultipartReader._maybe_release_last_partr   )rB   r   )#r;   r<   r=   r   r   r*  r   r   r   r  r0   r8  r   re   r+   r   r.   r   r   r   classmethodr-  rE   r   r   r   r4  r7  r%  r  r:  r2  r3  r6  r1  r>   r>   r>   r?   r2   U  sF   
 


#






r2   c                       s  e Zd ZU dZded< dZd9dedee ddf fd	d
Zd:ddZ	dee
e  dee dee 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ef  defd d!Zd"edefd#d$Z 	d;dedeeeef  defd%d&Z!	d;de"e#e$eef  eeef f deeeef  defd'd(Z%edee 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 )?r3   zMultipart body writer.Nrz   Tr   r   r   rB   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hexr&  r   UnicodeEncodeErrorr   _boundary_valuer  r   _partsr   )r   r   r   r  r  r>   r?   r   *  s   
zMultipartWriter.__init__c                 C   r   rD   r>   r   r>   r>   r?   	__enter__<  r   zMultipartWriter.__enter__exc_typeexc_valexc_tbc                 C   s   d S rD   r>   )r   rK  rL  rM  r>   r>   r?   __exit__?  s   zMultipartWriter.__exit__c                 C   
   t | jS rD   )iterrI  r   r>   r>   r?   __iter__G  rU   zMultipartWriter.__iter__c                 C   rO  rD   )r   rI  r   r>   r>   r?   __len__J  rU   zMultipartWriter.__len__c                 C   s   dS )NTr>   r   r>   r>   r?   __bool__M  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   \"rJ   )	r   r^   match_valid_tchar_regexr   search_invalid_qdtext_char_regexr   replace)r   rv   quoted_value_contentr>   r>   r?   rH  S  s   
zMultipartWriter._boundary_valuec                 C   s   | j dS )NrB  )r   r   r   r>   r>   r?   r   s  r   zMultipartWriter.boundaryr,  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   r5  r'   r   updateappend_payloadr)   r%   r  )r   r,  r   payloadr>   r>   r?   r   w  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   r   rI  r  r   rm   r   r   re   r   )r   r_  rw   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   r,  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  )	r5  r   r   r   listr   r   r^  r(   )r   r,  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   NrM   r   )rI  r   r   r   r   _binary_headers)r   totalr   rw   ra  	part_sizer>   r>   r?   r     s(   	zMultipartWriter.sizerc   rd   rw   r  c                    s   d  fddjD S )zReturn 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   rf  r   )r~   r   _e_terw   r  r   r>   r?   r     s    
z)MultipartWriter.decode.<locals>.<genexpr>)rf   rI  r  r>   rk  r?   r     s   zMultipartWriter.decodec                    s|   g }| j D ](\}}}|d| j d  ||j |||I dH }|| |d q|d| j d  d|S )zReturn 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   rf  r  rf   )r   rw   r  rr   r   ri  rj  
part_bytesr>   r>   r?   r    s   

zMultipartWriter.as_bytesr  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   Nrl  )rI  r   r   r   r  r   rf  MultipartPayloadWriterenable_compressionenable_encoding	write_eof)r   r  rn  r   rw   ra  wr>   r>   r?   r  	  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close	Exceptionr#   error)r   r   r   rx   excr>   r>   r?   rx  $  s    zMultipartWriter.close)r   N)rB   r3   rD   r  )Tr   )-r;   r<   r=   r   r  
_autoclosere   r   r   rJ  r   BaseExceptionr   rN  r
   _PartrQ  r   rR  rE   rS  r^   compilerW  rY  propertyrH  r   r   r   r'   r   r^  rb  r   r   r   re  r   r   r  r  r  rx  r  r>   r>   r  r?   r3   #  s`   
  




$'

r3   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e ddfddZ	dddZ
deddfddZdS )ro  r  rB   Nc                 C   s   || _ d | _d | _d | _d S rD   )_writer	_encoding	_compress_encoding_buffer)r   r  r>   r>   r?   r   ?  s   
zMultipartPayloadWriter.__init__rw   c                 C   s0   |dkr|| _ t | _d S |dkrd| _ d S d S )Nr   r   )r  r   r  )r   rw   r>   r>   r?   rq  E  s   
z&MultipartPayloadWriter.enable_encodingr   strategyc                 C   s   t |d|d| _d S )NT)rw   r   r  )r   r  )r   rw   r  r>   r>   r?   rp  L  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  flushr  r  r  r  r   	b64encoder;  r>   r>   r?   rr  U  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   divmodr   r   r  r  r  r  b2a_qp)r   r   bufdivmod	enc_chunkb64chunkr>   r>   r?   r  `  s*   


$

zMultipartPayloadWriter.write)r   Nr   )r;   r<   r=   r   r   re   rq  r   r   rp  rr  r  r  r>   r>   r>   r?   ro  >  s    

	ro  )r{   )Qr   r  r   r^   sysrD  rj   collectionsr   collections.abcr   r   typesr   typingr   r   r   r	   r
   r   r   r   r   r   r   urllib.parser   r   r   	multidictr   r   compression_utilsr   r   hdrsr   r   r   r   r   helpersr   r   r    r!   httpr"   logr#   r_  r$   r%   r&   r'   r(   r)   r*   streamsr+   version_infor.   r/   __all__client_reqrepr8   RuntimeWarningr4   r5   re   r6   r7   r   r0   	try_firstr  r2   r~  r3   ro  r>   r>   r>   r?   <module>   sn    4$	

d

!/  .% L  