a
     ÑOc9~  ã                   @   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 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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6 ddl7m8Z8 dZ9e�r>ddl:m;Z; 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„ZAG dd„ dƒZBG dd„ dƒZCe6eCe2jDd�G dd „ d e3ƒƒZEG d!d"„ d"ƒZFee3e?e?f ZGG d#d$„ d$e3ƒZHG d%d&„ d&ƒZId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Ú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__© r7   r7   úH/var/www/html/gsl.tools/lib/python3.9/site-packages/aiohttp/multipart.pyr.   A   s   r.   c                   @   s   e Zd ZdS )r/   Nr3   r7   r7   r7   r8   r/   E   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|	vrät 	t
| ƒ¡ d i fS |	 dd¡\}
}|
 ¡  ¡ }
| ¡ }|
|v �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�y   t 	t|	ƒ¡ Y q¶Y n0 nœd}||ƒ�r0d}||dd…  d¡ƒ}nVˆ |ƒ�r@d}nF|�r†|› d|d › �}||ƒ�r†| d¡ ||dd…  d¡ƒ}d}|�r¢t 	t
| ƒ¡ d i fS |||
< q¶| ¡ |fS )N)Ústringr:   c                 S   s   t | ƒott| ƒkS ©N)Úboolr   Úset©r;   r7   r7   r8   Úis_tokenL   s    z+parse_content_disposition.<locals>.is_tokenc                 S   s    | d | d   kodkS   S )Nr   éÿÿÿÿú"r7   r?   r7   r7   r8   Ú	is_quotedO   s    z,parse_content_disposition.<locals>.is_quotedc                    s   ˆ | ƒo|   d¡dkS )Nú'é   )Úcountr?   ©r@   r7   r8   Ú
is_rfc5987R   s    z-parse_content_disposition.<locals>.is_rfc5987c                 S   s
   |   d¡S )NÚ*)Úendswithr?   r7   r7   r8   Úis_extended_paramU   s    z4parse_content_disposition.<locals>.is_extended_paramc                 S   s@   |   d¡d }|sdS |  d¡r,| |d… n
| |d … }| ¡ S )NrI   r   FrA   )ÚfindrJ   Úisdigit)r;   ÚposZ	substringr7   r7   r8   Úis_continuous_paramX   s
    "z6parse_content_disposition.<locals>.is_continuous_paramÚ )Úchars)ÚtextrQ   r:   c                S   s   t  d|› d�d| ¡S )Nz\\([z])z\1)ÚreÚsub)rR   rQ   r7   r7   r8   Úunescape_   s    z+parse_content_disposition.<locals>.unescapeú;r   ú=r   rA   rD   rE   úutf-8ÚstrictTFz\/)Ústrr=   ÚjoinÚmaprS   Úescaper   ÚsplitÚwarningsÚwarnr.   ÚpopÚlowerÚstripÚlstripr/   r   ÚUnicodeDecodeError)r9   rC   rH   rK   rO   rU   ZdisptypeÚpartsÚparamsÚitemÚkeyÚvalueÚencodingÚ_ÚfailedÚ_valuer7   rG   r8   r0   I   sz    &












r0   Úfilename)rg   Ú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 q¦qV|s®d S d |¡}d|v ræ| dd	¡\}	}}|	pØd
}	t||	dƒS |S d S )Nz%s*c                 3   s$   | ]\}}|  ˆ ¡r||fV  qd S r<   )Ú
startswith)Ú.0ri   rj   ©Zname_sufr7   r8   Ú	<genexpr>¸   s   z/content_disposition_filename.<locals>.<genexpr>rI   r   rA   rP   rD   rE   rX   rY   )	ÚsortedÚitemsÚ	enumerater^   rJ   rZ   Úappendr[   r   )
rg   rp   rf   ZfnparamsÚnumri   rj   rl   Útailrk   r7   rs   r8   r1   ¬   s4    ÿ

