
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    'â7`û}  ã                   @   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 d dlmZmZmZ d dlmZ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+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 ddl5m6Z6 dZ7e�r6ddl8m9Z9 G dd„ de:ƒZ;G dd„ de:ƒZ<ee= eee= ee=e=f f dœdd„Z>d'ee=e=f e=ee= dœdd„Z?G dd„ dƒZ@G dd„ dƒZAe4eAe0jBd�G dd „ d e1ƒƒZCG d!d"„ d"ƒZDee1e=e=f ZEG d#d$„ d$e1ƒZFG d%d&„ d&ƒZGdS )(é    N)Údeque)ÚTracebackType)ÚTYPE_CHECKINGÚAnyÚAsyncIteratorÚDictÚIteratorÚListÚMappingÚOptionalÚSequenceÚTupleÚTypeÚUnion)Ú	parse_qslÚunquoteÚ	urlencode)ÚCIMultiDictÚCIMultiDictProxyÚMultiMappingé   )Ú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__© r5   r5   úD/opt/alt/python38/lib64/python3.8/site-packages/aiohttp/multipart.pyr,   ?   s   r,   c                   @   s   e Zd ZdS )r-   Nr1   r5   r5   r5   r6   r-   C   s   r-   )Ú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„}| s†d i fS |  d¡^}}ˆ |ƒs²t 	t
| ƒ¡ d i fS i }|�r¬| d¡}	d|	krät 	t
| ƒ¡ d i fS |	 dd¡\}
}|
 ¡  ¡ }
| ¡ }|
|k�r(t 	t
| ƒ¡ d i fS ˆ |
ƒ�sFt 	t|	ƒ¡ q¶�n\||
ƒ�rŠ||ƒ�rl||dd… ƒ}nˆ |ƒ�s¢t 	t|	ƒ¡ q¶�n||
ƒ�r||ƒ�r¼| dd¡\}}}|�p¸d}nt 	t|	ƒ¡ q¶zt||dƒ}W n( tk
�r   t 	t|	ƒ¡ Y q¶Y nX nšd}||ƒ�r2d}||dd…  d¡ƒ}nTˆ |ƒ�rBd}nD|�r†d ||d ¡}||ƒ�r†| d¡ ||dd…  d¡ƒ}d}|�r¢t 	t
| ƒ¡ d i fS |||
< q¶| ¡ |fS )N)Ústringr8   c                 S   s   t | ƒott| ƒkS ©N)Úboolr   Úset©r9   r5   r5   r6   Úis_tokenJ   s    z+parse_content_disposition.<locals>.is_tokenc                 S   s    | d | d   kodkS   S )Nr   éÿÿÿÿú"r5   r=   r5   r5   r6   Ú	is_quotedM   s    z,parse_content_disposition.<locals>.is_quotedc                    s   ˆ | ƒo|   d¡dkS )Nú'é   )Úcountr=   ©r>   r5   r6   Ú
is_rfc5987P   s    z-parse_content_disposition.<locals>.is_rfc5987c                 S   s
   |   d¡S )NÚ*)Úendswithr=   r5   r5   r6   Úis_extended_paramS   s    z4parse_content_disposition.<locals>.is_extended_paramc                 S   s@   |   d¡d }|sdS |  d¡r,| |d… n
| |d … }| ¡ S )NrG   r   Fr?   )ÚfindrH   Úisdigit)r9   ÚposZ	substringr5   r5   r6   Úis_continuous_paramV   s
    "z6parse_content_disposition.<locals>.is_continuous_paramÚ )Úchars)ÚtextrO   r8   c                S   s   t  d|› d�d| ¡S )Nz\\([z])z\1)ÚreÚsub)rP   rO   r5   r5   r6   Úunescape]   s    z+parse_content_disposition.<locals>.unescapeú;r   ú=r   r?   rB   rC   úutf-8ÚstrictTFz\/z{};{})Ústrr;   ÚjoinÚmaprQ   Úescaper   ÚsplitÚwarningsÚwarnr,   ÚpopÚlowerÚstripÚlstripr-   r   ÚUnicodeDecodeErrorÚformat)r7   rA   rF   rI   rM   rS   ZdisptypeÚpartsÚparamsÚitemÚkeyÚvalueÚencodingÚ_ÚfailedÚ_valuer5   rE   r6   r.   G   sz    &












