a
    `gP                     @   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 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 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: ej;dkrRd dlm<Z< nd dlm=Z= e=dddZ<dZ>erddl?m@Z@ G dd deAZBG dd deAZCeeD eeeD eeDeDf f dddZEd-eeDeDf eDeeD ddd ZFG d!d" d"ZGG d#d dZHe8eHe4jId$G d%d& d&e5ZJG d'd( d(ZKee5eDeDf ZLG d)d* d*e5ZMG d+d, d,ZNdS ).    N)deque)TracebackType)TYPE_CHECKINGAny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)      )Self)TypeVarr-   BodyPartReader)bound)MultipartReaderMultipartWriterr/   BadContentDispositionHeaderBadContentDispositionParamparse_content_dispositioncontent_disposition_filename)ClientResponsec                   @   s   e Zd ZdS )r3   N__name__
__module____qualname__ r<   r<   _/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/aiohttp/multipart.pyr3   I   s   r3   c                   @   s   e Zd ZdS )r4   Nr8   r<   r<   r<   r=   r4   M   s   r4   )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@   r<   r<   r=   is_tokenT   s    z+parse_content_disposition.<locals>.is_tokenc                 S   s    | d | d   kodkS   S )Nr   "r<   rD   r<   r<   r=   	is_quotedW   s    z,parse_content_disposition.<locals>.is_quotedc                    s    | o|  ddkS )N'   )countrD   rE   r<   r=   
is_rfc5987Z   s    z-parse_content_disposition.<locals>.is_rfc5987c                 S   s
   |  dS )N*)endswithrD   r<   r<   r=   is_extended_param]   s    z4parse_content_disposition.<locals>.is_extended_paramc                 S   s@   |  dd }|sdS | dr,| |d n
| |d  }| S )NrN   r   FrF   )findrO   isdigit)r@   posZ	substringr<   r<   r=   is_continuous_param`   s
    "z6parse_content_disposition.<locals>.is_continuous_param )chars)textrV   r?   c                S   s   t d| dd| S )Nz\\([z])z\1)resub)rW   rV   r<   r<   r=   unescapeg   s    z+parse_content_disposition.<locals>.unescape;r   =r   rF   rI   rJ   utf-8strictTFz\/)strrB   joinmaprX   escaper   splitwarningswarnr3   poplowerstriplstripr4   r   UnicodeDecodeError)r>   rH   rM   rP   rT   rZ   Zdisptypepartsparamsitemkeyvalueencoding_failed_valuer<   rL   r=   r5   Q   sz    &












r5   filename)rl   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 rA   )
startswith).0rn   ro   Zname_sufr<   r=   	<genexpr>   s   z/content_disposition_filename.<locals>.<genexpr>rN   r   rF   rU   rI   rJ   r]   r^   )	sorteditems	enumeraterc   rO   r_   appendr`   r   )
rl   ru   rk   Zfnparamsnumrn   ro   rq   tailrp   r<   rx   r=   r6      s4    

r6   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.
    r7   r1   N)respstreamr?   c                 C   s   || _ || _d S rA   )r   r   )selfr   r   r<   r<   r=   __init__   s    z!MultipartResponseWrapper.__init__r?   c                 C   s   | S rA   r<   r   r<   r<   r=   	__aiter__   s    z"MultipartResponseWrapper.__aiter__)r1   r/   c                    s   |   I d H }|d u rt|S rA   nextStopAsyncIterationr   partr<   r<   r=   	__anext__   s    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      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   rm   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)r9   r:   r;   __doc__r   r   r   r   rB   r   r   r   r   r<   r<   r<   r=   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
e
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/d0Zeed,d1d2Z eed3d4d5Z!e"ee dd6d7Z#e"ee dd8d9Z$dS ):r/   z&Multipart reader for single body part.i    mixedNsubtypedefault_charsetCIMultiDictProxy[str])boundaryheadersr   r   r   r?   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 )NrJ   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   r?   c                 C   s   | S rA   r<   r   r<   r<   r=   r   "  s    zBodyPartReader.__aiter__r   c                    s   |   I d H }|d u rt|S rA   r   r   r<   r<   r=   r   %  s    zBodyPartReader.__anext__c                    s   |   I d H }|sd S |S rA   )readr   r<   r<   r=   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   datar<   r<   r=   r   1  s    
zBodyPartReader.read)sizer?   c           	         sd  | 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r| jd| }| jt
|d | _t
||kr|| jdt
| I dH 7 }|sd| _ |d|	 7 }||7 }t
|d }ql|  jt
|7  _| j| jkr6d| _ | 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   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   rg   r`   rc   r   r   r   r   r   r   readline)	r   r   chunkrp   Zstripped_chunk	remainderZover_chunk_sizeZ
over_chunkZclrfr<   r<   r=   r   A  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   r<   r<   r=   r   p  s    
z&BodyPartReader._read_chunk_from_lengthc                    s  || j ksJ d| jd u }|r4| j|I d H | _d}t|| j k r|| j|I d H 7 }|  jt| j 7  _| jdk sJ d| jr8qq8t||kr| j||d   |d | }| jd usJ | j| }d| j	 }|r|
|}n |
|tdt| jt| }|dkrt 2 tjdtd | j||d   W d    n1 sZ0    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   Zunread_datar   rQ   maxrd   catch_warningsfilterwarningsDeprecationWarningr   )r   r   Zfirst_chunkr   ZwindowrY   idxresultr<   r<   r=   r   z  sF    


 

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   rv   r   rstripr}   )r   linesliner   Zlast_boundary	next_liner<   r<   r=   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   r<   r<   r=   r     s    zBodyPartReader.release)rp   rp   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   Nr]   default)r   get_charsetr   r   rp   r   r<   r<   r=   rW     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   Nr]   r   )	r   r   r   r   r_   r   jsonloadsr   r   r<   r<   r=   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   Nr]   r   z'data cannot be decoded with %s encoding)keep_blank_valuesrp   )r   r   r   r   rj   
ValueErrorr   )r   rp   r   Zreal_encodingZdecoded_datar<   r<   r=   form  s    zBodyPartReader.formc                 C   s   | j S )z<Returns True if the boundary was reached or False otherwise.r   r   r<   r<   r=   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   r<   r<   r=   r     s
    