r1   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.
    r2   r+   N)ÚrespÚstreamr:   c                 C   s   || _ || _d S r<   )r|   r}   )Úselfr|   r}   r7   r7   r8   Ú__init__Ô   s    z!MultipartResponseWrapper.__init__©r:   c                 C   s   | S r<   r7   ©r~   r7   r7   r8   Ú	__aiter__Ü   s    z"MultipartResponseWrapper.__aiter__)r+   r-   c                 Ã   s   |   ¡ I d H }|d u rt‚|S r<   ©ÚnextÚStopAsyncIteration©r~   Úpartr7   r7   r8   Ú	__anext__ß   s    z"MultipartResponseWrapper.__anext__c                 C   s   | j j ¡ S )z2Returns True when all response data had been read.)r|   ÚcontentÚat_eofr�   r7   r7   r8   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~   rh   r7   r7   r8   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�   r7   r7   r8   r‹   ô   s    z MultipartResponseWrapper.release)r4   r5   r6   Ú__doc__r   r‚   r   rˆ   r=   rŠ   r   r„   r‹   r7   r7   r7   r8   r{   Í   s   üþ
þ	r{   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‰   r:   c                 C   s`   || _ || _|| _d| _| j  td ¡}|d u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‰   Úlengthr7   r7   r8   r     s    zBodyPartReader.__init__r€   c                 C   s   | S r<   r7   r�   r7   r7   r8   r‚     s    zBodyPartReader.__aiter__c                 Ã   s   |   ¡ I d H }|d u rt‚|S r<   rƒ   r†   r7   r7   r8   rˆ     s    zBodyPartReader.__anext__c                 Ã   s   |   ¡ I d H }|sd S |S r<   )ÚreadrŒ   r7   r7   r8   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 )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Ÿ   Údatar7   r7   r8   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clrfr7   r7   r8   r£   0  s    ÿþzBodyPartReader.read_chunkc                 Ã   s:   | j d usJ dƒ‚t|| j | j ƒ}| j |¡I d H }|S )Nz(Content-Length required for chunked read)r–   Úminr—   r’   r�   )r~   r¦   r¤   r¬   r7   r7   r8   r¨   F  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s†J ‚| 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 )
NrE   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Š   rL   Úmaxr_   Úcatch_warningsÚfilterwarningsÚDeprecationWarningZunread_datar“   )r~   r¦   Zfirst_chunkr¬   ZwindowrT   ÚidxÚresultr7   r7   r8   r©   N  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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«   rq   r‘   Úrstriprx   )r~   ÚlineÚsliner�   Úlast_boundaryÚ	next_liner7   r7   r8   r«   p  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�   r7   r7   r8   r‹   �  s    zBodyPartReader.release)rk   ©rk   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ž   NrX   ©Údefault)r�   Úget_charsetrŸ   ©r~   rk   r¥   r7   r7   r8   rR   ”  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ž   NrX   rÀ   )	r�   rÂ   r   r   rZ   r   ÚjsonÚloadsrŸ   rÃ   r7   r7   r8   rÄ   œ  s
    zBodyPartReader.jsonc                Ã   sL   | j dd�I dH }|sg S |dur(|}n| jdd�}t| ¡  |¡d|d�S )zFLike read(), but assumes that body parts contain form urlencoded data.Trž   NrX   rÀ   )Úkeep_blank_valuesrk   )r�   rÂ   r   rº   rŸ   )r~   rk   r¥   Zreal_encodingr7   r7   r8   Úform¤  s    ýzBodyPartReader.formc                 C   s   | j S )z<Returns True if the boundary was reached or False otherwise.©r“   r�   r7   r7   r8   rŠ   ³  s    zBodyPartReader.at_eof)r¥   r:   c                 C   s,   t | jv r|  |¡}t| jv r(|  |¡S |S )z�Decodes data.

        Decoding is done according the specified Content-Encoding
        or Content-Transfer-Encoding headers value.
        )r   r�   Ú_decode_content_transferr   Ú_decode_content)r~   r¥   r7   r7   r8   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 )NrP   ÚdeflateÚgzipé   Úidentityúunknown content encoding: )r�   r”   r   rb   ÚzlibÚ
decompressÚ	MAX_WBITSÚRuntimeError©r~   r¥   rk   r7   r7   r8   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 )NrP   Úbase64úquoted-printable)ÚbinaryÚ8bitÚ7bitú%unknown content transfer encoding: {})
r�   r”   r   rb   rÕ   Ú	b64decodeÚbinasciiÚa2b_qprÓ   ÚformatrÔ   r7   r7   r8   rÉ   Ï  s    

ÿz'BodyPartReader._decode_content_transfer)rÁ   r:   c                 C   s$   | j  td¡}t|ƒ}|j d|¡S )z>Returns charset parameter from Content-Type header or default.rP   Úcharset)r�   r”   r   r    Ú
parameters)r~   rÁ   ÚctypeÚmimetyper7   r7   r8   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   ©r0   r�   r”   r   r1   ©r~   rl   rg   r7   r7   r8   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ä   r7   r7   r8   ro   ì  s    zBodyPartReader.filename)%r4   r5   r6   r�   r¤   Úbytesr*   r   r   r‚   rˆ   r   r„   r=   r�   r•   r£   r¨   r©   r«   r‹   rZ   rR   r   r   rÄ   r
   r   rÇ   rŠ   rŸ   rÊ   rÉ   rÂ   r!   rp   ro   r7   r7   r7   r8   r-   ü   s4   þ"&&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)rj   Ú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   Zset_content_disposition)r~   rj   rè   ré   rg   ©Ú	__class__r7   r8   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¬   r7   r7   r8   rð     s
    zBodyPartReaderPayload.write)r4   r5   r6   r-   r   r   rð   Ú__classcell__r7   r7   rì   r8   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:   || _ d|  ¡   ¡ | _|| _d | _d| _d| _g | _d S )Nz--FT)	r�   Ú_get_boundaryÚencoder‘   r’   Ú
_last_partr“   Ú_at_bofr˜   )r~   r�   r‰   r7   r7   r8   r     s    zMultipartReader.__init__r-   r€   c                 C   s   | S r<   r7   r�   r7   r7   r8   r‚      s    zMultipartReader.__aiter__c                 Ã   s   |   ¡ I d H }|d u rt‚|S r<   rƒ   r†   r7   r7   r8   rˆ   %  s    zMultipartReader.__anext__r2   )Úresponser:   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÷   Úobjr7   r7   r8   Úfrom_response-  s    	ÿzMultipartReader.from_responsec                 C   s   | j S )z@Returns True if the final boundary was reached, false otherwise.rÈ   r�   r7   r7   r8   rŠ   ;  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�   r7   r7   r8   r„   ?  s    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Œ   r7   r7   r8   r‹   Q  s
    zMultipartReader.releasec                 Ã   s   |   ¡ I dH }|  |¡S )z"Returns the next body part reader.N)Ú_read_headersÚ_get_part_reader)r~   r�   r7   r7   r8   rÿ   Y  s    zMultipartReader.fetch_next_partrŽ   )r�   r:   c                 C   s\   |  td¡}t|ƒ}|jdkrF| jdu r8t| ƒ|| jƒS |  || j¡S |  | j|| j¡S dS )zšDispatches the response by the `Content-Type` header.

        Returns a suitable reader instance.

        :param dict headers: Response headers
        rP   Ú	multipartN)r”   r   r    ÚtypeÚmultipart_reader_clsr’   Úpart_reader_clsr‘   )r~   r�   rá   râ   r7   r7   r8   r  `  s    


z MultipartReader._get_part_readerc                 C   sb   t | jt ƒ}|jdks J dƒ‚d|jv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à   Ú
ValueErrorrª   )r~   râ   r�   r7   r7   r8   ró   t  s    
ÿ
zMultipartReader._get_boundaryc                 Ã   s    | j r| j  ¡ S | j ¡ I d H S r<   )r˜   ra   r’   r«   r�   r7   r7   r8   Ú	_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¬   r7   r7   r8   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·   TrE   zInvalid boundary z, expected )r  rº   r‘   r“   r˜   rx   r¢   r  )r~   r¬   Úepiloguer¾   r7   r7   r8   rþ   —  s    
zMultipartReader._read_boundaryc                 Ã   sH   dg}| j  ¡ I d H }| ¡ }| |¡ |sq0qtƒ }| |¡\}}|S )Nr    )r’   r«   rc   rx   r"   Úparse_headers)r~   Úlinesr¬   Úparserr�   Zraw_headersr7   r7   r8   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�   r7   r7   r8   rü   º  s
    

