
    F/j                     8   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
mZmZmZ d dlmZ d dl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 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,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z; ddl<m=Z= ej|                  dk\  rd dlm?Z? n
 edd      Z?ej|                  dk\  rd dl	m@Z@ n	eeAeBddf   Z@ ede@      ZCdZDerddlEmFZF  G d deG      ZH G d  d!eG      ZId"eJdz  d#eKeJdz  eLeJeJf   f   fd$ZM	 d4d%eeJeJf   d&eJd#eJdz  fd'ZN G d( d)      ZO G d* d      ZP e;ePe7j                  +       G d, d-e8             ZR G d. d/      ZSeKe8eJeJf   ZT G d0 d1e8      ZU G d2 d3      ZVy)5    N)deque)AsyncIteratorIteratorMappingSequence)TracebackType)TYPE_CHECKINGAnyTypeVarUnioncast)	parse_qslunquote	urlencode)CIMultiDictCIMultiDictProxy   )AbstractStreamWriter)ZLibCompressorZLibDecompressor)CONTENT_DISPOSITIONCONTENT_ENCODINGCONTENT_LENGTHCONTENT_TRANSFER_ENCODINGCONTENT_TYPE)CHARDEFAULT_CHUNK_SIZETOKENparse_mimetypereify)HeadersParser)BadHttpMessage)internal_logger)JsonPayloadLookupErrorOrderPayloadStringPayloadget_payloadpayload_type)StreamReader)      )Selfr.   BodyPartReader)bound)r,      )Bufferzmemoryview[int]zmemoryview[bytes]_Buffer)MultipartReaderMultipartWriterr/   BadContentDispositionHeaderBadContentDispositionParamparse_content_dispositioncontent_disposition_filename)ClientResponsec                       e Zd Zy)r6   N__name__
__module____qualname__     O/var/www/html/maxservice/venv/lib/python3.12/site-packages/aiohttp/multipart.pyr6   r6   C       rA   r6   c                       e Zd Zy)r7   Nr<   r@   rA   rB   r7   r7   G   rC   rA   r7   headerreturnc                    dt         dt        fddt         dt        fd}dt         dt        ffd}dt         dt        fd}dt         dt        fd}dj                  t        t        j
                  t                    d	d
t         dt         dt         fd}| sd i fS | j                  d      ^}} |      s"t        j                  t        |              d i fS i }|r*|j                  d      }	|	st        j                  t        |              5d|	vr"t        j                  t        |              d i fS |	j                  dd      \  }
}|
j                         j                         }
|j                         }|
|v r"t        j                  t        |              d i fS  |
      st        j                  t        |	              ||
      r> ||      r ||dd       }n |      st        j                  t        |	             1 ||
      rT ||      r|j                  dd      \  }}}|xs d}n t        j                  t        |	             ~	 t!        ||d      }nd} ||      rd} ||dd j                  d            }nL |      rd}nA|r?| d|d    } ||      r-|j                  d        ||dd j                  d            }d}|r"t        j                  t        |              d i fS |||
<   |r*|j                         |fS # t"        $ r" t        j                  t        |	             Y iw xY w)NstringrF   c                 @    t        |       xr t        t        |       k\  S N)boolr   setrH   s    rB   is_tokenz+parse_content_disposition.<locals>.is_tokenN   s    F|4V 44rA   c                 .    | d   | d   cxk(  xr dk(  S c S )Nr   "r@   rM   s    rB   	is_quotedz,parse_content_disposition.<locals>.is_quotedQ   s     ayF2J-#----rA   c                 @     |       xr | j                  d      dk(  S )N'   )count)rH   rN   s    rB   
is_rfc5987z-parse_content_disposition.<locals>.is_rfc5987T   s!    :FLL$5$::rA   c                 $    | j                  d      S )N*)endswithrM   s    rB   is_extended_paramz4parse_content_disposition.<locals>.is_extended_paramW   s    s##rA   c                     | j                  d      dz   }|sy| j                  d      r| |d n| |d  }|j                         S )NrY   r   FrP   )findrZ   isdigit)rH   pos	substrings      rB   is_continuous_paramz6parse_content_disposition.<locals>.is_continuous_paramZ   sH    kk#"&,ooc&:F3rNst	  ""rA    )charstextrc   c                8    t        j                  d| dd|       S )Nz\\([z])z\1)resub)rd   rc   s     rB   unescapez+parse_content_disposition.<locals>.unescapea   s    vvugR(%66rA   ;r   =r   rP   rT   rU   utf-8strictTFz\/)strrK   joinmaprf   escaper   splitwarningswarnr6   poplowerstriplstripr7   r   UnicodeDecodeError)rE   rR   rW   r[   ra   rh   disptypepartsparamsitemkeyvalueencoding_failed_valuerN   s                   @rB   r8   r8   K   s   5 5 5.# .$ .;3 ;4 ;$# $$ $#C #D # -/GGC		44H,I 7s 7c 7c 7 Rx||C(HuH1&9:RxF
yy|MM5f=>d?MM5f=>8OZZQ'
Uiik!&=MM5f=>8O}MM4T:; % q-e_8>?s#% %*[[a%8"!U#.w8>?x: F q!3!3E!:;% "7!E!H:.V$IIaL$VAb\%8%8%?@E"F9&ABRxsA D >>V##5 & 8>?s   L 'MMr{   namec                   
 d|z  
| sy 
| v r| 
   S || v r| |   S g }t        
