o
    RÊÆhì~  ã                   @   s4  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$ 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l0m1Z1 ddl2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z; dZ<er¦ddl=m>Z> G dd„ de?ƒZ@G dd„ de?ƒZAdeeB deeeB eeBeBf f fdd„ZC	d*deeBeBf deBdeeB fdd„ZDG dd„ dƒZEG dd „ d ƒZFe9eFe5jGd!�G d"d#„ d#e6ƒƒZHG d$d%„ d%ƒZIee6eBeBf ZJG d&d'„ d'e6ƒZKG d(d)„ d)ƒZLd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é   )ÚZLibCompressorÚZLibDecompressor)ÚCONTENT_DISPOSITIONÚCONTENT_ENCODINGÚCONTENT_LENGTHÚCONTENT_TRANSFER_ENCODINGÚCONTENT_TYPE)ÚCHARÚTOKENÚparse_mimetypeÚreify)ÚHeadersParser)ÚJsonPayloadÚLookupErrorÚOrderÚPayloadÚStringPayloadÚget_payloadÚpayload_type)ÚStreamReader)ÚMultipartReaderÚMultipartWriterÚBodyPartReaderÚBadContentDispositionHeaderÚBadContentDispositionParamÚparse_content_dispositionÚcontent_disposition_filename)ÚClientResponsec                   @   ó   e Zd ZdS )r0   N©Ú__name__Ú
__module__Ú__qualname__© r:   r:   ú^/var/www/html/HyperOracle/crypto_trader/venv/lib/python3.10/site-packages/aiohttp/multipart.pyr0   B   ó    r0   c                   @   r5   )r1   Nr6   r:   r:   r:   r;   r1   F   r<   r1   ÚheaderÚreturnc                    sª  dt dtfdd„‰ dt dtfdd„}dt dtf‡ fdd„}dt dtfd	d
„}dt dtfdd„}d ttjtƒ¡dœdt dt dt fdd„}| sJd i fS |  d¡^}}ˆ |ƒs`t 	t
| ƒ¡ d i fS i }|�rO| d¡}	d|	vryt 	t
| ƒ¡ d i fS |	 dd¡\}
}|
 ¡  ¡ }
| ¡ }|
|v ršt 	t
| ƒ¡ d i fS ˆ |
ƒs¦t 	t|	ƒ¡ qb||
ƒrÄ||ƒr·||dd… ƒ}n’ˆ |ƒsÃt 	t|	ƒ¡ qbn…||
ƒrû||ƒrÚ| dd¡\}}}|pØd}nt 	t|	ƒ¡ qbzt||dƒ}W n^ tyú   t 	t|	ƒ¡ Y qbw d}||ƒ�rd}||dd…  d¡ƒ}n+ˆ |ƒ�rd}n#|�r;|› d|d › �}||ƒ�r;| d¡ ||dd…  d¡ƒ}d}|�rIt 	t
| ƒ¡ d i fS |||
< |se| ¡ |fS )NÚstringr>   c                 S   s   t | ƒo	tt| ƒkS ©N)Úboolr!   Úset©r?   r:   r:   r;   Úis_tokenM   s   z+parse_content_disposition.<locals>.is_tokenc                 S   s    | d | d   kodkS   S )Nr   éÿÿÿÿú"r:   rC   r:   r:   r;   Ú	is_quotedP   s    z,parse_content_disposition.<locals>.is_quotedc                    s   ˆ | ƒo
|   d¡dkS )Nú'é   )ÚcountrC   ©rD   r:   r;   Ú
is_rfc5987S   ó   z-parse_content_disposition.<locals>.is_rfc5987c                 S   s
   |   d¡S )NÚ*)ÚendswithrC   r:   r:   r;   Úis_extended_paramV   ó   
z4parse_content_disposition.<locals>.is_extended_paramc                 S   s@   |   d¡d }|sdS |  d¡r| |d… n| |d … }| ¡ S )NrN   r   FrE   )ÚfindrO   Úisdigit)r?   ÚposÚ	substringr:   r:   r;   Úis_continuous_paramY   s
   "z6parse_content_disposition.<locals>.is_continuous_paramÚ )ÚcharsÚtextrX   c                S   s   t  d|› d�d| ¡S )Nz\\([z])z\1)ÚreÚsub)rY   rX   r:   r:   r;   Úunescape`   rM   z+parse_content_disposition.<locals>.unescapeú;r   ú=r   rE   rH   rI   úutf-8ÚstrictTFz\/)ÚstrrA   ÚjoinÚmaprZ   Úescaper    ÚsplitÚwarningsÚwarnr0   ÚpopÚlowerÚstripÚlstripr1   r   ÚUnicodeDecodeError)r=   rG   rL   rP   rV   r\   ÚdisptypeÚpartsÚparamsÚitemÚkeyÚvalueÚencodingÚ_ÚfailedÚ_valuer:   rK   r;   r2   J   s€   *