z(MultipartReader._maybe_release_last_part)!r4   r5   r6   r�   r{   rø   r  r-   r  r   rZ   r*   r   r   r‚   r   r   rˆ   Úclassmethodrû   r=   rŠ   r„   r‹   rÿ   r  ró   rå   r  rý   rþ   r   rü   r7   r7   r7   r8   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�   r:   c                    sp   |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 S )NÚasciiz(boundary should contain ASCII only charsz
multipart/z; boundary=)Úcontent_type)ÚuuidÚuuid4Úhexrô   r‘   ÚUnicodeEncodeErrorr  Ú_boundary_valuerë   r   Ú_parts)r~   r  r�   rá   rì   r7   r8   r   É  s    zMultipartWriter.__init__r€   c                 C   s   | S r<   r7   r�   r7   r7   r8   Ú	__enter__Ú  s    zMultipartWriter.__enter__)Úexc_typeÚexc_valÚexc_tbr:   c                 C   s   d S r<   r7   )r~   r  r  r  r7   r7   r8   Ú__exit__Ý  s    zMultipartWriter.__exit__c                 C   s
   t | jƒS r<   )Úiterr  r�   r7   r7   r8   Ú__iter__å  s    zMultipartWriter.__iter__c                 C   s
   t | jƒS r<   )rª   r  r�   r7   r7   r8   Ú__len__è  s    zMultipartWriter.__len__c                 C   s   dS )NTr7   r�   r7   r7   r8   Ú__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   \"rB   )	r‘   rS   ÚmatchÚ_valid_tchar_regexrŸ   ÚsearchÚ_invalid_qdtext_char_regexr  Úreplace)r~   rj   Zquoted_value_contentr7   r7   r8   r  ñ  s    
