U
    ;gw                     @   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<   Q/opt/bot/vods_filmes/script/venv/lib/python3.8/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|	krt	t
|  d i fS |	dd\}
}|
  }
| }|
|k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k
r   t	t|	 Y qY nX nd}||r2d}||dd d}nV |rBd}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_Zfailed_valuer<   rL   r=   r5   Q   sz    &












r5   filename)rl   namer?   c           
         s   d|  | sd S  | kr |   S || k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|k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   rt   rk   Zfnparamsnumrn   ro   rq   tailrp   r<   rw   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 k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 k	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 k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`td|S )	zWReads body part content chunk of the specified size.

        size: chunk size
        r   Nbase64   r   T   
z3reader did not read all the data or it is malformed)r   r   _read_chunk_from_length_read_chunk_from_streamr   r   r   rg   r`   rc   r   r   r   r   r   r   readlineAssertionError)	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 k	stdt|| j | j }| j|I d H }| j rFd| _|S )Nz(Content-Length required for chunked readT)r   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td| jd k}|r4| j|I d H | _d}t|| j k r|| j|I d H 7 }|  jt| j 7  _| jdk std| jr8qq8t||kr| j	||d   |d | }| jd k	st| j| }d| j
 }|r||}n ||tdt| jt| }|dkrt ( tjdtd | j	||d   W 5 Q R X ||krh| 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   r   Zunread_datar   rQ   maxrd   catch_warningsfilterwarningsDeprecationWarningr   )r   r   Zfirst_chunkr   ZwindowrY   idxresultr<   r<   r=   r   z  sF    


 


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   ru   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                   sv   | j ddI dH }|sg S |dk	r(|}n| jdd}z| |}W n  tk
rf   td| Y nX 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kr| |}| js.t| jk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k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krB|S td	|d S )NrU   r   quoted-printable)binary8bit7bitz%unknown content transfer encoding: {})
r   r   r   rg   r   	b64decodebinasciia2b_qpr   formatr   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.
        rt   r5   r   r   r   r6   r   rq   rl   r<   r<   r=   rt     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.
        rs   r   r   r<   r<   r=   rs   (  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!   rt   rs   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 )BodyPartReaderPayloadrr   N)ro   argskwargsr?   c                    sT   t  j|f|| i }|jd k	r,|j|d< |jd k	r@|j|d< |rP| jd| d S )Nrt   rs   
attachmentT)r   T)superr   rt   rs   set_content_disposition)r   ro   r   r   rl   	__class__r<   r=   r   6  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   B  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   )rr   r   writer   )r   r   fieldr   r<   r<   r=   r   E  s
    zBodyPartReaderPayload.write)r]   r^   )r9   r:   r;   r/   __annotations__r   r   r_   r   r   __classcell__r<   r<   r   r=   r   2  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"tdd| jjk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   r   _get_boundaryencoder   r   r   
_last_partr   _at_bofr   )r   r   r   r<   r<   r=   r   X  s    
zMultipartReader.__init__r   c                 C   s   | S rA   r<   r   r<   r<   r=   r   i  s    zMultipartReader.__aiter__r   c                    s   |   I d H }|d krt|S rA   r   r   r<   r<   r=   r   l  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_responset  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k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   rt   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k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k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   raw_headersr<   r<   r=   r    s    
zMultipartReader._read_headersc                    s>   | j dk	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   M  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.Nrr   r   )r   r   r?   c                    s|   |d k	r|nt  j}z|d| _W n tk
rD   tdd Y nX 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__2  s    zMultipartWriter.__enter__)exc_typeexc_valexc_tbr?   c                 C   s   d S rA   r<   )r   r.  r/  r0  r<   r<   r=   __exit__5  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__C  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+  I  s    
zMultipartWriter._boundary_valuec                 C   s   | j dS )Nr%  )r   r   r   r<   r<   r=   r   i  s    zMultipartWriter.boundary)r  r   r?   c                 C   sn   |d krt  }t|tr.|j| | |S zt||d}W n  tk
r^   td| Y nX | |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|   m  s    

zMultipartWriter.append)r@  r?   c                 C   s   d}d}| j rPttth|j @ r&tt|jkrdt| j	 }|j
d|d n|jtd }|r||dkr|td| |dkrd}|jtd }|d	krtd
| |dkrd}|j}|dk	r|s|st||jt< | j	|||f |S )z)Adds a new body part to multipart writer.Nzsection-r   )rt   rU   )r   r   r   r   r   )rU   r   r   r   z#unknown content transfer encoding: r   )r   r   r   r   r   keysr   r   r   r,  r   r   rg   r   r   r_   r|   )r   r@  rp   te_encodingrt   r   r<   r<   r=   r?  |  s2    
zMultipartWriter.append_payloadc                 C   s    |dk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t|dk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   r   listrz   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k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   rB  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  
N)r   rG  r   )rv   r   _eZ_terp   r   r   r<   r=   rx     s   z)MultipartWriter.decode.<locals>.<genexpr>)r`   r,  r   r<   rK  r=   r     s    zMultipartWriter.decodeT)r   close_boundaryr?   c                    s   | j D ]\}}}| jr6t|jks$td|jt ks6t|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   rG  MultipartPayloadWriterenable_compressionenable_encoding	write_eof)r   r   rL  r   rp   rB  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   r1  r   _Partr3  r   r4  rB   r5  rX   compiler9  r;  propertyr+  r   r   r
   r&   r|   r?  rC  r   r   r   rF  r   r   r   r  r<   r<   r   r=   r2     sH   



 '   
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 )rM  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   )rW  r   rY  )r   rp   r<   r<   r=   rO    s
    
z&MultipartPayloadWriter.enable_encodingr   )rp   strategyr?   c                 C   s   t |d|d| _d S )NT)rp   r   rZ  )r   rX  )r   rp   rZ  r<   r<   r=   rN    s
    z)MultipartPayloadWriter.enable_compressionr   c                    s\   | j d k	r.| j  }|r.d | _ | |I d H  | jdkrX| jrX| jt| jI d H  d S )Nr   )rX  flushr   rW  rY  rV  r   	b64encoder  r<   r<   r=   rP    s    


z MultipartPayloadWriter.write_eof)r   r?   c                    s   | j d k	r(|r(| j |I d H }|s(d S | jdkr| j}|d k	sDt|| |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   )rX  compressrW  rY  r   r   divmodr   r   r\  rV  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_   rO  zlibZ_DEFAULT_STRATEGYr   rN  rP  r   r   r<   r<   r<   r=   rM    s     	rM  )rs   )Or   r   r   rX   sysr'  rd   rc  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   Z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   rS  r2   rM  r<   r<   r<   r=   <module>   s`   <$	d 
 !/  0 L `