fd| j                         D              }t        |      D ]T  \  }\  }}|j                  dd      \  }}|j	                  d      r|d d }|t        |      k(  r|j                  |       T n |sy dj                  |      }d|v r)|j                  dd      \  }	}}|	xs d	}	t        ||	d
      S |S )Nz%s*c              3   P   K   | ]  \  }}|j                        s||f  y wrJ   )
startswith).0r}   r~   name_sufs      rB   	<genexpr>z/content_disposition_filename.<locals>.<genexpr>   s)      
'S%S^^H=US%L
s   &	&rY   r   rP   rb   rT   rU   rk   rl   )	sorteditems	enumeraterq   rZ   rm   appendrn   r   )r{   r   rz   fnparamsnumr}   r~   r   tailr   r   s             @rB   r9   r9      s    t|H	V	h	d| 
+1<<>
 
 "+8!4 	C#uiiQ'GAt}}S!CRys3xU#	 %<!&S!!4Ha*7H5(H55rA   c                   j    e Zd ZdZ	 	 	 	 	 	 ddZddZded   fdZdefdZ	ded   dz  fd	Z
dd
Zy)MultipartResponseWrapperzzWrapper around the MultipartReader.

    It takes care about
    underlying connection and close it when it needs in.
    rF   Nc                      || _         || _        y rJ   )respstream)selfr   r   s      rB   __init__z!MultipartResponseWrapper.__init__   s    
 	rA   c                     | S rJ   r@   r   s    rB   	__aiter__z"MultipartResponseWrapper.__aiter__       rA   )r4   r/   c                 R   K   | j                          d {   }|t        |S 7 wrJ   nextStopAsyncIterationr   parts     rB   	__anext__z"MultipartResponseWrapper.__anext__   +      YY[ <$$ !   '%'c                 J    | j                   j                  j                         S )z2Returns True when all response data had been read.)r   contentat_eofr   s    rB   r   zMultipartResponseWrapper.at_eof   s    yy  ''))rA   c                    K   | j                   j                          d{   }| j                   j                         r| j                          d{    |S 7 87 w)z#Emits next multipart reader object.N)r   r   r   releaser   r|   s     rB   r   zMultipartResponseWrapper.next   sJ      [[%%'';;,,.   ( s!   AA1AAAAc                 T   K   | j                   j                          d{    y7 w)z_Release the connection gracefully.

        All remaining content is read to the void.
        N)r   r   r   s    rB   r   z MultipartResponseWrapper.release   s     
 ii!!!s   (&()r   r:   r   r4   rF   N)rF   r   rF   N)r=   r>   r?   __doc__r   r   r   r   rK   r   r   r   r@   rA   rB   r   r      si     " 
		2	3* *	2	3d	:"rA   r   c                   ^   e Zd ZdZdZddeej                  edde	ddd	e
d
ededz  dededee   ddfdZdedefdZde	fdZde	dz  fdZdddede	fdZefdede	fdZdede	fdZdede	fdZde	fdZd1dZddd edz  defd!Zddd edz  deeef   dz  fd"Zddd edz  dee eef      fd#Z!defd$Z"d%e#de#e	z  fd&Z$defd'Z%d%e#de#e	z  fd(Z&d%e#de'e#e	z     fd)Z(d%e#de#e	z  fd*Z)d%e#de'e#e	z     fd+Z*d%e#de#e	z  fd,Z+d-edefd.Z,e-dedz  fd/       Z.e-dedz  fd0       Z/y)2r/   z&Multipart reader for single body part.i    mixedN)subtypedefault_charsetmax_decompress_sizeclient_max_sizemax_size_error_clsboundaryheadersCIMultiDictProxy[str]r   r   r   r   r   r   rF   c                   || _         || _        t        |      dz   | _        || _        || _        d| _        |dk(  | _        | j                  rd n| j                   j                  t        d       }	|	t        |	      nd | _        d| _        t               | _        d | _        d| _        i | _        || _        || _        || _        y )NrU   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_max_decompress_size_client_max_size_max_size_error_cls)
r   r   r   r   r   r   r   r   r   lengths
             rB   r   zBodyPartReader.__init__  s     ! ]Q. /$3++1A1A.RV1W&,&8s6{d%*W)-&($7! /#5 rA   r   c                     | S rJ   r@   r   s    rB   r   zBodyPartReader.__aiter__&  r   rA   c                 R   K   | j                          d {   }|t        |S 7 wrJ   r   r   s     rB   r   zBodyPartReader.__anext__)  s)     YY[ <$$ !r   c                 H   K   | j                          d {   }|sy |S 7 	wrJ   )readr   s     rB   r   zBodyPartReader.next/  s$     YY[  !s   " 
"Fdecoder   c                  K   | j                   ryt               }| j                   sr|j                  | j                  | j                         d{          t        |      | j                  kD  r| j                  | j                        | j                   sr|rit               }| j                  |      2 3 d{   }|j                  |       t        |      | j                  kD  s3| j                  | j                        |S 7 7 M6 |S w)zReads body part data.

        decode: Decodes data following by encoding
                method from Content-Encoding header. If it missed
                data remains untouched
        rA   N)	r   	bytearrayextend