r.   Úfilename)rf   Únamer8   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 q¦qV|s®d S d |¡}d|kræ| dd	¡\}	}}|	pØd
}	t||	dƒS |S d S )Nz%s*c                 3   s$   | ]\}}|  ˆ ¡r||fV  qd S r:   )Ú
startswith)Ú.0rh   ri   ©Zname_sufr5   r6   Ú	<genexpr>¶   s    
 z/content_disposition_filename.<locals>.<genexpr>rG   r   r?   rN   rB   rC   rV   rW   )	ÚsortedÚitemsÚ	enumerater\   rH   rX   ÚappendrY   r   )
rf   ro   re   ZfnparamsÚnumrh   ri   rk   Útailrj   r5   rr   r6   r/   ª   s4    ÿ

r/   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.
    r0   r)   N)ÚrespÚstreamr8   c                 C   s   || _ || _d S r:   )r{   r|   )Úselfr{   r|   r5   r5   r6   Ú__init__Ò   s    z!MultipartResponseWrapper.__init__©r8   c                 C   s   | S r:   r5   ©r}   r5   r5   r6   Ú	__aiter__Ú   s    z"MultipartResponseWrapper.__aiter__)r)   r+   c                 Ã   s   |   ¡ I d H }|d krt‚|S r:   ©ÚnextÚStopAsyncIteration©r}   Úpartr5   r5   r6   Ú	__anext__Ý   s    z"MultipartResponseWrapper.__anext__c                 C   s   | j j ¡ S )z2Returns True when all response data had been read.)r{   ÚcontentÚat_eofr€   r5   r5   r6   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}   rg   r5   r5   r6   rƒ   é   s    
zMultipartResponseWrapper.nextc                 Ã   s   | j  ¡ I dH  dS )zPReleases the connection gracefully, reading all the content
        to the void.N)r{   rŠ   r€   r5   r5   r6   rŠ   ò   s    z MultipartResponseWrapper.release)r2   r3   r4   Ú__doc__r~   r�   r   r‡   r;   r‰   r   rƒ   rŠ   r5   r5   r5   r6   rz   Ë   s   üþ