þ
þ



Ä>r2   Úfilenamero   Únamec           
         sæ   d| ‰ | sd S ˆ | v r| ˆ  S || v r| | S g }t ‡ fdd„|  ¡ D ƒƒ}t|ƒD ]%\}\}}| dd¡\}}| d¡rD|d d… }|t|ƒkrP| |¡ q+ |sUd S d |¡}d|v rq| dd	¡\}	}}|	pjd
}	t||	dƒS |S )Nz%s*c                 3   s&   � | ]\}}|  ˆ ¡r||fV  qd S r@   )Ú
startswith)Ú.0rq   rr   ©Úname_sufr:   r;   Ú	<genexpr>¹   s   € ÿ
ÿz/content_disposition_filename.<locals>.<genexpr>rN   r   rE   rW   rH   rI   r_   r`   )	ÚsortedÚitemsÚ	enumeratere   rO   ra   Úappendrb   r   )
ro   rx   rn   ÚfnparamsÚnumrq   rr   rt   Útailrs   r:   r{   r;   r3   ­   s4   ÿ

r3   c                   @   sp   e Zd ZdZ						ddd	„Zdd
d„Zded fdd„Zdefdd„Z	de
ed  fdd„Zddd„ZdS )ÚMultipartResponseWrapperzzWrapper around the MultipartReader.

    It takes care about
    underlying connection and close it when it needs in.
    Úrespr4   Ústreamr-   r>   Nc                 C   s   || _ || _d S r@   )r†   r‡   )Úselfr†   r‡   r:   r:   r;   Ú__init__Õ   s   
z!MultipartResponseWrapper.__init__c                 C   ó   | S r@   r:   ©rˆ   r:   r:   r;   Ú	__aiter__Ý   ó   z"MultipartResponseWrapper.__aiter__)r-   r/   c                 Ã   ó    �|   ¡ I d H }|d u rt‚|S r@   ©ÚnextÚStopAsyncIteration©rˆ   Úpartr:   r:   r;   Ú	__anext__à   ó
   €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—   è   ó   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ˆ   rp   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)r†   r4   r‡   r-   r>   N)r>   r…   ©r>   N)r7   r8   r9   Ú__doc__r‰   rŒ   r   r”   rA   r—   r   r�   r™   r:   r:   r:   r;   r…   Î   s$    þý
ü

þ

þ	r…   c                   @   s¸  e Zd ZdZdZdedddeddfd	d
„Zded  fdd„Z	defdd„Z
dee fdd„Zddœdedefdd„Zefdedefdd„Zdedefdd„Zdedefdd„Zdefdd„Zd9dd „Zdd!œd"ee defd#d$„Zdd!œd"ee deeeef  fd%d&„Zdd!œd"ee deeeef  fd'd(„Zdefd)d*„Zd+edefd,d-„Zd+edefd.d/„Zd+edefd0d1„Z d2edefd3d4„Z!e"dee fd5d6„ƒZ#e"dee fd7d8„ƒZ$dS ):r/   z&Multipart reader for single body part.i    ÚboundaryÚheadersúCIMultiDictProxy[str]r–   r>   Nc                 C   s`   || _ || _|| _d| _| j  td ¡}|d urt|ƒ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–   Úlengthr:   r:   r;   r‰     s   
zBodyPartReader.__init__c                 C   rŠ   r@   r:   r‹   r:   r:   r;   rŒ     r�   zBodyPartReader.__aiter__c                 Ã   rŽ   r@   r�   r’   r:   r:   r;   r”     s
   €zBodyPartReader.__anext__c                 Ã   s   �|   ¡ I d H }|sd S |S r@   )Úreadrš   r:   r:   r;   r�     s
   €zBodyPartReader.nextF©Údecoder®   c                Ã   sH   �| j rdS tƒ }| j s| |  | j¡I dH ¡ | j r|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®   Údatar:   r:   r;   r¬      s   €ÿ
