a
    nJhy                     @   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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rJddl<m=Z= G dd de>Z?G dd de>Z@eeA eeeA eeAeAf f dddZBd(eeAeAf eAeeA d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                   @   s   e Zd ZdS )r/   N__name__
__module____qualname__ r8   r8   C/var/www/shaz/venv/lib/python3.9/site-packages/aiohttp/multipart.pyr/   B   s   r/   c                   @   s   e Zd ZdS )r0   Nr4   r8   r8   r8   r9   r0   F   s   r0   )headerreturnc                    s  t tddd t tddd}t td fdd}t tddd	}t tdd
d}dttjtdt t t ddd}| sd i fS | d^}} |st	t
|  d i fS i }|r|d}	d|	vrt	t
|  d i fS |	dd\}
}|
  }
| }|
|v r(t	t
|  d i fS  |
sFt	t|	 qn\||
r||rl||dd }n |st	t|	 qn||
r||r|dd\}}}|pd}nt	t|	 qzt||d}W n& ty   t	t|	 Y qY n0 nd}||r0d}||dd d}nV |r@d}nF|r| d|d  }||r|d ||dd d}d}|rt	t
|  d i fS |||
< q| |fS )N)stringr;   c                 S   s   t | ott| kS N)boolr    setr<   r8   r8   r9   is_tokenM   s    z+parse_content_disposition.<locals>.is_tokenc                 S   s    | d | d   kodkS   S )Nr   "r8   r@   r8   r8   r9   	is_quotedP   s    z,parse_content_disposition.<locals>.is_quotedc                    s    | o|  ddkS )N'   )countr@   rA   r8   r9   
is_rfc5987S   s    z-parse_content_disposition.<locals>.is_rfc5987c                 S   s
   |  dS )N*)endswithr@   r8   r8   r9   is_extended_paramV   s    z4parse_content_disposition.<locals>.is_extended_paramc                 S   s@   |  dd }|sdS | dr,| |d n
| |d  }| S )NrJ   r   FrB   )findrK   isdigit)r<   posZ	substringr8   r8   r9   is_continuous_paramY   s
    "z6parse_content_disposition.<locals>.is_continuous_param )chars)textrR   r;   c                S   s   t d| dd| S )Nz\\([z])z\1)resub)rS   rR   r8   r8   r9   unescape`   s    z+parse_content_disposition.<locals>.unescape;r   =r   rB   rE   rF   utf-8strictTFz\/)strr>   joinmaprT   escaper   splitwarningswarnr/   poplowerstriplstripr0   r   UnicodeDecodeError)r:   rD   rI   rL   rP   rV   Zdisptypepartsparamsitemkeyvalueencoding_Zfailed_valuer8   rH   r9   r1   J   sz    &












r1   filename)rh   namer;   c           
         s   d|  | sd S  | v r |   S || v r0| | S g }t  fdd|  D }t|D ]N\}\}}|dd\}}|dr|d d }|t|kr|| qV qqV|sd S d|}d|v r|dd	\}	}}|	pd
}	t||	dS |S d S )Nz%s*c                 3   s$   | ]\}}|  r||fV  qd S r=   )
startswith).0rj   rk   Zname_sufr8   r9   	<genexpr>   s   z/content_disposition_filename.<locals>.<genexpr>rJ   r   rB   rQ   rE   rF   rY   rZ   )	sorteditems	enumerater_   rK   r[   appendr\   r   )
rh   rp   rg   Zfnparamsnumrj   rk   rm   tailrl   r8   rs   r9   r2      s4    