read_chunk
chunk_sizer   r   r   decode_iter)r   r   datadecoded_datads        rB   r   zBodyPartReader.read5  s      <<{,,KKdoodoo>>?4y4000..t/D/DEE ,, $;L++D1 J Ja##A&|$t'<'<<2243H3HII ?
J1  sC   ADDADD5D	9D:D	=*D(DD		Dsizec                 D  K   | j                   ry| j                  r| j                  |       d{   }n| j                  |       d{   }| j                  j                  t              }|r)|j                         dk(  rdj                  |j                               }t        |      dz  }|dk7  r| j                         sd|z
  }d}| j                  r,| j                  d| }| j                  t        |      d | _        t        |      |k7  r2|| j                  j                  dt        |      z
         d{   z  }|sd| _         |dj                  |j                               z  }||z  }t        |      dz  }|dk7  r| j                         s| xj                  t        |      z  c_        | j                  | j                  k(  rd| _         | j                   r0| j                  j!                          d{   dk7  rt#        d      |S 7 7 7 7 w)	zWReads body part content chunk of the specified size.

        size: chunk size
        rA   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   ru   rn   rq   r   r   r   r   r   r   readline
ValueError)r   r   chunkr   stripped_chunk	remainderover_chunk_size
over_chunks           rB   r   zBodyPartReader.read_chunkL  s    
 <<<<66t<<E66t<<E <<##$=>(H4 XXekkm4NN+a/Iq."#i- 
##!%!1!12B?!CJ'+'7'7J8I'JD$z?o5(:(:1s:;N(O"OOJ!#'DL#((:+;+;+=">>#/!3	! q.$ 	CJ&t||+DL<<$--"8"8"::gERSSE =<$ #P ;sN   .H HH 
HC4H ?H AH A'H HH H H H c                   K   | j                   J d       t        || j                   | j                  z
        }| j                  j	                  |       d {   }| j                  j                         rd| _        |S 7 'w)Nz(Content-Length required for chunked readT)r   minr   r   r   r   r   )r   r   r   r   s       rB   r   z&BodyPartReader._read_chunk_from_lengthx  sq      ||'S)SS't||d.>.>>?
mm((44==!DL 5s   ABA?(Bc           
        K   || j                   k\  sJ d       | j                  d u }|r+d| j                  j                  |       d {   z   | _        d}t	        |      | j                   k  r|| j                  j                  |       d {   z  }| xj
                  t        | j                  j                               z  c_        | j
                  dkD  rt        d      | j
                  rnt	        |      | j                   k  rt	        |      |kD  r#| j                  j                  ||d         |d | }| j                  J | j                  |z   }d| j                  z   }|r|j                  |      }n;|j                  |t        dt	        | j                        t	        |      z
              }|dk\  rt        j                         5  t        j                  dt                | j                  j                  ||d         d d d        | j                  d | | _        |t	        | j                        | }|sd	| _        | j                  |rdndd  }|| _        |S 7 7 # 1 sw Y   `xY ww)
Nz<Chunk size must be greater or equal than boundary length + 2r   rA   rU   zReading after EOFr   ignore)categoryT)r   r   r   r   r   r   r   r   r   unread_datar   r]   maxrr   catch_warningsfilterwarningsDeprecationWarningr   )r   r   first_chunkr   windowrg   idxresults           rB   r   z&BodyPartReader._read_chunk_from_stream  sC     D&&&	JI	J&&&$.&t}}/A/A$/G)GGD %j4---4==--d333ET]]%9%9%;!<<  1$ !455   %j4--- u:MM%%eDEl3%4LE+++!!E)&++c"C++c3q#d.>.>*?#c(*J#KLC!8((* 8'';MN))&,78  $//5D3t//037E#!!{!";< E *H 4&8 8sF   AI4I"	AI4I%A;I4
CI4:I(	AI4%I4(I1-I4c                 h  K   | j                   ry| j                  r| j                  j                         }n"| j                  j	                          d{   }|j                  | j                        r[|j                  d      }| j                  }| j                  dz   }||k(  s||k(  r#d| _         | j                  j                  |       y|S | j                  j	                          d{   }|j                  | j                        r|dd }| j                  j                  |       |S 7 7 Cw)z Reads body part by line by line.rA   Nr      --T)	r   r   popleftr   r   r   r   rstripr   )r   linesliner   last_boundary	next_lines         rB   r   zBodyPartReader.readline  s     <<<<<<'')D//11D??4>>* KK(E~~H NNU2M E]$:###D)  #mm4466I##DNN3CRyLL	*' 2 7s&   AD2D.BD2,D0-AD20D2c                    K   | j                   ry| j                   s1| j                  | j                         d{    | j                   s0yy7 w)z0Like read(), but reads all the data to the void.N)r   r   r   r   s    rB   r   zBodyPartReader.release  s9     <<,,//$//222 ,,2s   8AAAA)r   r   c                   K   | j                  d       d{   }|xs | j                  d      }|j                  |      S 7 +w)z;Like read(), but assumes that body part contains text data.Tr   Nrk   default)r   get_charsetr   r   r   r   s      rB   rd   zBodyPartReader.text  sG     YYdY++ @t///@{{8$$	 ,s   AA,Ac                   K   | j                  d       d{   }|sy|xs | j                  d      }t        t        t        t
        f   t        j                  |j                  |                  S 7 \w)z<Like read(), but assumes that body parts contains JSON data.Tr   Nrk   r  )	r   r  r   dictrm   r
   jsonloadsr   r  s      rB   r	  zBodyPartReader.json  sc     YYdY++@t///@DcNDJJt{{8/D$EFF	 ,s   A7A5AA7c                
  K   | j                  d       d{   }|sg S ||}n| j                  d      }	 |j                         j                  |      }t        |d|      S 7 M# t        $ r t        d|z        w xY ww)zFLike read(), but assumes that body parts contain form urlencoded data.Tr   Nrk   r  z'data cannot be decoded with %s encoding)keep_blank_valuesr   )r   r  r   r   rx   r   r   )r   r   r   real_encodingr   s        rB   formzBodyPartReader.form  s     YYdY++I$M ,,W,=M	X;;=//>L ""
 	
 , " 	XFVWW	Xs&   BA&BA( B(B  Bc                     | j                   S )z<Returns True if the boundary was reached or False otherwise.r   r   s    rB   r   zBodyPartReader.at_eof      ||rA   r   c                 L    t         | j                  v r| j                  |      S |S )z>Apply Content-Transfer-Encoding decoding if header is present.)r   r   _decode_content_transfer)r   r   s     rB    _apply_content_transfer_decodingz/BodyPartReader._apply_content_transfer_decoding  s$    $40066rA   c                 D    | j                    xr t        | j                  v S )z5Check if Content-Encoding decoding should be applied.)r   r   r   r   s    rB   _needs_content_decodingz&BodyPartReader._needs_content_decoding  s"     %%%J*:dll*JJrA   c                 j    | j                  |      }| j                         r| j                  |      S |S )a  Decodes data synchronously.

        Decodes data according the specified Content-Encoding
        or Content-Transfer-Encoding headers value.

        Note: For large payloads, consider using decode_iter() instead
        to avoid blocking the event loop during decompression.
        )r  r  _decode_content)r   r   decodeds      rB   r   zBodyPartReader.decode  s6     77='')''00rA   c                   K   | j                  |      }| j                         r | j                  |      2 3 d{   }| | y7 6 yw)a$  Async generator that yields decoded data chunks.

        Decodes data according the specified Content-Encoding
        or Content-Transfer-Encoding headers value.

        This method offloads decompression to an executor for large payloads
        to avoid blocking the event loop.
        N)r  r  _decode_content_async)r   r   r  r   s       rB   r   zBodyPartReader.decode_iter  sQ      77='')55g>  aM>s%   3AAA
