o
    #`^h                     @   sd  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rd 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ZCdeeD deeeD eeDeDf f fddZE	d/deeDeDf d eDdeeD f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 )0    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                   @      e Zd ZdS )r3   N__name__
__module____qualname__ r=   r=   O/home/air/shanriGPT/back/venv/lib/python3.10/site-packages/aiohttp/multipart.pyr3   I       r3   c                   @   r8   )r4   Nr9   r=   r=   r=   r>   r4   M   r?   r4   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 rt	t
|  d i fS  |
st	t|	 qb||
r||r||dd }n |st	t|	 qbn||
r||r|dd\}}}|pd}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stringrA   c                 S   s   t | o	tt| kS N)boolr   setrB   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=   rF   r=   r=   r>   	is_quotedW   s    z,parse_content_disposition.<locals>.is_quotedc                    s    | o
|  ddkS )N'   )countrF   rG   r=   r>   
is_rfc5987Z      z-parse_content_disposition.<locals>.is_rfc5987c                 S   s
   |  dS )N*)endswithrF   r=   r=   r>   is_extended_param]      
z4parse_content_disposition.<locals>.is_extended_paramc                 S   s@   |  dd }|sdS | dr| |d n| |d  }| S )NrQ   r   FrH   )findrR   isdigit)rB   pos	substringr=   r=   r>   is_continuous_param`   s
   "z6parse_content_disposition.<locals>.is_continuous_param )charstextr[   c                S   s   t d| dd| S )Nz\\([z])z\1)resub)r\   r[   r=   r=   r>   unescapeg   rP   z+parse_content_disposition.<locals>.unescape;r   =r   rH   rK   rL   utf-8strictTFz\/)strrD   joinmapr]   escaper   splitwarningswarnr3   poplowerstriplstripr4   r   UnicodeDecodeError)r@   rJ   rO   rS   rY   r_   disptypepartsparamsitemkeyvalueencoding_failed_valuer=   rN   r>   r5   Q   s   *





>r5   filenamerr   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 rC   )
startswith).0rt   ru   name_sufr=   r>   	<genexpr>   s    
z/content_disposition_filename.<locals>.<genexpr>rQ   r   rH   rZ   rK   rL   rb   rc   )	sorteditems	enumeraterh   rR   rd   appendre   r   )
rr   r{   rq   fnparamsnumrt   ru   rw   tailrv   r=   r~   r>   r6      s4   

r6   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.
    respr7   streamr1   rA   Nc                 C   s   || _ || _d S rC   )r   r   )selfr   r   r=   r=   r>   __init__   s   
z!MultipartResponseWrapper.__init__c                 C      | S rC   r=   r   r=   r=   r>   	__aiter__      z"MultipartResponseWrapper.__aiter__)r1   r/   c                        |   I d H }|d u rt|S rC   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   rs   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   r7   r   r1   rA   N)rA   r   rA   N)r:   r;   r<   __doc__r   r   r   r   rD   r   r   r   r   r=   r=   r=   r>   r      s$    




	r   c                   @   s  e Zd ZdZdZddddeddd	ed
edee ddfddZ	de
de
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d>d$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d0edefd1d2Zd0edefd3d4Zd0edefd5d6Z d7edefd8d9Z!e"dee fd:d;Z#e"dee fd<d=Z$dS )?r/   z&Multipart reader for single body part.i    mixedNsubtypedefault_charsetboundaryheadersCIMultiDictProxy[str]r   r   r   rA   c                C   s   || _ || _t|d | _|| _|| _d| _|dk| _| jr d n| j t	d }|d ur/t
|nd | _d| _t | _d | _d| _i | _d S )NrL   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   c                 C   r   rC   r=   r   r=   r=   r>   r   "  r   zBodyPartReader.__aiter__c                    r   rC   r   r   r=   r=   r>   r   %  s
   zBodyPartReader.__anext__c                    s   |   I d H }|sd S |S rC   )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 )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sizec           	         sf  | j rdS | jr| |I dH }n| |I dH }| jt}|r| dkrd|	 }t
|d }|dkr|  sd| }d}| jrW| jd| }| jt
|d | _t
||krl|| jdt
| I dH 7 }|sqd| _ |d|	 7 }||7 }t
|d }|dkr|  r=|  jt
|7  _| j| jkrd| _ | j r| j I dH }d|ksJ 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   rl   re   rh   r   r   r   r   r   r   readline)	r   r   chunkrv   stripped_chunk	remainderover_chunk_size
over_chunkclrfr=   r=   r>   r   A  sB   
zBodyPartReader.read_chunkc                    sL   | j d us
J dt|| j | j }| j|I d H }| j r$d| _|S )Nz(Content-Length required for chunked readT)r   minr   r   r   r   r   )r   r   r   r   r=   r=   r>   r   p  s   
z&BodyPartReader._read_chunk_from_lengthc                    s  || j ks
J d| jd u }|r| j|I d H | _d}t|| j k rO|| j|I d H 7 }|  jt| j 7  _| jdk sDJ d| jrHnt|| j k s$t||kre| j||d   |d | }| jd uslJ | j| }d| j	 }|r~|
|}n|
|tdt| jt| }|dkrt  tjdtd | j||d   W d    n1 sw   Y  ||kr| jd | | _|t| j| }|sd	| _| j}|| _|S )
Nz<Chunk size must be greater or equal than boundary length + 2r   r+   zReading after EOFr   r   ignore)categoryT)r   r   r   r   r   r   r   r   unread_datar   rU   maxri   catch_warningsfilterwarningsDeprecationWarningr   )r   r   first_chunkr   windowr^   idxresultr=   r=   r>   r   z  sJ   


 
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   r|   r   rstripr   )r   linesliner   last_boundary	next_liner=   r=   r>   r     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)rv   rv   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   Nrb   default)r   get_charsetr   r   rv   r   r=   r=   r>   r\     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   Nrb   r   )	r   r   r   r   rd   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   Nrb   r   z'data cannot be decoded with %s encoding)keep_blank_valuesrv   )r   r   r   r   ro   
ValueErrorr   )r   rv   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   s2   t | jv r
| |}| jst| jv r| |S |S )zDecodes data.

        Decoding is done according the specified Content-Encoding
        or Content-Transfer-Encoding headers value.
        )r   r   _decode_content_transferr   r   _decode_content)r   r   r=   r=   r>   r     s
   


zBodyPartReader.decodec                 C   sF   | j td }|dkr|S |dv rt|dd|S td| )NrZ   identity>   gzipdeflateT)rv   suppress_deflate_headerunknown content encoding: )r   r   r   rl   r   decompress_syncRuntimeErrorr   r   rv   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	|)NrZ   r   quoted-printable)binary8bit7bitz%unknown content transfer encoding: {})
r   r   r   rl   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| jp|S )z>Returns charset parameter from Content-Type header or default.rZ   charset)r   r   r   r    
parametersr   )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.
        r{   r5   r   r   r   r6   r   rw   rr   r=   r=   r>   r{        
zBodyPartReader.namec                 C   r  )zReturns filename specified in Content-Disposition header.

        Returns None if the header is missing or malformed.
        rz   r  r  r=   r=   r>   rz   (  r	  zBodyPartReader.filenamer   )%r:   r;   r<   r   r   bytesr*   rd   r   r   r-   r   r   r   rD   r   r   r   r   r   r   r   r\   r   r   r   r	   r   r   r   r   r   r   r   r!   r{   rz   r=   r=   r=   r>   r/     sN    
/
,
(()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 )BodyPartReaderPayloadru   argskwargsrA   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 )Nr{   rz   
attachmentT)r  T)superr   r{   rz   set_content_disposition)r   ru   r  r  rr   	__class__r=   r>   r   4  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   )ry   r   writer   )r   r  fieldr   r=   r=   r>   r  @  s   zBodyPartReaderPayload.write)r:   r;   r<   r/   r   r   r  __classcell__r=   r=   r  r>   r  2  s    r  c                   @   s4  e Zd ZU dZeZdZeed   e	d< e
Zdeeef deddfddZd	ede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 )+r1   zMultipart body reader.Nmultipart_reader_clsr   r   rA   c                 C   s~   t |t | _| jjdksJ dd| jjvrtd|t  || _d|    | _	|| _
d | _d | _d| _d| _g | _d S )N	multipartz!multipart/* content type expectedr   z$boundary missed for Content-Type: %sz--FT)r    r   	_mimetypetyper  r   r   _get_boundaryencoder   r   r   
_last_partr   _at_bofr   )r   r   r   r=   r=   r>   r   S  s   

zMultipartReader.__init__r   c                 C   r   rC   r=   r   r=   r=   r>   r   d  r   zMultipartReader.__aiter__c                    r   rC   r   r   r=   r=   r>   r   g  r   zMultipartReader.__anext__responser7   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_responseo  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                    s   | 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du ro| jjdkrot	|t
rot|jt\}}|ddkro|dI dH }t|dkratd|  | _|  I dH }|| _| jS )	z#Emits the next multipart body part.NFr   r{   	_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   rm   r   r   )r   r   rw   rr   r  r=   r=   r>   r     s0   
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     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   sd   | td}t|}|jdkr#| jdu rt| || jS | || jS | j| j|| j| jj	| j
dS )zDispatches the response by the `Content-Type` header.

        Returns a suitable reader instance.

        :param dict headers: Response headers
        rZ   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 rC   )r   rk   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   )r1  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   TrL   zInvalid boundary z, expected )r1  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   rm   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   )rA   r   )#r:   r;   r<   r   r   r!  r  r   r   __annotations__r/   r/  r
   rd   r*   r   r-   r   r   r   classmethodr$  rD   r   r   r   r+  r.  r  r
  r1  r)  r*  r-  r(  r=   r=   r=   r>   r1   H  sF   
 


#






r1   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ef  defddZd edefd!d"Z	d0dedeeeef  defd#d$Z	d0de e!e"eef  eeef f deeeef  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 )2r2   zMultipart body writer.r   Nr   r   rA   c                    sv   |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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__c                 C   r   rC   r=   r   r=   r=   r>   	__enter__+  r   zMultipartWriter.__enter__exc_typeexc_valexc_tbc                 C   s   d S rC   r=   )r   rC  rD  rE  r=   r=   r>   __exit__.  s   zMultipartWriter.__exit__c                 C   
   t | jS rC   )iterrA  r   r=   r=   r>   __iter__6  rT   zMultipartWriter.__iter__c                 C   rG  rC   )r   rA  r   r=   r=   r>   __len__9  rT   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   \"rI   )	r   r]   match_valid_tchar_regexr   search_invalid_qdtext_char_regexr   replace)r   ru   quoted_value_contentr=   r=   r>   r@  B  s   
zMultipartWriter._boundary_valuec                 C   s   | j dS )Nr:  )r   r   r   r=   r=   r>   r   b  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   r,  r&   r   updateappend_payloadr(   r$   	TypeError)r   r#  r   payloadr=   r=   r>   r   f  s   


zMultipartWriter.appendrX  c                 C   s   d}d}| j r(ttth|j @ rJ t|jvr'dt| j }|j	d|d nH|j
td }|r>|dvr>td| |dkrDd}|j
td }|d	vrXtd
| |dkr^d}|j}|durp|sp|spt||jt< | j|||f |S )z)Adds a new body part to multipart writer.Nzsection-r   )r{   rZ   )r   r   r   r   r   )rZ   r   r   r   z#unknown content transfer encoding: r   )r   r   r   r   r   keysr   r   rA  r  r   rl   r   r   rd   r   )r   rX  rv   te_encodingr{   r   r=   r=   r>   rV  u  s4   
zMultipartWriter.append_payloadc                 C   s    |du rt  }| t||dS )zHelper to append JSON part.NrT  )r   rV  r#   )r   r#  r   r=   r=   r>   append_json  s   zMultipartWriter.append_jsonc                 C   sV   t |ttfs	J |du rt }t |t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;  )	r,  r   r
   r   listr   r   rV  r'   )r   r#  r   r   r=   r=   r>   append_form  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   NrL   r   )rA  r   r   r   r   _binary_headers)r   totalr   rv   rZ  r=   r=   r>   r     s&   	zMultipartWriter.sizeTr  close_boundaryc                    s   | j D ]d\}}}| jrt|jv sJ d|jt v sJ |d| j d I dH  ||jI dH  |s6|rXt|}|rA|| |rH|	| ||I dH  |
 I dH  n||I dH  |dI dH  q|rz|d| j d I dH  dS dS )zWrite body.zname=r   r   Ns   --
)rA  r   r   r   r  r   r_  MultipartPayloadWriterenable_compressionenable_encoding	write_eof)r   r  ra  r   rv   rZ  wr=   r=   r>   r    s(   

zMultipartWriter.write)r   N)rA   r2   rC   )T)'r:   r;   r<   r   rd   r   r   rB  r   BaseExceptionr   rF  r   _PartrI  r   rJ  rD   rK  r]   compilerO  rQ  propertyr@  r   r   r
   r&   r   rV  r[  r   r   r   r^  r   r  r  r=   r=   r  r>   r2     sV     




$'

 r2   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 )rb  r  rA   Nc                 C   s   || _ d | _d | _d | _d S rC   )_writer	_encoding	_compress_encoding_buffer)r   r  r=   r=   r>   r     s   
zMultipartPayloadWriter.__init__rv   c                 C   s0   |dkr|| _ t | _d S |dkrd| _ d S d S )Nr   r   )rl  r   rn  )r   rv   r=   r=   r>   rd    s   
z&MultipartPayloadWriter.enable_encodingr   strategyc                 C   s   t |d|d| _d S )NT)rv   r   ro  )r   rm  )r   rv   ro  r=   r=   r>   rc    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   )rm  flushr  rl  rn  rk  r   	b64encoder2  r=   r=   r>   re     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   )rm  compressrl  rn  r   divmodr   r   rq  rk  r  r   b2a_qp)r   r   bufdivmod	enc_chunkb64chunkr=   r=   r>   r    s*   


$

zMultipartPayloadWriter.writer   )r:   r;   r<   r   r   rd   rd  zlibZ_DEFAULT_STRATEGYr   rc  re  r
  r  r=   r=   r=   r>   rb    s    

	rb  )rz   )Or   r   r   r]   sysr<  ri   rz  collectionsr   typesr   typingr   r   r   r   r   r	   r
   r   r   r   r   r   r   urllib.parser   r   r   	multidictr   r   compression_utilsr   r   hdrsr   r   r   r   r   helpersr   r   r    r!   httpr"   rX  r#   r$   r%   r&   r'   r(   r)   streamsr*   version_infor-   r.   __all__client_reqrepr7   RuntimeWarningr3   r4   rd   r5   r6   r   r/   	try_firstr  r1   rh  r2   rb  r=   r=   r=   r>   <module>   sj    <$	

d

!/  0 L T