r2   c                   @   st   e Zd ZdZddddddZd dd	d
Zed dddZedddZ	e
ed  dddZddddZdS )MultipartResponseWrapperzzWrapper around the MultipartReader.

    It takes care about
    underlying connection and close it when it needs in.
    r3   r,   N)respstreamr;   c                 C   s   || _ || _d S r=   )r|   r}   )selfr|   r}   r8   r8   r9   __init__   s    z!MultipartResponseWrapper.__init__r;   c                 C   s   | S r=   r8   r~   r8   r8   r9   	__aiter__   s    z"MultipartResponseWrapper.__aiter__)r,   r.   c                    s   |   I d H }|d u rt|S r=   nextStopAsyncIterationr~   partr8   r8   r9   	__anext__   s    z"MultipartResponseWrapper.__anext__c                 C   s   | j j S )z2Returns True when all response data had been read.)r|   contentat_eofr   r8   r8   r9   r      s    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~   ri   r8   r8   r9   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   r8   r8   r9   r      s    z MultipartResponseWrapper.release)r5   r6   r7   __doc__r   r   r   r   r>   r   r   r   r   r8   r8   r8   r9   r{      s   
	r{   c                   @   s  e Zd ZdZdZdddedeeee dddd	Z	e
d  d
ddZed
ddZee d
ddZddeedddZefeedddZeedddZeedddZed
ddZdd
dd Zdd!ee ed"d#d$Zdd!ee eeeef  d"d%d&Zdd!ee eeeef  d"d'd(Zed
d)d*Zeed+d,d-Zeed+d.d/Zeed+d0d1Z eed2d3d4Z!e"ee d
d5d6Z#e"ee d
d7d8Z$dS )9r.   z&Multipart reader for single body part.i    mixedNsubtypedefault_charsetCIMultiDictProxy[str])boundaryheadersr   r   r   r;   c                C   sz   || _ || _|| _|| _d| _|dk| _| jr2d n| j td }|d urPt|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   lengthr8   r8   r9   r     s    	
zBodyPartReader.__init__r   c                 C   s   | S r=   r8   r   r8   r8   r9   r     s    zBodyPartReader.__aiter__c                    s   |   I d H }|d u rt|S r=   r   r   r8   r8   r9   r     s    zBodyPartReader.__anext__c                    s   |   I d H }|sd S |S r=   )readr   r8   r8   r9   r   #  s    zBodyPartReader.nextFdecode)r   r;   c                   sB   | j r
dS t }| j s0|| | jI dH  q|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   datar8   r8   r9   r   )  s    
zBodyPartReader.read)sizer;   c                    s   | j r
dS | jr"| |I dH }n| |I dH }|  jt|7  _| j| jkrVd| _ | 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   chunkZclrfr8   r8   r9   r   9  s    zBodyPartReader.read_chunkc                    sJ   | j d usJ dt|| j | j }| j|I d H }| j rFd| _|S )Nz(Content-Length required for chunked readT)r   minr   r   r   r   r   )r~   r   r   r   r8   r8   r9   r   O  s    
z&BodyPartReader._read_chunk_from_lengthc                    sh  |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 sxJ d| jd usJ | j| }d| j }|r||}n ||t	dt | jt | }|dkrXt
 2 t