zBodyPartReader.readÚsizec                 Ã   s‚   �| j rdS | jr|  |¡I dH }n|  |¡I dH }|  jt|ƒ7  _| j| jkr,d| _ | 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µ   ÚchunkÚclrfr:   r:   r;   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»   r:   r:   r;   r·   F  s
   €z&BodyPartReader._read_chunk_from_lengthc                 Ã   sb  �|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 s=J dƒ‚| jd usDJ ‚| j| }d| j }|rV| |¡}n| |t	dt | jƒt |ƒ ƒ¡}|dkr©t
 ¡ � t
jdtd� | j ||d … ¡ W d   ƒ n1 sŠw   Y  ||kr›| jd |… | _|t | jƒ|… }|s©d	| _| j}|| _|S )
NrI   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—   rR   Úmaxrf   Úcatch_warningsÚfilterwarningsÚDeprecationWarningÚunread_datar¢   )rˆ   rµ   Úfirst_chunkr»   Úwindowr[   ÚidxÚresultr:   r:   r;   r¸   N  s:   €ÿ


 
þz&BodyPartReader._read_chunk_from_streamc                 Ã   s¶   �| j rdS | jr| j ¡ }n| j ¡ I dH }| | j¡r?| d¡}| j}| jd }||ks2||kr=d| _ | j |¡ dS |S | j ¡ I dH }| | j¡rS|dd… }| j |¡ |S )z Reads body part by line by line.r¯   Nr¶   ó   --Téþÿÿÿ)	r¢   r§   Úpopleftr¡   rº   ry   r    Úrstripr�   )rˆ   ÚlineÚsliner�   Úlast_boundaryÚ	next_liner:   r:   r;   rº   p  s(   €

ûzBodyPartReader.readlinec                 Ã   s2   �| j rdS | j s|  | j¡I dH  | j r	dS 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)rs   rs   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ˆ   rs   r´   r:   r:   r;   rY   ”  s   €
zBodyPartReader.textc                Ã   sJ   �| 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   ra   r   ÚjsonÚloadsr®   rÕ   r:   r:   r;   rÖ   œ  s   €zBodyPartReader.jsonc                Ã   sr   �| j dd�I dH }|sg S |dur|}n| jdd�}z	| ¡  |¡}W n ty1   td| ƒ‚w 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_valuesrs   )r¬   rÔ   rÍ   r®   rl   Ú
ValueErrorr   )rˆ   rs   r´   Úreal_encodingÚdecoded_datar:   r:   r;   Úform¤  s"   €ÿýzBodyPartReader.formc                 C   ó   | j S )z<Returns True if the boundary was reached or False otherwise.©r¢   r‹   r:   r:   r;   r—   ¸  ó   zBodyPartReader.at_eofr´   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´   r:   r:   r;   r®   ¼  s
   