AA
AAc                     | j                   j                  t        d      j                         }|dk(  r|S |dv r(t	        |d      j                  || j                        S t        d|       )Nrb   identity>   gzipdeflateTr   suppress_deflate_header
max_lengthunknown content encoding: )r   r   r   ru   r   decompress_syncr   RuntimeErrorr   r   r   s      rB   r  zBodyPartReader._decode_content$  sw    <<##$4b9??Az!K**#!(, odt/H/HoIJ
 7zBCCrA   c                  K   | j                   j                  t        d      j                         }|dk(  r| y |dv rxt	        |d      }|j                  || j                         d {    |j                  r6|j                  d| j                         d {    |j                  r5y y t        d|       7 X7 &w)	Nrb   r  >   r  r  Tr   r"  rA   r$  )	r   r   r   ru   r   
decompressr   data_availabler&  )r   r   r   r   s       rB   r  z$BodyPartReader._decode_content_async0  s      <<##$4b9??Az!J,, !(,A Td6O6OPPP""LL9R9RLSSS "" !;H:FGG	 QSs*   A+C
-C.3C
!C"C
6C
C
c                     | j                   j                  t        d      j                         }|dk(  rt	        j
                  |      S |dk(  rt        j                  |      S |dv r|S t        d|       )Nrb   r   quoted-printable)binary8bit7bit#unknown content transfer encoding: )	r   r   r   ru   r   	b64decodebinasciia2b_qpr&  r'  s      rB   r  z'BodyPartReader._decode_content_transferA  st    <<##$=rBHHJx##D))++??4((33K!DXJOPPrA   r  c                     | j                   j                  t        d      }t        |      }|j                  j                  d| j
                  xs |      S )z>Returns charset parameter from Content-Type header or default.rb   charset)r   r   r   r   
parametersr   )r   r  ctypemimetypes       rB   r  zBodyPartReader.get_charsetM  sF      r2!%(""&&y$2G2G2R7SSrA   c                 p    t        | j                  j                  t                    \  }}t	        |d      S )z|Returns name specified in Content-Disposition header.

        If the header is missing or malformed, returns None.
        r   r8   r   r   r   r9   r   r   r{   s      rB   r   zBodyPartReader.nameS  s/     .dll.>.>?R.ST	6+FF;;rA   c                 p    t        | j                  j                  t                    \  }}t	        |d      S )zReturns filename specified in Content-Disposition header.

        Returns None if the header is missing or malformed.
        filenamer:  r;  s      rB   r=  zBodyPartReader.filename\  s/     .dll.>.>?R.ST	6+FJ??rA   r   )0r=   r>   r?   r   r   r   sysmaxsizer   bytesr+   rm   r   type	Exceptionr   r.   r   r   r   rK   r   r   r   r   r   r   rd   r  r
   r	  listtupler  r   r3   r  r  r   r   r   r  r  r  r  r    r   r=  r@   rA   rB   r/   r/     s   0J &*#5"{{.866 )6 	6 6 t6 !6 6 !O6 