jdtd | j||d   W d    n1 s0    Y  ||kr:| jd | | _|t | j| }|sXd	| _| j}|| _|S )
NrF   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   rM   maxr`   catch_warningsfilterwarningsDeprecationWarningZunread_datar   )r~   r   Zfirst_chunkr   ZwindowrU   idxresultr8   r8   r9   r   Y  s8    


 

4
z&BodyPartReader._read_chunk_from_streamc                    s   | j r
dS | jr| j }n| j I dH }|| jrz|d}| j}| jd }||ksb||krd| _ | j| dS n4| j I dH }|| jr|dd }| j| |S )z Reads body part by line by line.r   Nr      --T)	r   r   popleftr   r   rq   r   rstriprx   )r~   linesliner   Zlast_boundary	next_liner8   r8   r9   r   {  s$    

zBodyPartReader.readlinec                    s(   | j r
dS | j s$| | jI dH  q
dS )z0Like read(), but reads all the data to the void.N)r   r   r   r   r8   r8   r9   r     s    zBodyPartReader.release)rl   rl   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   NrY   default)r   get_charsetr   r~   rl   r   r8   r8   r9   rS     s    zBodyPartReader.textc                   sH   | 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   NrY   r   )	r   r   r   r   r[   r   jsonloadsr   r   r8   r8   r9   r     s
    zBodyPartReader.jsonc                   st   | j ddI dH }|sg S |dur(|}n| jdd}z| |}W n tyd   td| Y n0 t|d|dS )zFLike read(), but assumes that body parts contain form urlencoded data.Tr   NrY   r   z'data cannot be decoded with %s encoding)keep_blank_valuesrl   )r   r   r   r   rf   
ValueErrorr   )r~   rl   r   Zreal_encodingZdecoded_datar8   r8   r9   form  s    zBodyPartReader.formc                 C   s   | j S )z<Returns True if the boundary was reached or False otherwise.r   r   r8   r8   r9   r     s    zBodyPartReader.at_eof)r   r;   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   r8   r8   r9   r     s
    


zBodyPartReader.decodec                 C   sJ   | j td }|dkr|S |dv r8t|dd|S td| d S )NrQ   identity>   gzipdeflateT)rl   suppress_deflate_headerunknown content encoding: )r   r   r   rc   r   Zdecompress_syncRuntimeErrorr~   r   rl   r8   r8   r9   r     s    zBodyPartReader._decode_contentc                 C   sT   | j td }|dkr$t|S |dkr6t|S |dv rB|S td	|d S )NrQ   base64quoted-printable)binary8bit7bitz%unknown content transfer encoding: {})
r   r   r   rc   r   	b64decodebinasciia2b_qpr   formatr   r8   r8   r9   r     s    

z'BodyPartReader._decode_content_transfer)r   r;   c                 C   s*   | j td}t|}|jd| jp&|S )z>Returns charset parameter from Content-Type header or default.rQ   charset)r   r   r   r!   
parametersr   )r~   r   ctypemimetyper8   r8   r9   r     s    zBodyPartReader.get_charsetc                 C   s   t | jt\}}t|dS )z|Returns name specified in Content-Disposition header.

        If the header is missing or malformed, returns None.
        rp   r1   r   r   r   r2   r~   rm   rh   r8   r8   r9   rp     s    zBodyPartReader.namec                 C   s   t | jt\}}t|dS )zReturns filename specified in Content-Disposition header.

        Returns None if the header is missing or malformed.
        ro   r   r   r8   r8   r9   ro     s    zBodyPartReader.filename)%r5   r6   r7   r   r   bytesr+   r[   r   r   r   r   r   r   r>   r   r   r   r   r   r   r   rS   r   r   r   r
   r   r   r   r   r   r   r   r"   rp   ro   r8   r8   r8   r9   r.      sB   
"&&r.   )orderc                       s8   e Zd Zeeedd fddZeddddZ  ZS )BodyPartReaderPayloadN)rk   argskwargsr;   c                    s^   t  j|g|R i | i }|jd ur2|j|d< |jd urF|j|d< |rZ| jdi | d S )Nrp   ro   
attachmentT)r   T)superr   rp   ro   set_content_disposition)r~   rk   r   r   rh   	__class__r8   r9   r   	  s    



zBodyPartReaderPayload.__init__writerr;   c                    sJ   | j }|jddI d H }|rF|||I d H  |jddI d H }qd S )Ni   )r   )rn   r   writer   )r~   r   fieldr   r8   r8   r9   r     s
    zBodyPartReaderPayload.write)r5   r6   r7   r.   r   r   r   __classcell__r8   r8   r   r9   r     s   r   c                   @   s.  e Zd ZdZeZdZeZe	e
e
f eddddZed ddd	Zeed ef  dd
dZededddZedddZeed ef  dddZddddZed ef dddZded ef dddZe
dddZedddZddd d!Zddd"d#Zddd$d%Zddd&d'Z dS )(r,   zMultipart body reader.N)r   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   r8   r8   r9   r   (  s    
zMultipartReader.__init__r.   r   c                 C   s   | S r=   r8   r   r8   r8   r9   r   9  s    zMultipartReader.__aiter__c                    s   |   I d H }|d u rt|S r=   r   r   r8   r8   r9   r   >  s    zMultipartReader.__anext__r3   )responser;   c                 C   s   |  || |j|j}|S )zConstructs reader instance from HTTP response.

        :param response: :class:`~aiohttp.client.ClientResponse` instance
        )response_wrapper_clsr   r   )clsr   objr8   r8   r9   from_responseF  s    	zMultipartReader.from_responsec                 C   s   | j S )z@Returns True if the final boundary was reached, false otherwise.r   r   r8   r8   r9   r   T  s    zMultipartReader.at_eofc                    s   | j r
dS |  I dH  | jr4|  I dH  d| _n|  I dH  | j rLdS |  I dH }| jdu r| jjdkrt	|t
rt|jt\}}|ddkr|dI dH }t|dkrtd|  | _|  I dH }|| _| jS )	z#Emits the next multipart body part.NFr   rp   Z	_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   rd   r   r   )r~   r   rm   rh   r   r8   r8   r9   r   X  s2    
zMultipartReader.nextc                    s2   | j s.|  I dH }|du rq.| I dH  q dS )z=Reads all the body parts to the void till the final boundary.N)r   r   r   r   r8   r8   r9   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   r8   r8   r9   r    s    zMultipartReader.fetch_next_partr   )r   r;   c                 C   sh   | td}t|}|jdkrF| jdu r8t| || jS | || jS | j| j|| j| jj	| j
dS dS )zDispatches the response by the `Content-Type` header.

        Returns a suitable reader instance.

        :param dict headers: Response headers
        rQ   r   Nr   )r   r   r!   r   multipart_reader_clsr   part_reader_clsr   r   r   r   )r~   r   r   r   r8   r8   r9   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   r8   r8   r9   r     s    zMultipartReader._get_boundaryc                    s    | j r| j  S | j I d H S r=   )r   rb   r   r   r   r8   r8   r9   	_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 d S )Nr   z#Could not find starting boundary %rr   T)r  r   r   r   r   r~   r   r8   r8   r9   r    s    
z*MultipartReader._read_until_first_boundaryc                    s   |   I d H  }|| jkrnv|| jd kr~d| _|   I d H }|   I d H }|d d dkrl| j| q| j||g ntd|d| jd S )Nr   TrF   zInvalid boundary z, expected )r  r   r   r   r   rx   r   r   )r~   r   epiloguer   r8   r8   r9   r    s    
zMultipartReader._read_boundaryc                    sH   dg}| j  I d H }| }|| |sq0qt }||\}}|S )Nr   )r   r   rd   rx   r#   parse_headers)r~   linesr   parserr   raw_headersr8   r8   r9   r
    s    
zMultipartReader._read_headersc                    s>   | j dur:| j  s$| j  I dH  | j| j j d| _ dS )z8Ensures that the last read body part is read completely.N)r   r   r   r   r   r   r8   r8   r9   r    s
    

z(MultipartReader._maybe_release_last_part)!r5   r6   r7   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  r8   r8   r8   r9   r,     s8   #

	
r,   c                       s~  e Zd ZdZd)eee dd fddZd ddd	Zeee	  ee	 ee
 dd
ddZee dddZedddZedddZedZedZeedddZeedddZd*eeeeef  edddZeedddZd+eeeeef  eddd Zd,e e!e"eef  eeef f eeeef  edd!d"Z#eee dd#d$Z$d-eedd&d'd(Z%  Z&S ).r-   zMultipart body writer.r   N)r   r   r;   c                    sz   |d ur|nt  j}z|d| _W n tyB   tdd Y n0 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   r8   r9   r     s    zMultipartWriter.__init__r   c                 C   s   | S r=   r8   r   r8   r8   r9   	__enter__  s    zMultipartWriter.__enter__)exc_typeexc_valexc_tbr;   c                 C   s   d S r=   r8   )r~   r   r!  r"  r8   r8   r9   __exit__  s    zMultipartWriter.__exit__c                 C   s
   t | jS r=   )iterr  r   r8   r8   r9   __iter__  s    zMultipartWriter.__iter__c                 C   s
   t | jS r=   )r   r  r   r8   r8   r9   __len__  s    zMultipartWriter.__len__c                 C   s   dS )NTr8   r   r8   r8   r9   __bool__  s    zMultipartWriter.__bool__s   \A[!#$%&'*+\-.^_`|~\w]+\Zs   [\x00-\x08\x0A-\x1F\x7F]c                 C   s^   | j }t| j|r|dS t| j|r4t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.
        r  z*boundary value contains invalid characters   \s   \\   "s   \"rC   )	r   rT   match_valid_tchar_regexr   search_invalid_qdtext_char_regexr   replace)r~   rk   Zquoted_value_contentr8   r8   r9   r    s    
