o
    +ify                     @   s0  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
 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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l1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 ddl9m:Z: dZ;erddl<m=Z= G dd de>Z?G dd de>Z@deeA deeeA eeAeAf f fddZB	d*deeAeAf deAdeeA fddZCG dd dZDG dd  d ZEe8eEe4jFd!G d"d# d#e5ZGG d$d% d%ZHee5eAeAf ZIG d&d' d'e5ZJG d(d) d)ZKdS )+    N)deque)TracebackType)TYPE_CHECKINGAnyAsyncIteratorDequeDictIteratorListMappingOptionalSequence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)JsonPayloadLookupErrorOrderPayloadStringPayloadget_payloadpayload_type)StreamReader)MultipartReaderMultipartWriterBodyPartReaderBadContentDispositionHeaderBadContentDispositionParamparse_content_dispositioncontent_disposition_filename)ClientResponsec                   @      e Zd ZdS )r/   N__name__
__module____qualname__ r9   r9   J/var/www/html/corbot_env/lib/python3.10/site-packages/aiohttp/multipart.pyr/   B       r/   c                   @   r4   )r0   Nr5   r9   r9   r9   r:   r0   F   r;   r0   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stringr=   c                 S   s   t | o	tt| kS N)boolr    setr>   r9   r9   r:   is_tokenM   s   z+parse_content_disposition.<locals>.is_tokenc                 S   s    | d | d   kodkS   S )Nr   "r9   rB   r9   r9   r:   	is_quotedP   s    z,parse_content_disposition.<locals>.is_quotedc                    s    | o
|  ddkS )N'   )countrB   rC   r9   r:   
is_rfc5987S      z-parse_content_disposition.<locals>.is_rfc5987c                 S   s
   |  dS )N*)endswithrB   r9   r9   r:   is_extended_paramV      
z4parse_content_disposition.<locals>.is_extended_paramc                 S   s@   |  dd }|sdS | dr| |d n| |d  }| S )NrM   r   FrD   )findrN   isdigit)r>   pos	substringr9   r9   r:   is_continuous_paramY   s
   "z6parse_content_disposition.<locals>.is_continuous_param )charstextrW   c                S   s   t d| dd| S )Nz\\([z])z\1)resub)rX   rW   r9   r9   r:   unescape`   rL   z+parse_content_disposition.<locals>.unescape;r   =r   rD   rG   rH   utf-8strictTFz\/)strr@   joinmaprY   escaper   splitwarningswarnr/   poplowerstriplstripr0   r   UnicodeDecodeError)r<   rF   rK   rO   rU   r[   disptypepartsparamsitemkeyvalueencoding_failed_valuer9   rJ   r:   r1   J   s   *