6>   EDL  ,1 D U . ,6 *S *% *X# % +# +% +Z :3 48 %cDj %C % 48 GcDj GDcNT<Q G 48 
cDj 
DsCx<Q 
( W 5 K K
7 w g -%2P  
DG 
D% 
DHH	w	'H"
QW 
Q5 
QT3 T3 T <cDj < < @#* @ @rA   )orderc                   x     e Zd ZU eed<   dedededdf fdZdded	edefd
Zdded	ede	fdZ
deddfdZ xZS )BodyPartReaderPayloadr   r~   argskwargsrF   Nc                     t        |   |g|i | i }|j                  |j                  |d<   |j                  |j                  |d<   |r | j                  di | y y )Nr   r=  )
attachmentT)superr   r   r=  set_content_disposition)r   r~   rH  rI  r{   	__class__s        rB   r   zBodyPartReaderPayload.__init__k  si    000!#::!"ZZF6N>>%!&F:(D((FvF rA   r   errorsc                     t        d      )NzUnable to decode.	TypeErrorr   r   rO  s      rB   r   zBodyPartReaderPayload.decodew  s    +,,rA   c                     K   t        d      w)aR  Raises TypeError as body parts should be consumed via write().

        This is intentional: BodyPartReader payloads are designed for streaming
        large data (potentially gigabytes) and must be consumed only once via
        the write() method to avoid memory exhaustion. They cannot be buffered
        in memory for reuse.
        z:Unable to read body part as bytes. Use write() to consume.rQ  rS  s      rB   as_byteszBodyPartReaderPayload.as_bytesz  s      TUUs   writerc                 "  K   | j                   }|j                  t               d {   x}r5|j                  |      2 3 d {   }|j	                  |       d {    #y y 7 <7 "7 6 |j                  t               d {  7  x}r_,w)N)r   )r   r   r   r   write)r   rV  fieldr   r   s        rB   rX  zBodyPartReaderPayload.write  s     "--3E-FFFeF ,,U3 & &all1o%% GF&% 4 #--3E-FFFFeFsQ   &BA%B A+A'A+BA)B'A+)B+BBBrk   rl   )r=   r>   r?   r/   __annotations__r
   r   rm   r   r@  rU  r   rX  __classcell__rN  s   @rB   rG  rG  f  s|    