zBodyPartReader.decodec                 C   sJ   | j td }|dkr|S |dv r8t|dd|S td| d S )NrU   identity>   deflategzipT)rp   suppress_deflate_headerunknown content encoding: )r   r   r   rg   r   Zdecompress_syncRuntimeErrorr   r   rp   r<   r<   r=   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 )NrU   r   quoted-printable)binary8bit7bit#unknown content transfer encoding: )	r   r   r   rg   r   	b64decodebinasciia2b_qpr   r   r<   r<   r=   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.rU   charset)r   r   r   r    
parametersr   )r   r   ctypemimetyper<   r<   r=   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.
        ru   r5   r   r   r   r6   r   rq   rl   r<   r<   r=   ru     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.
        rt   r   r   r<   r<   r=   rt   &  s    zBodyPartReader.filename)%r9   r:   r;   r   r   bytesr*   r_   r   r   r-   r   r   r   rB   r   r   r   r   r   r   r   rW   r   r   r   r	   r   r   r   r   r   r   r   r!   ru   rt   r<   r<   r<   r=   r/     sB   /
,&&)orderc                       sV   e Zd ZU eed< eeedd fddZdeeedd	d
ZeddddZ	  Z
S )BodyPartReaderPayloadrs   N)ro   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 )Nru   rt   
attachmentT)r   T)superr   ru   rt   set_content_disposition)r   ro   r   r   rl   	__class__r<   r=   r   4  s    



zBodyPartReaderPayload.__init__r]   r^   rp   errorsr?   c                 C   s   t dd S )NzUnable to decode.)	TypeErrorr   rp   r   r<   r<   r=   r   @  s    zBodyPartReaderPayload.decode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   )rs   r   writer   )r   r   fieldr   r<   r<   r=   r   C  s
    zBodyPartReaderPayload.write)r]   r^   )r9   r:   r;   r/   __annotations__r   r   r_   r   r   __classcell__r<   r<   r   r=   r   0  s   
r   c                   @   s>  e Zd ZU dZeZdZeed   e	d< e
Zeeef eddddZee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 ))r1   zMultipart body reader.Nmultipart_reader_cls)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: %s--FT)r    r   	_mimetypetyper   r   r   _get_boundaryencoder   r   r   
_last_partr   _at_bofr   )r   r   r   r<   r<   r=   r   V  s    
zMultipartReader.__init__r   c                 C   s   | S rA   r<   r   r<   r<   r=   r   g  s    zMultipartReader.__aiter__r   c                    s   |   I d H }|d u rt|S rA   r   r   r<   r<   r=   r   j  s    zMultipartReader.__anext__r7   )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  objr<   r<   r=   from_responser  s    	zMultipartReader.from_responsec                 C   s   | j S )z@Returns True if the final boundary was reached, false otherwise.r   r   r<   r<   r=   r     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   ru   Z	_charset_       zInvalid default charset)r   _maybe_release_last_partr  _read_until_first_boundary_read_boundaryfetch_next_partr  r  r   
isinstancer/   r5   r   r   r   r   r   r   rh   r   r   )r   r   rq   rl   r   r<   r<   r=   r     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   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=   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
        rU   r  Nr   )r   r   r    r  r  r   part_reader_clsr   r  r   r   )r   r   r   r   r<   r<   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   r<   r<   r=   r	    s    zMultipartReader._get_boundaryc                    s    | j r| j  S | j I d H S rA   )r   rf   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 d S )Nr   z#Could not find starting boundary %rr   T)r  r   r   r   r   r   r   r<   r<   r=   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   TrJ   zInvalid boundary z, expected )r  r   r   r   r   r}   r   r   )r   r   epiloguer   r<   r<   r=   r    s    