þ	rz   c                   @   s   e Zd ZdZdZed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)œd.d/„Z eed0œd1d2„Z!e"ee dœd3d4„ƒZ#e"ee dœd5d6„ƒZ$dS )7r+   z&Multipart reader for single body part.i    úCIMultiDictProxy[str]N)ÚboundaryÚheadersrˆ   r8   c                 C   s`   || _ || _|| _d| _| j  td ¡}|d k	r6t|ƒnd | _d| _t	ƒ | _
d | _d| _i | _d S )NFr   )r�   Ú	_boundaryÚ_contentÚ_at_eofÚgetr   ÚintÚ_lengthÚ_read_bytesr   Ú_unreadÚ_prev_chunkÚ_content_eofÚ_cache)r}   rŽ   r�   rˆ   Úlengthr5   r5   r6   r~   ý   s    zBodyPartReader.__init__r   c                 C   s   | S r:   r5   r€   r5   r5   r6   r�     s    zBodyPartReader.__aiter__c                 Ã   s   |   ¡ I d H }|d krt‚|S r:   r‚   r…   r5   r5   r6   r‡     s    zBodyPartReader.__anext__c                 Ã   s   |   ¡ I d H }|sd S |S r:   )Úreadr‹   r5   r5   r6   rƒ     s    zBodyPartReader.nextF©Údecode)rž   r8   c                Ã   sB   | j r
dS tƒ }| j s0| |  | j¡I dH ¡ q|r>|  |¡S |S )z»Reads 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ž   Údatar5   r5   r6   rœ     s    
zBodyPartReader.read)Úsizer8   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|t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ÚAssertionError)r}   r¥   ÚchunkZclrfr5   r5   r6   r¢   ,  s    ÿþzBodyPartReader.read_chunkc                 Ã   s:   | j d k	stdƒ‚t|| j | j ƒ}| j |¡I d H }|S )Nz(Content-Length required for chunked read)r•   r«   Úminr–   r‘   rœ   )r}   r¥   r£   r¬   r5   r5   r6   r§   B  s    z&BodyPartReader._read_chunk_from_lengthc              	   Ã   sR  |t | jƒd kstdƒ‚| jd k}|r<| j |¡I d H | _| j |¡I d H }|  jt| j ¡ ƒ7  _| jdk sxtdƒ‚| jd k	s†t‚| j| }d| j }|rª| 	|¡}n | 	|t
dt | jƒt |ƒ ƒ¡}|dk�rBt ¡ �( tjdtd� | j ||d … ¡ W 5 Q R X ||k�r$| jd |… | _|t | jƒ|… }|�sBd	| _| j}|| _|S )
NrC   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”   r‰   rJ   Úmaxr]   Úcatch_warningsÚfilterwarningsÚDeprecationWarningZunread_datar’   )r}   r¥   Zfirst_chunkr¬   ÚwindowrR   ÚidxÚresultr5   r5   r6   r¨   J  s8    ÿþ


 


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r®d| _ | 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ª   rp   r�   Úrstriprw   )r}   ÚlineÚslinerŽ   Zlast_boundaryÚ	next_liner5   r5   r6   rª   l  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€   r5   r5   r6   rŠ   ‰  s    zBodyPartReader.release)rj   ©rj   r8   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�   NrV   ©Údefault)rœ   Úget_charsetrž   ©r}   rj   r¤   r5   r5   r6   rP   �  s    zBodyPartReader.textc                Ã   s:   | j dd�I dH }|sdS |p(| jdd�}t | |¡¡S )z<Like read(), but assumes that body parts contains JSON data.Tr�   NrV   rÀ   )rœ   rÂ   ÚjsonÚloadsrž   rÃ   r5   r5   r6   rÄ   ˜  s
    zBodyPartReader.jsonc                Ã   sL   | j dd�I dH }|sg S |dk	r(|}n| jdd�}t| ¡  |¡d|d�S )zXLike read(), but assumes that body parts contains form
        urlencoded data.
        Tr�   NrV   rÀ   )Úkeep_blank_valuesrj   )rœ   rÂ   r   r»   rž   )r}   rj   r¤   Zreal_encodingr5   r5   r6   Úform   s    ýzBodyPartReader.formc                 C   s   | j S )z<Returns True if the boundary was reached or False otherwise.©r’   r€   r5   r5   r6   r‰   ±  s    zBodyPartReader.at_eof)r¤   r8   c                 C   s,   t | jkr|  |¡}t| jkr(|  |¡S |S )zrDecodes data according the specified Content-Encoding
        or Content-Transfer-Encoding headers value.
        )r   r�   Ú_decode_content_transferr   Ú_decode_content)r}   r¤   r5   r5   r6   rž   µ  s
    



zBodyPartReader.decodec                 C   sb   | j  td¡ ¡ }|dkr*t |tj ¡S |dkrDt |dtj ¡S |dkrP|S td|› �ƒ‚d S )NrN   ÚdeflateÚgzipé   Úidentityúunknown content encoding: )r�   r“   r   r`   ÚzlibÚ
decompressÚ	MAX_WBITSÚRuntimeError©r}   r¤   rj   r5   r5   r6   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 )NrN   Úbase64úquoted-printable)ÚbinaryÚ8bitÚ7bitú%unknown content transfer encoding: {})
r�   r“   r   r`   rÕ   Ú	b64decodeÚbinasciiÚa2b_qprÓ   rd   rÔ   r5   r5   r6   rÉ   Ë  s    

ÿz'BodyPartReader._decode_content_transfer)rÁ   r8   c                 C   s$   | j  td¡}t|ƒ}|j d|¡S )z>Returns charset parameter from Content-Type header or default.rN   Úcharset)r�   r“   r   r   Ú
parameters)r}   rÁ   ÚctypeÚmimetyper5   r5   r6   rÂ   Ù  s    zBodyPartReader.get_charsetc                 C   s   t | j t¡ƒ\}}t|dƒS )zoReturns name specified in Content-Disposition header or None
        if missed or header is malformed.
        ro   ©r.   r�   r“   r   r/   ©r}   rk   rf   r5   r5   r6   ro   ß  s    zBodyPartReader.namec                 C   s   t | j t¡ƒ\}}t|dƒS )zsReturns filename specified in Content-Disposition header or None
        if missed or header is malformed.
        rn   râ   rã   r5   r5   r6   rn   è  s    zBodyPartReader.filename)%r2   r3   r4   rŒ   r£   Úbytesr(   r~   r   r�   r‡   r   rƒ   r;   rœ   r”   r¢   r§   r¨   rª   rŠ   rX   rP   r   r   rÄ   r	   r   rÇ   r‰   rž   rÊ   rÉ   rÂ   r   ro   rn   r5   r5   r5   r6   r+   ø   s8     þ"&&
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)ri   ÚargsÚkwargsr8   c                    sT   t ƒ j|f|ž|Ž i }|jd k	r,|j|d< |jd k	r@|j|d< |rP| jd|Ž d S )Nro   rn   Ú
attachmentT)ré   T)Úsuperr~   ro   rn   Zset_content_disposition)r}   ri   rç   rè   rf   ©Ú	__class__r5   r6   r~   ó  s    



zBodyPartReaderPayload.__init__©Úwriterr8   c                 Ã   sJ   | j }|jdd�I d H }|rF| | |¡¡I d H  |jdd�I d H }qd S )Ni   )r¥   )rm   r¢   Úwriterž   )r}   rî   Úfieldr¬   r5   r5   r6   rï   ÿ  s
    zBodyPartReaderPayload.write)r2   r3   r4   r+   r   r~   rï   Ú__classcell__r5   r5   rë   r6   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ˆ   r8   c                 C   s:   || _ d|  ¡   ¡ | _|| _d | _d| _d| _g | _d S )Nz--FT)	r�   Ú_get_boundaryÚencoder�   r‘   Ú
_last_partr’   Ú_at_bofr—   )r}   r�   rˆ   r5   r5   r6   r~     s    ÿzMultipartReader.__init__r+   r   c                 C   s   | S r:   r5   r€   r5   r5   r6   r�     s    zMultipartReader.__aiter__c                 Ã   s   |   ¡ I d H }|d krt‚|S r:   r‚   r…   r5   r5   r6   r‡   "  s    zMultipartReader.__anext__r0   )Úresponser8   c                 C   s   |   || |j|jƒ¡}|S )z‚Constructs reader instance from HTTP response.

        :param response: :class:`~aiohttp.client.ClientResponse` instance
        )Úresponse_wrapper_clsr�   rˆ   )Úclsrö   Úobjr5   r5   r6   Úfrom_response*  s
    	 ÿzMultipartReader.from_responsec                 C   s   | j S )zSReturns True if the final boundary was reached or
        False otherwise.
        rÈ   r€   r5   r5   r6   r‰   8  s    zMultipartReader.at_eofc                 Ã   sb   | j r
dS |  ¡ I dH  | jr4|  ¡ I dH  d| _n|  ¡ I dH  | j rLdS |  ¡ I dH | _| jS )z#Emits the next multipart body part.NF)r’   Ú_maybe_release_last_partrõ   Ú_read_until_first_boundaryÚ_read_boundaryÚfetch_next_partrô   r€   r5   r5   r6   rƒ   >  s    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‹   r5   r5   r6   rŠ   P  s
    zMultipartReader.releasec                 Ã   s   |   ¡ I dH }|  |¡S )z"Returns the next body part reader.N)Ú_read_headersÚ_get_part_reader)r}   r�   r5   r5   r6   rþ   X  s    zMultipartReader.fetch_next_partr�   )r�   r8   c                 C   s\   |  td¡}t|ƒ}|jdkrF| jdkr8t| ƒ|| jƒS |  || j¡S |  | j|| j¡S dS )z™Dispatches the response by the `Content-Type` header, returning
        suitable reader instance.

        :param dict headers: Response headers
        rN   Ú	multipartN)r“   r   r   ÚtypeÚmultipart_reader_clsr‘   Úpart_reader_clsr�   )r}   r�   rà   rá   r5   r5   r6   r   _  s    	

z MultipartReader._get_part_readerc                 C   sb   t | jt ƒ}|jdks tdƒ‚d|jkr<td| jt  ƒ‚|jd }t|ƒdkr^td| ƒ‚|S )Nr  z!multipart/* content type expectedrŽ   z$boundary missed for Content-Type: %séF   z&boundary %r is too long (70 chars max))r   r�   r   r  r«   rß   Ú
ValueErrorr©   )r}   rá   rŽ   r5   r5   r6   rò   r  s    
ÿ
zMultipartReader._get_boundaryc                 Ã   s    | j r| j  ¡ S | j ¡ I d H S r:   )r—   r_   r‘   rª   r€   r5   r5   r6   Ú	_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¬   r5   r5   r6   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¸   TrC   zInvalid boundary z, expected )r  r»   r�   r’   r—   rw   r¡   r  )r}   r¬   Úepiloguer¾   r5   r5   r6   rý   •  s    
zMultipartReader._read_boundaryc                 Ã   sH   dg}| j  ¡ I d H }| ¡ }| |¡ |sq0qtƒ }| |¡\}}|S )NrŸ   )r‘   rª   ra   rw   r    Zparse_headers)r}   Úlinesr¬   Úparserr�   Zraw_headersr5   r5   r6   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€   r5   r5   r6   rû   ¸  s
    

z(MultipartReader._maybe_release_last_part)!r2   r3   r4   rŒ   rz   r÷   r  r+   r  r
   rX   r(   r~   r   r�   r   r   r‡   Úclassmethodrú   r;   r‰   rƒ   rŠ   rþ   r   rò   rä   r  rü   rý   rÿ   rû   r5   r5   r5   r6   r)     s8   þþýþ

þ	
ýr)   c                       sr  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dœdd„Zeedœdd„Zd+eeee  edœdd „Zd,e e!e"eef  e#eef f eee  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.ÚmixedN)ÚsubtyperŽ   r8   c                    sr   |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 S )NÚasciiz(boundary should contain ASCII only charsz
multipart/z; boundary=)Úcontent_type)ÚuuidZuuid4Úhexró   r�   ÚUnicodeEncodeErrorr  Ú_boundary_valuerê   r~   Ú_parts)r}   r  rŽ   rà   rë   r5   r6   r~   Ç  s    zMultipartWriter.__init__r   c                 C   s   | S r:   r5   r€   r5   r5   r6   Ú	__enter__Ø  s    zMultipartWriter.__enter__)Úexc_typeÚexc_valÚexc_tbr8   c                 C   s   d S r:   r5   )r}   r  r  r  r5   r5   r6   Ú__exit__Û  s    zMultipartWriter.__exit__c                 C   s
   t | jƒS r:   )Úiterr  r€   r5   r5   r6   Ú__iter__ã  s    zMultipartWriter.__iter__c                 C   s
   t | jƒS r:   )r©   r  r€   r5   r5   r6   Ú__len__æ  s    zMultipartWriter.__len__c                 C   s   dS )NTr5   r€   r5   r5   r6   Ú__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 )zyWrap boundary parameter value in quotes, if necessary.

        Reads self.boundary and returns a unicode sting.
        r  z*boundary value contains invalid charactersó   \s   \\ó   "s   \"r@   )	r�   rQ   ÚmatchÚ_valid_tchar_regexrž   ÚsearchÚ_invalid_qdtext_char_regexr  Úreplace)r}   ri   Zquoted_value_contentr5   r5   r6   r  ï  s    
zMultipartWriter._boundary_valuec                 C   s   | j  d¡S )Nr  )r�   rž   r€   r5   r5   r6   rŽ     s    zMultipartWriter.boundary)rù   r�   r8   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   Ú
isinstancer$   r�   ÚupdateÚappend_payloadr&   r"   Ú	TypeError)r}   rù   r�   Úpayloadr5   r5   r6   rw     s    

zMultipartWriter.append)r+  r8   c                 C   s¦   |j  td¡ ¡ }|r,|dkr,td|› �ƒ‚|dkr8d}|j  td¡ ¡ }|dkr`td |¡ƒ‚|dkrld}|j}|dk	r�|s�|s�t|ƒ|j t	< | j
 |||f¡ |S )	z)Adds a new body part to multipart writer.rN   )rË   rÌ   rÎ   rÏ   rÎ   N)rN   rÕ   rÖ   r×   rÚ   r×   )r�   r“   r   r`   rÓ   r   rd   r¥   rX   r   r  rw   )r}   r+  rj   Úte_encodingr¥   r5   r5   r6   r)  "  s.    þþÿ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�   r5   r5   r6   Úappend_jsonB  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   Úlistru   r   r)  r%   )r}   rù   r�   r¤   r5   r5   r6   Úappend_formK  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   NrC   é   )r  r¥   r”   r©   r�   Ú_binary_headers)r}   Útotalr†   rj   r,  r5   r5   r6   r¥   `  s&    ÿþýüûÿ	zMultipartWriter.sizeT)rî   Úclose_boundaryr8   c                 Ã   sÌ   | j D ]¢\}}}| d| j d ¡I dH  | |j¡I dH  |sD|rˆt|ƒ}|rZ| |¡ |rh| |¡ | |¡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.r¸   r¦   Ns   --
)r  rï   r�   r2  ÚMultipartPayloadWriterÚenable_compressionÚenable_encodingÚ	write_eof)r}   rî   r4  r†   rj   r,  Úwr5   r5   r6   rï   t  s    