>r1   filenamern   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 r?   )
startswith).0rp   rq   name_sufr9   r:   	<genexpr>   s    
z/content_disposition_filename.<locals>.<genexpr>rM   r   rD   rV   rG   rH   r^   r_   )	sorteditems	enumeraterd   rN   r`   appendra   r   )
rn   rw   rm   fnparamsnumrp   rq   rs   tailrr   r9   rz   r:   r2      s4   

r2   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.
    respr3   streamr,   r=   Nc                 C   s   || _ || _d S r?   )r   r   )selfr   r   r9   r9   r:   __init__   s   
z!MultipartResponseWrapper.__init__c                 C      | S r?   r9   r   r9   r9   r:   	__aiter__      z"MultipartResponseWrapper.__aiter__)r,   r.   c                        |   I d H }|d u rt|S r?   nextStopAsyncIterationr   partr9   r9   r:   	__anext__   
   z"MultipartResponseWrapper.__anext__c                 C   s   | j j S )z2Returns True when all response data had been read.)r   contentat_eofr   r9   r9   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   ro   r9   r9   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   r9   r9   r:   r      s   z MultipartResponseWrapper.release)r   r3   r   r,   r=   N)r=   r   r=   N)r6   r7   r8   __doc__r   r   r   r   r@   r   r   r   r   r9   r9   r9   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  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d/edefd0d1Zd/edefd2d3Zd/edefd4d5Z d6edefd7d8Z!e"dee fd9d:Z#e"dee fd;d<Z$dS )>r.   z&Multipart reader for single body part.i    mixedNsubtypedefault_charsetboundaryheadersCIMultiDictProxy[str]r   r   r   r=   c                C   sz   || _ || _|| _|| _d| _|dk| _| jrd n| j td }|d ur(t|nd | _	d| _
t | _d | _d| _i | _d S )NF	form-datar   )r   	_boundary_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   lengthr9   r9   r:   r     s   	

zBodyPartReader.__init__c                 C   r   r?   r9   r   r9   r9   r:   r     r   zBodyPartReader.__aiter__c                    r   r?   r   r   r9   r9   r:   r     s
   zBodyPartReader.__anext__c                    s   |   I d H }|sd S |S r?   )readr   r9   r9   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   datar9   r9   r:   r   )  s   
zBodyPartReader.readsizec                    s   | j rdS | jr| |I dH }n| |I dH }|  jt|7  _| j| jkr,d| _ | j r?| j I dH }d|ks?J d|S )zWReads body part content chunk of the specified size.

        size: chunk size
        r   NT   
z3reader did not read all the data or it is malformed)r   r   _read_chunk_from_length_read_chunk_from_streamr   lenr   readline)r   r   chunkclrfr9   r9   r:   r   9  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   r9   r9   r:   r   O  s   
z&BodyPartReader._read_chunk_from_lengthc                    sb  |t | jd ksJ d| jd u }|r| j|I d H | _| j|I d H }|  jt| j 7  _| jdk s=J d| jd usDJ | j| }d| j }|rV||}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 )
NrH   z<Chunk size must be greater or equal than boundary length + 2   zReading after EOFr   r   ignore)categoryT)r   r   r   r   r   r   r   r   rQ   maxre   catch_warningsfilterwarningsDeprecationWarningunread_datar   )r   r   first_chunkr   windowrZ   idxresultr9   r9   r:   r   Y  s:   


 
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   rx   r   rstripr   )r   linesliner   last_boundary	next_liner9   r9   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   r9   r9   r:   r     s   zBodyPartReader.release)rr   rr   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   Nr^   default)r   get_charsetr   r   rr   r   r9   r9   r:   rX     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   Nr^   r   )	r   r   r   r   r`   r   jsonloadsr   r   r9   r9   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   Nr^   r   z'data cannot be decoded with %s encoding)keep_blank_valuesrr   )r   r   r   r   rk   
ValueErrorr   )r   rr   r   real_encodingdecoded_datar9   r9   r:   form  s"   zBodyPartReader.formc                 C      | j S )z<Returns True if the boundary was reached or False otherwise.r   r   r9   r9   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   r9   r9   r:   r     s
   


zBodyPartReader.decodec                 C   sF   | j td }|dkr|S |dv rt|dd|S td| )NrV   identity>   gzipdeflateT)rr   suppress_deflate_headerunknown content encoding: )r   r   r   rh   r   decompress_syncRuntimeErrorr   r   rr   r9   r9   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	|)NrV   base64quoted-printable)binary8bit7bitz%unknown content transfer encoding: {})
r   r   r   rh   r   	b64decodebinasciia2b_qpr   formatr   r9   r9   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.rV   charset)r   r   r   r!   
parametersr   )r   r   ctypemimetyper9   r9   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.
        rw   r1   r   r   r   r2   r   rs   rn   r9   r9   r:   rw        