zBodyPartReader.decodec                 C   sF   | j  td¡ ¡ }|dkr|S |dv rt|dd� |¡S td|› �ƒ‚)NrW   Úidentity>   ÚgzipÚdeflateT)rs   Úsuppress_deflate_headerúunknown content encoding: )rž   r£   r   ri   r   Údecompress_syncÚRuntimeError©rˆ   r´   rs   r:   r:   r;   rá   È  s   þýzBodyPartReader._decode_contentc                 C   sP   | j  td¡ ¡ }|dkrt |¡S |dkrt |¡S |dv r!|S td 	|¡ƒ‚)NrW   Úbase64úquoted-printable)ÚbinaryÚ8bitÚ7bitú%unknown content transfer encoding: {})
rž   r£   r   ri   rê   Ú	b64decodeÚbinasciiÚa2b_qprè   Úformatré   r:   r:   r;   rà   Ô  s   

ÿz'BodyPartReader._decode_content_transferrÓ   c                 C   s$   | j  td¡}t|ƒ}|j d|¡S )z>Returns charset parameter from Content-Type header or default.rW   Úcharset)rž   r£   r   r"   Ú
parameters)rˆ   rÓ   ÚctypeÚmimetyper:   r:   r;   rÔ   â  s   zBodyPartReader.get_charsetc                 C   ó   t | j t¡ƒ\}}t|dƒS )z|Returns name specified in Content-Disposition header.

        If the header is missing or malformed, returns None.
        rx   ©r2   rž   r£   r   r3   ©rˆ   rt   ro   r:   r:   r;   rx   è  ó   
zBodyPartReader.namec                 C   rø   )zReturns filename specified in Content-Disposition header.

        Returns None if the header is missing or malformed.
        rw   rù   rú   r:   r:   r;   rw   ñ  rû   zBodyPartReader.filenamer›   )%r7   r8   r9   rœ   r³   Úbytesr,   r‰   r   rŒ   r”   r   r�   rA   r¬   r¤   r²   r·   r¸   rº   r™   ra   rY   r   r   rÖ   r
   r   rÜ   r—   r®   rá   rà   rÔ   r#   rx   rw   r:   r:   r:   r;   r/   ý   sB    ÿÿÿ
þ"
((r/   )Úorderc                       s@   e Zd Zdedededdf‡ fdd„Zdeddfd	d
„Z‡  ZS )ÚBodyPartReaderPayloadrr   ÚargsÚkwargsr>   Nc                    sb   t ƒ j|g|¢R i |¤Ž i }|jd ur|j|d< |jd ur#|j|d< |r/| jdi |¤Ž d S d S )Nrx   rw   Ú
attachmentT)r  T)Úsuperr‰   rx   rw   Úset_content_disposition)rˆ   rr   rÿ   r   ro   ©Ú	__class__r:   r;   r‰   ý  s   