zMultipartWriter._boundary_valuec                 C   s   | j dS )Nr  )r   r   r   r8   r8   r9   r   9  s    zMultipartWriter.boundary)r  r   r;   c                 C   sl   |d u rt  }t|tr.|j| | |S zt||d}W n ty\   td| Y n0 | |S d S )Nr   zCannot create payload from %r)	r   r	  r'   r   updateappend_payloadr)   r%   	TypeError)r~   r  r   payloadr8   r8   r9   rx   =  s    

zMultipartWriter.append)r3  r;   c                 C   s   d}d}| j rPttth|j @ r&J t|jvrdt| j }|j	d|d n|j
td }|r||dvr|td| |dkrd}|j
td }|d	vrtd
| |dkrd}|j}|dur|s|st||jt< | j|||f |S )z)Adds a new body part to multipart writer.Nzsection-r   )rp   rQ   )r   r   r   r   r   )rQ   r   r   r   z#unknown content transfer encoding: r   )r   r   r   r   r   keysr   r   r  r   r   rc   r   r   r[   rx   )r~   r3  rl   te_encodingrp   r   r8   r8   r9   r1  L  s2    
zMultipartWriter.append_payloadc                 C   s    |du rt  }| t||dS )zHelper to append JSON part.Nr/  )r   r1  r$   )r~   r  r   r8   r8   r9   append_jsonr  s    zMultipartWriter.append_jsonc                 C   sV   t |ttfsJ |du r t }t |tr6t| }t|dd}| t||ddS )z&Helper to append form urlencoded part.NT)doseqz!application/x-www-form-urlencoded)r   r  )	r	  r   r   r   listrv   r   r1  r(   )r~   r  r   r   r8   r8   r9   append_form{  s    
zMultipartWriter.append_formc                 C   sv   d}| j D ]P\}}}|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   NrF      )r  r   r   r   r   _binary_headers)r~   totalr   rl   r5  r8   r8   r9   r     s&    	zMultipartWriter.sizeT)r   close_boundaryr;   c                    s   | j D ]\}}}| jr6t|jv s$J d|jt v s6J |d| j d I dH  ||jI dH  |sj|rt|}|r|| |r|	| ||I dH  |
 I dH  n||I dH  |dI dH  q|r|d| j d I dH  dS )zWrite body.zname=r   r   Ns   --
)r  r   r   r   r   r   r;  MultipartPayloadWriterenable_compressionenable_encoding	write_eof)r~   r   r=  r   rl   r5  wr8   r8   r9   r     s$    