zBodyPartReader.namec                 C   r   )zReturns filename specified in Content-Disposition header.

        Returns None if the header is missing or malformed.
        rv   r   r   r9   r9   r:   rv     r   zBodyPartReader.filenamer   )%r6   r7   r8   r   r   bytesr+   r`   r   r   r   r   r   r   r@   r   r   r   r   r   r   r   rX   r   r   r   r
   r   r   r   r   r   r   r   r"   rw   rv   r9   r9   r9   r:   r.      sN    

"
((r.   )orderc                       s@   e Zd Zdedededdf fddZdeddfd	d
Z  ZS )BodyPartReaderPayloadrq   argskwargsr=   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 )Nrw   rv   
attachmentT)r  T)superr   rw   rv   set_content_disposition)r   rq   r  r  rn   	__class__r9   r:   r   	  s   



zBodyPartReaderPayload.__init__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   )ru   r   writer   )r   r  fieldr   r9   r9   r:   r    s   zBodyPartReaderPayload.write)r6   r7   r8   r.   r   r   r  __classcell__r9   r9   r	  r:   r    s    r  c                   @   s"  e Zd ZdZeZdZeZde	e
e
f deddfddZded 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 )*r,   zMultipart body reader.Nr   r   r=   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: %sz--FT)r!   r   	_mimetypetyper   r   r   _get_boundaryencoder   r   r   
_last_partr   _at_bofr   )r   r   r   r9   r9   r:   r   (  s   

zMultipartReader.__init__r.   c                 C   r   r?   r9   r   r9   r9   r:   r   9  s   zMultipartReader.__aiter__c                    r   r?   r   r   r9   r9   r:   r   >  r   zMultipartReader.__anext__responser3   c                 C   s   |  || |j|j}|S )zConstructs reader instance from HTTP response.

        :param response: :class:`~aiohttp.client.ClientResponse` instance
        )response_wrapper_clsr   r   )clsr  objr9   r9   r:   from_responseF  s   	zMultipartReader.from_responsec                 C   r   )z@Returns True if the final boundary was reached, false otherwise.r   r   r9   r9   r:   r   T  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   rw   	_charset_       zInvalid default charset)r   _maybe_release_last_partr  _read_until_first_boundary_read_boundaryfetch_next_partr  r  r   
isinstancer.   r1   r   r   r   r   r   r   ri   r   r   )r   r   rs   rn   r   r9   r9   r:   r   X  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   r9   r9   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   r9   r9   r:   r!    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
        rV   r  Nr   )r   r   r!   r  multipart_reader_clsr   part_reader_clsr   r  r   r   )r   r   r   r   r9   r9   r:   r$    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   r9   r9   r:   r    s   zMultipartReader._get_boundaryc                    s"   | j r	| j  S | j I d H S r?   )r   rg   r   r   r   r9   r9   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   r9   r9   r:   r    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   TrH   zInvalid boundary z, expected )r(  r   r   r   r   r   r   r   )r   r   epiloguer   r9   r9   r:   r     s   
zMultipartReader._read_boundaryc                    sL   dg}	 | j  I d H }| }|| |snqt }||\}}|S )Nr   )r   r   ri   r   r#   parse_headers)r   linesr   parserr   raw_headersr9   r9   r:   r#    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   r9   r9   r:   r    s   


z(MultipartReader._maybe_release_last_partr   )r=   r   )!r6   r7   r8   r   r   r  r%  r.   r&  r   r`   r+   r   r   r   r   r   r   classmethodr  r@   r   r   r   r!  r$  r  r  r(  r  r   r#  r  r9   r9   r9   r:   r,     sJ    



#






r,   c                       s  e Zd ZdZd.d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d0dedeeeef  defddZd edefd!d"Z	d0dedeeeef  defd#d$Z	d0d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$d1d*ed+eddfd,d-Z%  Z&S )2r-   zMultipart body writer.r   Nr   r   r=   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	  r9   r:   r     s   
zMultipartWriter.__init__c                 C   r   r?   r9   r   r9   r9   r:   	__enter__  r   zMultipartWriter.__enter__exc_typeexc_valexc_tbc                 C   s   d S r?   r9   )r   r9  r:  r;  r9   r9   r:   __exit__  s   zMultipartWriter.__exit__c                 C   
   t | jS r?   )iterr7  r   r9   r9   r:   __iter__  rP   zMultipartWriter.__iter__c                 C   r=  r?   )r   r7  r   r9   r9   r:   __len__  rP   zMultipartWriter.__len__c                 C   s   dS )NTr9   r   r9   r9   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.
        r0  z*boundary value contains invalid characters   \s   \\   "s   \"rE   )	r   rY   match_valid_tchar_regexr   search_invalid_qdtext_char_regexr   replace)r   rq   quoted_value_contentr9   r9   r:   r6    s   