ÿzBodyPartReaderPayload.__init__Úwriterc                 Ã   sR   �| j }|jdd�I d H }|r'| | |¡¡I d H  |jdd�I d H }|sd S d S )Ni   )rµ   )rv   r²   Úwriter®   )rˆ   r  Úfieldr»   r:   r:   r;   r  	  s   €þzBodyPartReaderPayload.write)r7   r8   r9   r/   r   r‰   r  Ú__classcell__r:   r:   r  r;   rþ   û  s    rþ   c                   @   s"  e Zd ZdZeZdZeZde	e
e
f deddfdd„Zded fd	d
„Zdeed ef  fdd„Zedddefdd„ƒZdefdd„Zdeed ef  fdd„Zd(dd„Zded ef fdd„Zddded ef fdd„Zde
fdd„Zdefdd„Zd(d d!„Zd(d"d#„Zd)d$d%„Zd(d&d'„Z dS )*r-   zMultipart body reader.Nrž   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–   r:   r:   r;   r‰     s   
zMultipartReader.__init__r/   c                 C   rŠ   r@   r:   r‹   r:   r:   r;   rŒ   %  s   zMultipartReader.__aiter__c                 Ã   rŽ   r@   r�   r’   r:   r:   r;   r”   *  r•   zMultipartReader.__anext__Úresponser4   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  Úobjr:   r:   r;   Úfrom_response2  s   	ÿzMultipartReader.from_responsec                 C   rÝ   )z@Returns True if the final boundary was reached, false otherwise.rÞ   r‹   r:   r:   r;   r—   @  rß   zMultipartReader.at_eofc                 Ã   sd   �| j rdS |  ¡ I dH  | jr|  ¡ I dH  d| _n|  ¡ I dH  | j r'd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‹   r:   r:   r;   r�   D  s   €zMultipartReader.nextc                 Ã   s>   �| j s|  ¡ I dH }|du rdS | ¡ I dH  | j rdS dS )z=Reads all the body parts to the void till the final boundary.N)r¢   r�   r™   rš   r:   r:   r;   r™   V  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Ÿ   c                 C   sX   |  td¡}t|ƒ}|jdkr#| jdu rt| ƒ|| jƒS |  || j¡S |  | j|| j¡S )zšDispatches the response by the `Content-Type` header.

        Returns a suitable reader instance.

        :param dict headers: Response headers
        rW   Ú	multipartN)r£   r   r"   ÚtypeÚmultipart_reader_clsr¡   Úpart_reader_clsr    )rˆ   rž   rö   r÷   r:   r:   r;   r  e  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õ   rÙ   r¹   )rˆ   r÷   r�   r:   r:   r;   r
  y  s   
ÿ
zMultipartReader._get_boundaryc                 Ã   s"   �| j r	| j  ¡ S | j ¡ I d H S r@   )r§   rh   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)NTr¯   z#Could not find starting boundary %rrÊ   )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d S || jd krCd| _|   ¡ I d H }|   ¡ I d H }|d d… dkr9| j |¡ d S | j ||g¡ d S td|›d| j›�ƒ‚)NrÊ   TrI   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                 Ã   sL   �dg}	 | j  ¡ I d H }| ¡ }| |¡ |snqtƒ }| |¡\}}|S )Nr¯   )r¡   rº   rj   r�   r$   Úparse_headers)rˆ   Úlinesr»   Úparserrž   Úraw_headersr:   r:   r;   r  ³  s   €
ûzMultipartReader._read_headersc                 Ã   sD   �| j dur | j  ¡ s| j  ¡ I dH  | j | j j¡ d| _ dS 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_partr›   )r>   rŸ   )!r7   r8   r9   rœ   r…   r  r  r/   r  r   ra   r,   r‰   r   rŒ   r   r   r”   Úclassmethodr  rA   r—   r�   r™   r  r  r
  rü   r  r  r  r  r  r:   r:   r:   r;   r-     sJ    	
þ
þþý
þ


þþ

ý


r-   c                       sŽ  e Zd ZdZd.dedee ddf‡ fdd„Zd/d	d
„Zdeee	  dee	 dee
 ddfdd„Zdee fdd„Zdefdd„Zdefdd„Ze d¡Ze d¡Zedefdd„ƒZedefdd„ƒZd0dedeee  defdd„Zd edefd!d"„Z	d0dedeee  defd#d$„Z	d0de e!e"eef  e#eef f deee  defd%d&„Z$edee fd'd(„ƒZ%d1d*ed+eddfd,d-„Z&‡  Z'S )2r.   zMultipart body writer.ÚmixedNÚsubtyper�   r>   c                    sl   |d ur|nt  ¡ j}z| d¡| _W n ty   tdƒd ‚w 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  r:   r;   r‰   Î  s   