zMultipartWriter._boundary_valuec                 C   s   | j  d¡S )Nr  )r‘   rŸ   r�   r7   r7   r8   r�     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   Ú
isinstancer&   r�   ÚupdateÚappend_payloadr(   r$   Ú	TypeError)r~   rú   r�   Úpayloadr7   r7   r8   rx     s    

zMultipartWriter.append)r.  r:   c                 C   s¦   |j  td¡ ¡ }|r,|dvr,td|› �ƒ‚|dkr8d}|j  td¡ ¡ }|dvr`td |¡ƒ‚|dkrld}|j}|dur�|s�|s�t|ƒ|j t	< | j
 |||f¡ |S )	z)Adds a new body part to multipart writer.rP   )rË   rÌ   rÎ   rÏ   rÎ   N)rP   rÕ   rÖ   r×   rÚ   r×   )r�   r”   r   rb   rÓ   r   rÞ   r¦   rZ   r   r  rx   )r~   r.  rk   Úte_encodingr¦   r7   r7   r8   r,  $  s.    þþÿ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�   r7   r7   r8   Úappend_jsonD  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   r,  r'   )r~   rú   r�   r¥   r7   r7   r8   Úappend_formM  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   NrE   é   )r  r¦   r•   rª   r‘   Ú_binary_headers)r~   Útotalr‡   rk   r/  r7   r7   r8   r¦   b  s&    ÿþýüûÿ	zMultipartWriter.sizeT)rï   Úclose_boundaryr:   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‘   r5  ÚMultipartPayloadWriterÚenable_compressionÚenable_encodingÚ	write_eof)r~   rï   r7  r‡   rk   r/  Úwr7   r7   r8   rð   v  s    

zMultipartWriter.write)r  N)N)N)N)T)(r4   r5   r6   r�   rZ   r   r   r  r   ÚBaseExceptionr   r  r	   Ú_Partr  r•   r   r=   r!  rS   Úcompiler%  r'  Úpropertyr  r�   r   r   r&   rx   r,  r0  r   r   r   r   r3  r¦   rð   rò   r7   r7   rì   r8   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 )r8  Nrî   c                 C   s   || _ d | _d | _d | _d S r<   )Ú_writerÚ	_encodingÚ	_compressÚ_encoding_buffer)r~   rï   r7   r7   r8   r   Ž  s    zMultipartPayloadWriter.__init__r¿   c                 C   s*   |dkr|| _ tƒ | _n|dkr&d| _ d S )NrÕ   rÖ   )rB  r¡   rD  )r~   rk   r7   r7   r8   r:  ”  s
    
z&MultipartPayloadWriter.enable_encodingrË   )rk   Ústrategyr:   c                 C   s.   |dkrdt j nt j }t j||d�| _d S )NrÌ   rÍ   )ÚwbitsrE  )rÐ   rÒ   ÚcompressobjrC  )r~   rk   rE  Ú	zlib_moder7   r7   r8   r9  ›  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Õ   )rC  Úflushrð   rB  rD  rA  rÕ   Ú	b64encoder	  r7   r7   r8   r;  ¡  s    


z MultipartPayloadWriter.write_eof)r¬   r:   c                 Ã   sÞ   | j d ur"|r"| j  |¡}|s"d S | jdkr¤| j}|d us>J ‚| |¡ |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Ö   )rC  ÚcompressrB  rD  r¢   Údivmodrª   rÕ   rJ  rA  rð   rÜ   Úb2a_qp)r~   r¬   ÚbufÚdivÚmodZ	enc_chunkZb64chunkr7   r7   r8   rð   ¬  s$    


$

zMultipartPayloadWriter.write)r4   r5   r6   r   r   rZ   r:  rÐ   ÚZ_DEFAULT_STRATEGYr•   r9  r;  rå   rð   r7   r7   r7   r8   r8  �  s   ÿþr8  )ro   )JrÕ   rÜ   rÄ   rS   r  r_   rÐ   Úcollectionsr   Útypesr   Útypingr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   Úurllib.parser   r   r   Z	multidictr   r   r   Úhdrsr   r   r   r   r   Zhelpersr   r   r    r!   Úhttpr"   r.  r#   r$   r%   r&   r'   r(   r)   Zstreamsr*   Ú__all__Zclient_reqrepr2   ÚRuntimeWarningr.   r/   rZ   r0   r1   r{   r-   Z	try_firstrç   r+   r>  r,   r8  r7   r7   r7   r8   Ú<module>   sP   @$	þd ÿþ!/ { 8 H