Gn 
GS 
GC 
GD 
G-s -c - -Vs Vc VQV V&"6 &4 &rA   rG  c                   f   e Zd ZU dZeZdZed    dz  ed<   e	Z
ej                  ddeddeeef   ded	ed
ededee   ddfdZdedefdZded e	f   dz  fdZedddefd       ZdefdZded e	f   dz  fdZd!dZded e	f   fdZddded e	f   fdZdefdZ de!fdZ"d!dZ#d!dZ$d"dZ%d!d Z&y)#r4   zMultipart body reader.Nmultipart_reader_clsi     r   max_field_sizemax_headersr   r   r   r   rb  rc  r   rF   c                   t        |t                 | _        | j                  j                  dk(  sJ d       d| j                  j                  vrt        d|t           z        || _        d| j                         z   j                         | _	        || _
        || _        d | _        d | _        || _        || _        || _        d| _        d| _        g | _        y )N	multipartz!multipart/* content type expectedr   z$boundary missed for Content-Type: %s--FT)r   r   	_mimetyperA  r6  r   r   _get_boundaryencoder   r   r   r   
_last_part_max_field_size_max_headersr   r   _at_bofr   )r   r   r   r   rb  rc  r   s          rB   r   zMultipartReader.__init__  s     ((=>~~""k1V3VV1T^^66669NN  !3!3!55==? /,0CG-'#5 $&rA   r   c                     | S rJ   r@   r   s    rB   r   zMultipartReader.__aiter__  r   rA   c                 R   K   | j                          d {   }|t        |S 7 wrJ   r   r   s     rB   r   zMultipartReader.__anext__  r   r   responser:   c                 `    | j                  | | |j                  |j                              }|S )zConstructs reader instance from HTTP response.

        :param response: :class:`~aiohttp.client.ClientResponse` instance
        )response_wrapper_clsr   r   )clsrp  objs      rB   from_responsezMultipartReader.from_response  s3     &&c(**H,<,<=
 
rA   c                     | j                   S )z@Returns True if the final boundary was reached, false otherwise.r  r   s    rB   r   zMultipartReader.at_eof  r  rA   c                 .  K   | j                   ry| j                          d{    | j                  r | j                          d{    d| _        n| j	                          d{    | j                   ry| j                          d{   }| j                  | j                  j                  dk(  rt        |t              rt        |j                  j                  t                    \  }}|j                  d      dk(  rm|j                  d       d{   }t!        |      dkD  rt#        d      |j%                         j'                         | _        | j                          d{   }|| _        | j                  S 7 b7 A7 $7 7 w7 %w)	z#Emits the next multipart body part.NFr   r   	_charset_       zInvalid default charset)r   _maybe_release_last_partrm  _read_until_first_boundary_read_boundaryfetch_next_partrj  rg  r   
isinstancer/   r8   r   r   r   r   r   r&  rv   r   r   )r   r   r   r{   r5  s        rB   r   zMultipartReader.next  sM    
 <<++---<<11333 DL%%'''<<))++ OO#&&+5401$,,2B2BCV2WXIAvzz&![0 !% 33w<"$&'@AA(/(>(>(@%!11335 	.3 ( , 4 4sk   !FF#FFF'F($FFBFFAF-F.FFFFFFc                    K   | j                   sA| j                          d{   }|y|j                          d{    | j                   s@yy7 .7 w)z=Reads all the body parts to the void till the final boundary.N)r   r   r   r   s     rB   r   zMultipartReader.release  sD     ,,$D|,,.  	 ,,$ !s%    AAAAAAAc                 `   K   | j                          d{   }| j                  |      S 7 w)z"Returns the next body part reader.N)_read_headers_get_part_reader)r   r   s     rB   r~  zMultipartReader.fetch_next_part  s/      **,,$$W-- -s   .,.r   c           	      Z   |j                  t        d      }t        |      }|j                  dk(  r| j                  I t        |       || j
                  | j                  | j                  | j                  | j                        S | j	                  || j
                  | j                  | j                  | j                  | j                        S | j                  | j                  || j
                  | j                  j                  | j                  | j                  | j                        S )zDispatches the response by the `Content-Type` header.

        Returns a suitable reader instance.

        :param dict headers: Response headers
        rb   re  ra  )r   r   r   r   )r   r   r   rA  r_  r   r   rk  rl  r   part_reader_clsr   rg  r   r   )r   r   r7  r8  s       rB   r  z MultipartReader._get_part_reader  s    L"-!%(==K'((0!tDzMM$($9$9#'#7#7 $ 1 1'+'?'?  ,, $ 5 5#33 --#'#;#; -   ''.. $ 5 5 $ 5 5#'#;#; (  rA   c                 p    | j                   j                  d   }t        |      dkD  rt        d|z        |S )Nr   F   z&boundary %r is too long (70 chars max))rg  r6  r   r   )r   r   s     rB   rh  zMultipartReader._get_boundary-  s8    >>,,Z8x=2EPQQrA   c                    K   | j                   r| j                   j                         S | j                  j                          d {   S 7 wrJ   )r   rt   r   r   r   s    rB   	_readlinezMultipartReader._readline4  s9     <<<<##%%]]++----s   AAAAc                    K   	 | j                          d {   }|dk(  rt        d| j                  z        |j                         }|| j                  k(  ry || j                  dz   k(  rd| _        y p7 \w)NTrA   z#Could not find starting boundary %rr   )r  r   r   r   r   r   r   s     rB   r|  z*MultipartReader._read_until_first_boundary9  sw     ..**E| 9T^^L  LLNE&$..500# *s   A6A4AA6c                   K   | j                          d {   j                         }|| j                  k(  ry || j                  dz   k(  ryd| _        | j                          d {   }| j                          d {   }|d d dk(  r| j                  j                  |       y | j                  j                  ||g       y t        d|d| j                        7 7 {7 ew)Nr   TrU   zInvalid boundary z, expected )r  r   r   r   r   r   r   r   )r   r   epiloguer   s       rB   r}  zMultipartReader._read_boundaryG  s     ~~''//1DNN"dnnu,,DL!^^--H"nn..I !}%##I.
 ##Y$9:0	T^^DVWXX) (
 ..s5   C%CAC%%C!&C%=C#>A"C%!C%#C%c                 Z  K   g }	 | j                   j                  | j                         d {   }|j                  d      }|j	                  |       |sn$t        |      | j                  kD  rt        d      wt        | j                        }|j                  |      \  }}|S 7 yw)N)max_line_lengthr   zToo many headers received)rb  )
r   r   rk  r   r   r   rl  r"   r!   parse_headers)r   linesr   parserr   raw_headerss         rB   r  zMultipartReader._read_headers^  s     --00AUAU0VVELL)ELL5zD---$%@AA  d.B.BC%33E: Ws   -B+B)A:B+c                   K   | j                   s| j                   j                         s"| j                   j                          d{    | j                  j	                  | j                   j                         d| _         yy7 <w)z8Ensures that the last read body part is read completely.N)rj  r   r   r   r   r   s    rB   r{  z(MultipartReader._maybe_release_last_partl  sa     ??&??))+oo--///LL 7 78"DO	 '/s   ABB=Br   )rF   r   )'r=   r>   r?   r   r   rr  r_  rA  r[  r/   r  r>  r?  r   r   rm   r+   r   rB  r   r.   r   r   r   classmethodru  rK   r   r   r   r~  r  rh  r@  r  r|  r}  r  r{  r@   rA   rB   r4   r4     s     4 <@$01D8?$O  #{{".8'c"' '
 ' ' ' !O' 
'<  	 .0	1D	8 " 
"  !	 .0	1D	8!F!.	 .0	1.((( 
 .0	1(Ts . .
Y.#rA   r4   c                   ,    e Zd ZU dZded<   dZd%dededz  ddf fdZd&d	Zd
e	e
   dz  de
dz  dedz  ddfdZdee   fdZdefdZdefdZ ej*                  d      Z ej*                  d      Zedefd       Zedefd       Zd'dedeeef   dz  defdZdedefdZ	 d'dedeeef   dz  defdZ 	 d'de!e"eef      eeef   z  deeef   dz  defdZ#ededz  fd       Z$d(dededefdZ%d(dedede&fd Z'	 d)d!e(d"eddfd#Z)d*d$Z* xZ+S )+r5   zMultipart body writer.Nr   Tr   r   rF   c                    ||nt        j                         j                  }	 |j                  d      | _        d| d| j                   }t        | %  d |       g | _
        |dk(  | _        y # t
        $ r t        d      d w xY w)Nasciiz(boundary should contain ASCII only charsz
multipart/z; boundary=)content_typer   )uuiduuid4hexri  r   UnicodeEncodeErrorr   _boundary_valuerL  r   _partsr   )r   r   r   r7  rN  s       rB   r   zMultipartWriter.__init__  s    '389I9I	S%__W5DN WI[1E1E0FGE2#%$3 " 	SGHdR	Ss   A0 0Bc                     | S rJ   r@   r   s    rB   	__enter__zMultipartWriter.__enter__  r   rA   exc_typeexc_valexc_tbc                      y rJ   r@   )r   r  r  r  s       rB   __exit__zMultipartWriter.__exit__  s     	rA   c                 ,    t        | j                        S rJ   )iterr  r   s    rB   __iter__zMultipartWriter.__iter__  s    DKK  rA   c                 ,    t        | j                        S rJ   )r   r  r   s    rB   __len__zMultipartWriter.__len__  s    4;;rA   c                      y)NTr@   r   s    rB   __bool__zMultipartWriter.__bool__  s    rA   s   \A[!#$%&'*+\-.^_`|~\w]+\Zs   [\x00-\x08\x0A-\x1F\x7F]c                 H   | j                   }t        j                  | j                  |      r|j	                  d      S t        j
                  | j                  |      rt        d      |j                  dd      }|j                  dd      }d|j	                  d      z   dz   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   \"rQ   )	r   rf   match_valid_tchar_regexr   search_invalid_qdtext_char_regexr   replace)r   r~   quoted_value_contents      rB   r  zMultipartWriter._boundary_value  s    & 88D++U3<<((99T44e<IJJ  %}}UG<3;;D&I)0099C??rA   c                 8    | j                   j                  d      S )Nr  )r   r   r   s    rB   r   zMultipartWriter.boundary  s    ~~$$W--rA   rt  r   c                    |
t               }t        |t              r,|j                  j	                  |       | j                  |      S 	 t        ||      }| j                  |      S # t        $ r t        d|z        w xY w)Nr   zCannot create payload from %r)	r   r  r'   r   updateappend_payloadr)   r%   rR  )r   rt  r   payloads       rB   r   zMultipartWriter.append  s    ?!mGc7#KKw'&&s++4%c7; **733  G ?# EFFGs   
A( (B r  c                    d}d}| j                   rlt        t        t        h|j                  j                         z  rJ t        |j                  vrdt        | j                         }|j                  d|       n|j                  j                  t        d      j                         }|r|dvrt        d|       |dk(  rd}|j                  j                  t        d      j                         }|d	vrt        d
|       |dk(  rd}|j                  }| |s|st        |      |j                  t        <   | j                  j                  |||f       |S )z)Adds a new body part to multipart writer.Nzsection-r   )r   rb   )r  r  r  r$  r  )rb   r   r,  r-  r0  r-  )r   r   r   r   r   keysr   r   r  rM  r   ru   r&  r   rm   r   )r   r  r   te_encodingr   r   s         rB   r  zMultipartWriter.append_payload  sU   #"& &~7PQ//&&()) #'//9!#dkk"2!34//$/G **+;R@FFHHH,KK"%?z#JKK:% "//--.GLRRTK"NN"%H#VWWh&" <<D[25d)/GX{;<rA   c                 R    |
t               }| j                  t        ||            S )zHelper to append JSON part.r  )r   r  r$   )r   rt  r   s      rB   append_jsonzMultipartWriter.append_json  s(     ?!mG"";sG#DEErA   c                     t        |t        t        f      sJ |
t               }t        |t              rt	        |j                               }t        |d      }| j                  t        ||d            S )z&Helper to append form urlencoded part.T)doseqz!application/x-www-form-urlencoded)r   r  )	r  r   r   r   rC  r   r   r  r(   )r   rt  r   r   s       rB   append_formzMultipartWriter.append_form
  sn     #'2333?!mGc7#syy{#CD)""g4W
 	
rA   c                    d}| j                   D ]]  \  }}}|j                  }|s|s| y|t        dt        | j                        z   dz   |z   t        |j
                        z   dz         z  }_ |dt        | j                        z   dz   z  }|S )zSize of the payload.r   NrU   r   )r  r   r   r   r   _binary_headers)r   totalr   r   r  	part_sizes         rB   r   zMultipartWriter.size  s     +/;; 	'D(K		I;)*;Sdnn%&  d**+	,
  E	 	S((1,,rA   r   rO  c                 T     dj                   fd j                  D              S )zReturn string representation of the multipart data.

        WARNING: This method may do blocking I/O if parts contain file payloads.
        It should not be called in the event loop. Use as_bytes().decode() instead.
        rb   c              3      K   | ]H  \  }}}d j                   z   dz   |j                  j                        z   |j                         z    J yw)rf  z
N)r   r  r   )r   r   _e_ter   rO  r   s       rB   r   z)MultipartWriter.decode.<locals>.<genexpr>:  sb      
 b# mm ""))(F;< kkm	
s   AA)rn   r  rS  s   ```rB   r   zMultipartWriter.decode4  s)     ww 
 "&
 
 	
rA   c                   K   g }| j                   D ]~  \  }}}|j                  d| j                  z   dz          |j                  |j                         |j	                  ||       d{   }|j                  |       |j                  d        |j                  d| j                  z   dz          dj                  |      S 7 Zw)zReturn bytes representation of the multipart data.

        This method is async-safe and calls as_bytes on underlying payloads.
        r   r   N   --
rA   )r  r   r   r  rU  rn   )r   r   rO  rz   r   r  r  
part_bytess           rB   rU  zMultipartWriter.as_bytesC  s     
   "[[ 	"MD"cLL/'9: LL--.  $}}Xv>>JLL$ LL!	" 	UT^^+i78xx ?s   A'C)C*ACrV  close_boundaryc                   K   | j                   D ]#  \  }}}| j                  r+t        |j                  v sJ d|j                  t           v sJ |j	                  d| j
                  z   dz          d{    |j	                  |j                         d{    |s|rct        |      }|r|j                  |       |r|j                  |       |j	                  |       d{    |j                          d{    n|j	                  |       d{    |j	                  d       d{    & |r*|j	                  d| j
                  z   dz          d{    yy7 7 7 7 m7 U7 >7 w)zWrite body.zname=r   r   Nr  )r  r   r   r   rX  r   r  MultipartPayloadWriterenable_compressionenable_encoding	write_eof)r   rV  r  r   r   r  ws          rB   rX  zMultipartWriter.write^  sO     ,0;; 	('D(K!!*dll:::$,,/B"CCCC,,ut~~5?@@@,,t33444;*62((2%%k2jjm##kkm##jj(((,,w''')	(, ,,ut~~5	ABBB ! A4 $#(' Cs   A0E12E#3"E1E%AE1#E'$E1;E)<E1E+E1.E-/-E1E/E1%E1'E1)E1+E1-E1/E1c                 >  K   | j                   ryd| _         t        | j                        D ]<  \  }\  }}}|j                  r|j                  r$	 |j                          d{    > y7 # t        $ r#}t        j                  d||d       Y d}~id}~ww xY ww)a  
        Close all part payloads that need explicit closing.

        IMPORTANT: This method must not await anything that might not finish
        immediately, as it may be called during cleanup/cancellation. Schedule
        any long-running operations without awaiting them.
        NTz%Failed to close multipart part %d: %s)exc_info)		_consumedr   r  	autocloseconsumedcloserB  r#   error)r   r   r   r   excs        rB   r  zMultipartWriter.close{  s      >> "+4;;!7 	C$1>>$--**,&&	 '  #))?cTX sH   A BBA.$A,%A.)B,A..	B7BBBB)r   N)rF   r5   rJ   rZ  )Tr   ),r=   r>   r?   r   r[  
_autocloserm   r   r  rA  BaseExceptionr   r  r   _Partr  r   r  rK   r  rf   compiler  r  propertyr  r   r
   r   r'   r   r  r  r   rD  r  r   r   r@  rU  r   rX  r  r\  r]  s   @rB   r5   r5   x  s8    LJ4 4t 4t 4$}%, % $	
 
!(5/ !   $  $$AB!+,H!I@ @ @> .# . .4# 4S(9D(@ 4G 4$g $' $N =AFF!(c!2T!9F	F -1
eCHo&c)::
 c"T)
 
	
* cDj  (
s 
c 
 
s c QV 8 DHC*C<@C	C:rA   r5   c                   b    e Zd ZdeddfdZdeddfdZ	 ddededz  ddfdZdd	Z	d
e
ddfdZy)r  rV  rF   Nc                 <    || _         d | _        d | _        d | _        y rJ   )_writer	_encoding	_compress_encoding_buffer)r   rV  s     rB   r   zMultipartPayloadWriter.__init__  s    %)0426rA   r   c                 V    |dk(  r|| _         t               | _        y |dk(  rd| _         y y )Nr   r,  )r  r   r  )r   r   s     rB   r  z&MultipartPayloadWriter.enable_encoding  s0    x%DN$-KD!++/DN ,rA   strategyc                 *    t        |d|      | _        y )NT)r   r!  r  )r   r  )r   r   r  s      rB   r  z)MultipartPayloadWriter.enable_compression  s     ($(
rA   c                 ^  K   | j                   <| j                   j                         }|r d | _         | j                  |       d {    | j                  dk(  rN| j                  rA| j
                  j                  t        j                  | j                               d {    y y y 7 b7 	w)Nr   )r  flushrX  r  r  r  r   	b64encoder  s     rB   r  z MultipartPayloadWriter.write_eof  s     >>%NN((*E!%jj'''>>X%$$ll(()9)9$:O:O)PQQQ % & ( Rs%   AB-B)AB-!B+"B-+B-r   c                   K   | j                   (|r&| j                   j                  |       d {   }|sy | j                  dk(  r| j                  }|J |j	                  |       |rjt        t        |      d      \  }}|d |dz   ||dz  d  c}| _        |r9t        j                  |      }| j                  j                  |       d {    y y y | j                  dk(  r7| j                  j                  t        j                  |             d {    y | j                  j                  |       d {    y 7 7 t7 .7 w)Nr   r,   r,  )r  compressr  r  r   divmodr   r   r  r  rX  r2  b2a_qp)r   r   bufdivmod	enc_chunkb64chunks          rB   rX  zMultipartPayloadWriter.write  s'    >>%"nn55e<<>>X%''C?"?JJu!#c(A.S47	#'NCa	N0	40%//	:H,,,,X666   ^^11,,$$X__U%;<<<,,$$U+++% = 7<+sG   -ED>BEEAEE#E8E9EEEE)r  Nr   )r=   r>   r?   r   r   rm   r  r   r  r  r@  rX  r@   rA   rB   r  r    sj    73 7 70 0 0 AE

36:
	
	R, ,4 ,rA   r  )r=  )Wr   r2  r	  rf   r>  r  rr   collectionsr   collections.abcr   r   r   r   typesr   typingr	   r
   r   r   r   urllib.parser   r   r   	multidictr   r   abcr   compression_utilsr   r   hdrsr   r   r   r   r   helpersr   r   r   r   r    httpr!   http_exceptionsr"   logr#   r  r$   r%   r&   r'   r(   r)   r*   streamsr+   version_infor.   r2   r@  r   r3   __all__client_reqrepr:   RuntimeWarningr6   r7   rm   rD  r  r8   r9   r   r/   	try_firstrG  r4   r  r5   r  r@   rA   rB   <module>r     s      	 
    F F  ; ; 6 6 3 % ?  L K  +     "w6!12Dw&5)%68KKLF
)6
* -	. 		 	d$$Jd$
3:tCH~%&d$P ,6CH%(4ZB," ,"^a@ a@H nEOO4!&G !& 5!&Hg# g#T 	gsC Zg Zz7, 7,rA   