ÿ
zMultipartWriter.__init__c                 C   rŠ   r@   r:   r‹   r:   r:   r;   Ú	__enter__ß  r�   zMultipartWriter.__enter__Úexc_typeÚexc_valÚexc_tbc                 C   s   d S r@   r:   )rˆ   r1  r2  r3  r:   r:   r;   Ú__exit__â  s   zMultipartWriter.__exit__c                 C   ó
   t | jƒS r@   )Úiterr/  r‹   r:   r:   r;   Ú__iter__ê  rQ   zMultipartWriter.__iter__c                 C   r5  r@   )r¹   r/  r‹   r:   r:   r;   Ú__len__í  rQ   zMultipartWriter.__len__c                 C   s   dS )NTr:   r‹   r:   r:   r;   Ú__bool__ð  r�   zMultipartWriter.__bool__s   \A[!#$%&'*+\-.^_`|~\w]+\Zs   [\x00-\x08\x0A-\x1F\x7F]c                 C   s^   | j }t | j|¡r| d¡S t | j|¡rt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   \"rF   )	r    rZ   ÚmatchÚ_valid_tchar_regexr®   ÚsearchÚ_invalid_qdtext_char_regexrÙ   Úreplace)rˆ   rr   Úquoted_value_contentr:   r:   r;   r.  ö  s   
zMultipartWriter._boundary_valuec                 C   s   | j  d¡S )Nr(  )r    r®   r‹   r:   r:   r;   r�     r˜   zMultipartWriter.boundaryr  rž   c                 C   sd   |d u rt ƒ }t|tƒr|j |¡ |  |¡S zt||d�}W n ty,   td| ƒ‚w |  |¡S )N©rž   zCannot create payload from %r)	r   Ú
isinstancer(   rž   ÚupdateÚappend_payloadr*   r&   Ú	TypeError)rˆ   r  rž   Úpayloadr:   r:   r;   r�     s   

ÿ
zMultipartWriter.appendrG  c                 C   s¦   |j  td¡ ¡ }|r|dvrtd|› �ƒ‚|dkrd}|j  td¡ ¡ }|dvr0td |¡ƒ‚|dkr6d}|j}|durH|sH|sHt|ƒ|j t	< | j
 |||f¡ |S )	z)Adds a new body part to multipart writer.rW   )rä   rã   râ   ræ   râ   N)rW   rê   rë   rì   rï   rì   )rž   r£   r   ri   rè   r   ró   rµ   ra   r   r/  r�   )rˆ   rG  rs   Úte_encodingrµ   r:   r:   r;   rE  )  s6   þýþýÿzMultipartWriter.append_payloadc                 C   s    |du rt ƒ }|  t||d�¡S )zHelper to append JSON part.NrB  )r   rE  r%   )rˆ   r  rž   r:   r:   r;   Úappend_jsonI  s   zMultipartWriter.append_jsonc                 C   sV   t |ttfƒs	J ‚|du rtƒ }t |tƒrt| ¡ ƒ}t|dd�}|  t||dd�¡S )z&Helper to append form urlencoded part.NT)Údoseqz!application/x-www-form-urlencoded)rž   r)  )	rC  r   r   r   Úlistr   r   rE  r)   )rˆ   r  rž   r´   r:   r:   r;   Úappend_formR  s   