zMultipartWriter.write)r   N)N)N)N)T)'r5   r6   r7   r   r[   r   r   r  r   BaseExceptionr   r#  r	   _Partr%  r   r&  r>   r'  rT   compiler+  r-  propertyr  r   r   r   r'   rx   r1  r6  r   r   r   r9  r   r   r   r8   r8   r   r9   r-     sB   


 '  r-   c                   @   sd   e Zd ZeddddZeddddZdejfee	dd	d
dZ
ddddZeddddZdS )r>  Nr   c                 C   s   || _ d | _d | _d | _d S r=   )_writer	_encoding	_compress_encoding_buffer)r~   r   r8   r8   r9   r     s    zMultipartPayloadWriter.__init__r   c                 C   s*   |dkr|| _ t | _n|dkr&d| _ d S )Nr   r   )rH  r   rJ  )r~   rl   r8   r8   r9   r@    s
    
z&MultipartPayloadWriter.enable_encodingr   )rl   strategyr;   c                 C   s   t |d|d| _d S )NT)rl   r   rK  )r   rI  )r~   rl   rK  r8   r8   r9   r?    s
    z)MultipartPayloadWriter.enable_compressionr   c                    s\   | j d ur.| j  }|r.d | _ | |I d H  | jdkrX| jrX| jt| jI d H  d S )Nr   )rI  flushr   rH  rJ  rG  r   	b64encoder  r8   r8   r9   rA    s    


z MultipartPayloadWriter.write_eof)r   r;   c                    s   | j d ur(|r(| j |I d H }|s(d S | jdkr| j}|d usDJ || |rtt|d\}}|d |d  ||d d   }| _|rt|}| j	
|I d H  n6| jdkr| j	
t|I d H  n| j	
|I d H  d S )Nr   r   r   )rI  compressrH  rJ  r   divmodr   r   rM  rG  r   r   b2a_qp)r~   r   bufdivmodZ	enc_chunkZb64chunkr8   r8   r9   r     s$    


$

zMultipartPayloadWriter.write)r5   r6   r7   r   r   r[   r@  zlibZ_DEFAULT_STRATEGYr   r?  rA  r   r   r8   r8   r8   r9   r>    s   	r>  )ro   )Lr   r   r   rT   r  r`   rT  collectionsr   typesr   typingr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   urllib.parser   r   r   Z	multidictr   r   Zcompression_utilsr   r   hdrsr   r   r   r   r   Zhelpersr   r    r!   r"   httpr#   r3  r$   r%   r&   r'   r(   r)   r*   streamsr+   __all__Zclient_reqrepr3   RuntimeWarningr/   r0   r[   r1   r2   r{   r.   Z	try_firstr   r,   rD  r-   r>  r8   r8   r8   r9   <module>   sT   @$	d !/   N T