zMultipartReader._read_boundaryc                    sH   dg}| j  I d H }| }|| |sq0qt }||\}}|S )Nr   )r   r   rh   r}   r"   parse_headers)r   linesr   parserr   Zraw_headersr<   r<   r=   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   r<   r<   r=   r    s
    

z(MultipartReader._maybe_release_last_part)#r9   r:   r;   r   r   r  r  r   r   r  r/   r  r
   r_   r*   r   r-   r   r   r   classmethodr  rB   r   r   r   r  r  r	  r   r  r  r  r  r  r<   r<   r<   r=   r1   K  s6   
#

	
r1   c                       s  e Zd ZU dZded< 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d0eeeeef  edddZeedddZd1eeeeef  edd d!Z d2e!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%d3eeed(d)d*Z&d4eedd,d-d.Z'  Z(S )5r2   zMultipart body writer.Nrs   r   )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   r<   r=   r     s    zMultipartWriter.__init__r   c                 C   s   | S rA   r<   r   r<   r<   r=   	__enter__0  s    zMultipartWriter.__enter__)exc_typeexc_valexc_tbr?   c                 C   s   d S rA   r<   )r   r-  r.  r/  r<   r<   r=   __exit__3  s    zMultipartWriter.__exit__c                 C   s
   t | jS rA   )iterr+  r   r<   r<   r=   __iter__;  s    zMultipartWriter.__iter__c                 C   s
   t | jS rA   )r   r+  r   r<   r<   r=   __len__>  s    zMultipartWriter.__len__c                 C   s   dS )NTr<   r   r<   r<   r=   __bool__A  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   \"rG   )	r   rX   match_valid_tchar_regexr   search_invalid_qdtext_char_regexr   replace)r   ro   Zquoted_value_contentr<   r<   r=   r*  G  s    
zMultipartWriter._boundary_valuec                 C   s   | j dS )Nr$  )r   r   r   r<   r<   r=   r   g  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$   r   )r   r  r   payloadr<   r<   r=   r}   k  s    

zMultipartWriter.append)r?  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   )ru   rU   )r   r   r   r   r   )rU   r   r   r   r   r   )r   r   r   r   r   keysr   r   r+  r   r   rg   r   r   r_   r}   )r   r?  rp   te_encodingru   r   r<   r<   r=   r>  z  s2    
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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   listr{   r   r>  r'   )r   r  r   r   r<   r<   r=   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   NrJ   r   )r+  r   r   r   r   _binary_headers)r   totalr   rp   rA  r<   r<   r=   r     s&    	zMultipartWriter.sizer]   r^   r   c                    s   d  fddjD S )NrU   c                 3   s8   | ]0\}}}d j  d |j  |  V  qdS )r  z
N)r   rF  r   )rw   r   _eZ_terp   r   r   r<   r=   ry     s   z)MultipartWriter.decode.<locals>.<genexpr>)r`   r+  r   r<   rI  r=   r     s    zMultipartWriter.decodeT)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   rF  MultipartPayloadWriterenable_compressionenable_encoding	write_eof)r   r   rJ  r   rp   rA  wr<   r<   r=   r     s$    

zMultipartWriter.write)r   N)N)N)N)r]   r^   )T))r9   r:   r;   r   r  r_   r   r   r,  r   BaseExceptionr   r0  r   _Partr2  r   r3  rB   r4  rX   compiler8  r:  propertyr*  r   r   r
   r&   r}   r>  rB  r   r   r   rE  r   r   r   r  r<   r<   r   r=   r2     sF   



 '  
r2   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 )rK  Nr   c                 C   s   || _ d | _d | _d | _d S rA   )_writer	_encoding	_compress_encoding_buffer)r   r   r<   r<   r=   r     s    zMultipartPayloadWriter.__init__r   c                 C   s*   |dkr|| _ t | _n|dkr&d| _ d S )Nr   r   )rU  r   rW  )r   rp   r<   r<   r=   rM    s
    
z&MultipartPayloadWriter.enable_encodingr   )rp   strategyr?   c                 C   s   t |d|d| _d S )NT)rp   r   rX  )r   rV  )r   rp   rX  r<   r<   r=   rL    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   )rV  flushr   rU  rW  rT  r   	b64encoder  r<   r<   r=   rN    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   )rV  compressrU  rW  r   divmodr   r   rZ  rT  r   r   b2a_qp)r   r   bufdivmodZ	enc_chunkZb64chunkr<   r<   r=   r     s$    


$

zMultipartPayloadWriter.write)r9   r:   r;   r   r   r_   rM  zlibZ_DEFAULT_STRATEGYr   rL  rN  r   r   r<   r<   r<   r=   rK    s   	rK  )rt   )Or   r   r   rX   sysr&  rd   ra  collectionsr   typesr   typingr   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   helpersr   r   r    r!   httpr"   r?  r#   r$   r%   r&   r'   r(   r)   streamsr*   version_infor-   r.   __all__Zclient_reqrepr7   RuntimeWarningr3   r4   r_   r5   r6   r   r/   Z	try_firstr   r1   rQ  r2   rK  r<   r<   r<   r=   <module>   s^   <$	d !/  . L `