zMultipartWriter._boundary_valuec                 C   s   | j dS )Nr0  )r   r   r   r9   r9   r:   r   9  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   r"  r'   r   updateappend_payloadr)   r%   	TypeError)r   r  r   payloadr9   r9   r:   r   =  s   


zMultipartWriter.appendrN  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   )rw   rV   )r   r   r   r   r   )rV   r   r   r   z#unknown content transfer encoding: r   )r   r   r   r   r   keysr   r   r7  r  r   rh   r   r   r`   r   )r   rN  rr   te_encodingrw   r   r9   r9   r:   rL  L  s4   
zMultipartWriter.append_payloadc                 C   s    |du rt  }| t||dS )zHelper to append JSON part.NrJ  )r   rL  r$   )r   r  r   r9   r9   r:   append_jsonr  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   r1  )	r"  r   r   r   listr~   r   rL  r(   )r   r  r   r   r9   r9   r:   append_form{  s   
zMultipartWriter.append_formc                 C   sv   d}| j D ](\}}}|s|s|jdu r dS |tdt| j d |j t|j d 7 }q|dt| j d 7 }|S )zSize of the payload.r   NrH      )r7  r   r   r   r   _binary_headers)r   totalr   rr   rP  r9   r9   r:   r     s&   	zMultipartWriter.sizeTr  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   Ns   --
)r7  r   r   r   r  r   rV  MultipartPayloadWriterenable_compressionenable_encoding	write_eof)r   r  rX  r   rr   rP  wr9   r9   r:   r    s(   

zMultipartWriter.write)r   N)r=   r-   r?   )T)'r6   r7   r8   r   r`   r   r   r8  r   BaseExceptionr   r<  r	   _Partr?  r   r@  r@   rA  rY   compilerE  rG  propertyr6  r   r   r   r'   r   rL  rQ  r   r   r   rT  r   r  r  r9   r9   r	  r:   r-     sV     




$'

 r-   c                   @   sj   e Zd ZdeddfddZdeddfddZd	ejfded
e	ddfddZ
dddZdeddfddZdS )rY  r  r=   Nc                 C   s   || _ d | _d | _d | _d S r?   )_writer	_encoding	_compress_encoding_buffer)r   r  r9   r9   r:   r     s   
zMultipartPayloadWriter.__init__rr   c                 C   s0   |dkr|| _ t | _d S |dkrd| _ d S d S )Nr   r   )rc  r   re  )r   rr   r9   r9   r:   r[    s   
z&MultipartPayloadWriter.enable_encodingr   strategyc                 C   s   t |d|d| _d S )NT)rr   r   rf  )r   rd  )r   rr   rf  r9   r9   r:   rZ    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   )rd  flushr  rc  re  rb  r   	b64encoder)  r9   r9   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   )rd  compressrc  re  r   divmodr   r   rh  rb  r  r   b2a_qp)r   r   bufdivmod	enc_chunkb64chunkr9   r9   r:   r    s*   


$

zMultipartPayloadWriter.writer   )r6   r7   r8   r   r   r`   r[  zlibZ_DEFAULT_STRATEGYr   rZ  r\  r  r  r9   r9   r9   r:   rY    s    

	rY  )rv   )Lr   r   r   rY   r2  re   rq  collectionsr   typesr   typingr   r   r   r   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#   rN  r$   r%   r&   r'   r(   r)   r*   streamsr+   __all__client_reqrepr3   RuntimeWarningr/   r0   r`   r1   r2   r   r.   	try_firstr  r,   r_  r-   rY  r9   r9   r9   r:   <module>   s`    @$	
d

!/   N T