zMultipartWriter.write)r  N)N)N)N)T)(r2   r3   r4   rŒ   rX   r   r~   r  r   ÚBaseExceptionr   r  r   Ú_Partr  r”   r  r;   r  rQ   Úcompiler"  r$  Úpropertyr  rŽ   r   r   r$   rw   r)  r-  r   r   r   r
   r0  r¥   rï   rñ   r5   r5   rë   r6   r*   Ä  sD   
û

! ÿ 
þ ý
ür*   c                   @   s\   e Zd Zeddœdd„Zeddœdd„Zdeddœd	d
„Zddœdd„Ze	ddœdd„Z
dS )r5  Nrí   c                 C   s   || _ d | _d | _d | _d S r:   )Ú_writerÚ	_encodingÚ	_compressÚ_encoding_buffer)r}   rî   r5   r5   r6   r~   Œ  s    zMultipartPayloadWriter.__init__r¿   c                 C   s*   |dkr|| _ tƒ | _n|dkr&d| _ d S )NrÕ   rÖ   )r?  r    rA  )r}   rj   r5   r5   r6   r7  ’  s
    
z&MultipartPayloadWriter.enable_encodingrË   c                 C   s,   |dkrdt j nt j }t j|d�| _d S )NrÌ   rÍ   )Zwbits)rÐ   rÒ   Úcompressobjr@  )r}   rj   Z	zlib_moder5   r5   r6   r6  ™  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Õ   )r@  Úflushrï   r?  rA  r>  rÕ   Ú	b64encoder  r5   r5   r6   r8  �  s    