ÿÿzMultipartWriter.append_formc                 C   sv   d}| j D ](\}}}|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   NrI   é   )r/  rµ   r¤   r¹   r    Ú_binary_headers)rˆ   Útotalr“   rs   rH  r:   r:   r;   rµ   g  s&   ÿþýüûÿ	zMultipartWriter.sizeTr  Úclose_boundaryc                 Ã   sÒ   �| j D ]Q\}}}| d| j d ¡I dH  | |j¡I dH  |s#|rEt|ƒ}|r.| |¡ |r5| |¡ | |¡I dH  | ¡ I dH  n| |¡I dH  | d¡I dH  q|rg| d| j d ¡I dH  dS dS )zWrite body.rÊ   r¶   Ns   --
)r/  r  r    rN  ÚMultipartPayloadWriterÚenable_compressionÚenable_encodingÚ	write_eof)rˆ   r  rP  r“   rs   rH  Úwr:   r:   r;   r  {  s"   €

ÿzMultipartWriter.write)r&  N)r>   r.   r@   )T)(r7   r8   r9   rœ   ra   r   r‰   r0  r   ÚBaseExceptionr   r4  r	   Ú_Partr7  r¤   r8  rA   r9  rZ   Úcompiler=  r?  Úpropertyr.  r�   r   r   r(   r�   rE  rI  r   r   r   r   rL  rµ   r  r	  r:   r:   r  r;   r.   Ë  sV     

þýü
û

 !ÿÿ
ÿ
þýþ
ý
ü r.   c                   @   sj   e Zd Zdeddfdd„Zdeddfdd„Zd	ejfded
e	ddfdd„Z
ddd„Zdeddfdd„ZdS )rQ  r  r>   Nc                 C   s   || _ d | _d | _d | _d S r@   )Ú_writerÚ	_encodingÚ	_compressÚ_encoding_buffer)rˆ   r  r:   r:   r;   r‰   “  s   
zMultipartPayloadWriter.__init__rs   c                 C   s0   |dkr|| _ tƒ | _d S |dkrd| _ d S d S )Nrê   rë   )r[  r°   r]  )rˆ   rs   r:   r:   r;   rS  ™  s   
ÿz&MultipartPayloadWriter.enable_encodingrä   Ústrategyc                 C   s   t |d|d�| _d S )NT)rs   rå   r^  )r   r\  )rˆ   rs   r^  r:   r:   r;   rR     s
   ýz)MultipartPayloadWriter.enable_compressionc                 Ã   sf   �| j d ur| j  ¡ }|rd | _ |  |¡I d H  | jdkr/| jr1| j t | j¡¡I d H  d S d S d S )Nrê   )r\  Úflushr  r[  r]  rZ  rê   Ú	b64encoder  r:   r:   r;   rT  ©  s   €


þz MultipartPayloadWriter.write_eofr»   c                 Ã   sò   �| j d ur|r| j  |¡I d H }|sd S | jdkr[| j}|d us#J ‚| |¡ |rWtt|ƒdƒ\}}|d |d … ||d d … }| _|rYt |¡}| j	 
|¡I d H  d S d S d S | jdkrn| j	 
t |¡¡I d H  d S | j	 
|¡I d H  d S )Nrê   r¾   rë   )r\  Úcompressr[  r]  r±   Údivmodr¹   rê   r`  rZ  r  rñ   Úb2a_qp)rˆ   r»   ÚbufÚdivÚmodÚ	enc_chunkÚb64chunkr:   r:   r;   r  ´  s*   €


$
û
zMultipartPayloadWriter.writer›   )r7   r8   r9   r   r‰   ra   rS  ÚzlibÚZ_DEFAULT_STRATEGYr¤   rR  rT  rü   r  r:   r:   r:   r;   rQ  ’  s    ÿÿÿ
þ
	rQ  )rw   )Mrê   rñ   rÖ   rZ   r*  rf   ri  Úcollectionsr   Útypesr   Útypingr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   Úurllib.parser   r   r   Ú	multidictr   r   r   Úcompression_utilsr   r   Úhdrsr   r   r   r   r   Úhelpersr    r!   r"   r#   Úhttpr$   rG  r%   r&   r'   r(   r)   r*   r+   Ústreamsr,   Ú__all__Úclient_reqrepr4   ÚRuntimeWarningr0   r1   ra   r2   r3   r…   r/   Ú	try_firstrþ   r-   rW  r.   rQ  r:   r:   r:   r;   Ú<module>   s^    @$	ÿ
þdÿ
ÿÿ
þ!/  8 H