z MultipartPayloadWriter.write_eof)r¬   r8   c                 Ã   sÞ   | j d k	r"|r"| j  |¡}|s"d S | jdkr¤| j}|d k	s>t‚| |¡ |rÚtt|ƒdƒ\}}|d |d … ||d d …  }| _|rÚt 	|¡}| j
 |¡I d H  n6| jdkrÈ| j
 t |¡¡I d H  n| j
 |¡I d H  d S )NrÕ   r®   rÖ   )r@  Úcompressr?  rA  r«   r¡   Údivmodr©   rÕ   rD  r>  rï   rÜ   Úb2a_qp)r}   r¬   ÚbufZdivÚmodZ	enc_chunkZb64chunkr5   r5   r6   rï   ¨  s$    


$

zMultipartPayloadWriter.write)rË   )r2   r3   r4   r   r~   rX   r7  r6  r8  rä   rï   r5   r5   r5   r6   r5  ‹  s
   r5  )rn   )HrÕ   rÜ   rÄ   rQ   r  r]   rÐ   Úcollectionsr   Útypesr   Útypingr   r   r   r   r   r	   r
   r   r   r   r   r   Úurllib.parser   r   r   Z	multidictr   r   r   Zhdrsr   r   r   r   r   Zhelpersr   r   r   r   Úhttpr    r+  r!   r"   r#   r$   r%   r&   r'   Zstreamsr(   Ú__all__Zclient_reqrepr0   ÚRuntimeWarningr,   r-   rX   r.   r/   rz   r+   Z	try_firstræ   r)   r;  r*   r5  r5   r5   r5   r6   Ú<module>   sR   8$	þd ÿ
 þ!- z ; H