
    `e~                        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e?          Z@ G d de?          ZAdeeB         deeeB         eeBeBf         f         fdZC	 d(deeBeBf         deBdeeB         fdZD G d d          ZE G d d          ZF e9eFe5jG                   G d  d!e6                      ZH G d" d#          ZIee6eBeBf         ZJ G d$ d%e6          ZK G 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 )r1   N__name__
__module____qualname__     1lib/python3.11/site-packages/aiohttp/multipart.pyr1   r1   B           Dr<   r1   c                       e Zd ZdS )r2   Nr7   r;   r<   r=   r2   r2   F   r>   r<   r2   headerreturnc                 v   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                    t          t          j        t                              d	d
t           dt           dt           fd}| sd i fS |                     d          ^}} |          s%t          j	        t          |                      d i fS i }|r|                    d          }	d|	vr%t          j	        t          |                      d i fS |	                    dd          \  }
}|
                                                                }
|                                }|
|v r%t          j	        t          |                      d i fS  |
          s"t          j	        t          |	                      ||
          rP ||          r ||dd                   }n |          s#t          j	        t          |	                     Cn_ ||
          r ||          r|                    dd          \  }}}|pd}n#t          j	        t          |	                     	 t!          ||d          }n# t"          $ r% t          j	        t          |	                     Y w xY wd} ||          r)d} ||dd                             d                    }ne |          rd}nW|rU| d|d          } ||          r=|                    d            ||dd                             d                    }d}|r%t          j	        t          |                      d i fS |||
<   ||                                |fS )NstringrA   c                 P    t          |           ot          t          |           k    S N)boolr"   setrC   s    r=   is_tokenz+parse_content_disposition.<locals>.is_tokenM   s    F||4V 44r<   c                 :    | d         | d         cxk    odk    nc S )Nr   "r;   rH   s    r=   	is_quotedz,parse_content_disposition.<locals>.is_quotedP   s,    ayF2J----#-----r<   c                 L     |           o|                      d          dk    S )N'   )count)rC   rI   s    r=   
is_rfc5987z-parse_content_disposition.<locals>.is_rfc5987S   s)    x:FLL$5$5$::r<   c                 ,    |                      d          S )N*)endswithrH   s    r=   is_extended_paramz4parse_content_disposition.<locals>.is_extended_paramV   s    s###r<   c                     |                      d          dz   }|sdS |                     d          r
| |d         n	| |d          }|                                S )NrT   r   FrK   )findrU   isdigit)rC   pos	substrings      r=   is_continuous_paramz6parse_content_disposition.<locals>.is_continuous_paramY   sa    kk#" 	5&,ooc&:&:LF3r6NNstt	  """r<    )charstextr^   c                6    t          j        d| dd|           S )Nz\\([z])z\1)resub)r_   r^   s     r=   unescapez+parse_content_disposition.<locals>.unescape`   s"    v(u(((%666r<   ;r   =r   rK   rO   rP   utf-8strictTFz\/)strrF   joinmapra   escaper!   splitwarningswarnr1   poplowerstriplstripr2   r   UnicodeDecodeError)r@   rM   rR   rV   r\   rc   disptypepartsparamsitemkeyvalueencoding_failed_valuerI   s                   @r=   r3   r3   J   s   5 5 5 5 5 5.# .$ . . . .;3 ;4 ; ; ; ; ; ;$# $$ $ $ $ $#C #D # # # # -/GGC	44H4H,I,I 7 7 7s 7c 7c 7 7 7 7  Rx||C((Hu8H 1&99:::RxF
 <yy||d??M5f==>>>8OZZQ''
Uiikk!!&==M5f==>>>8Ox}} +	 M4T::;;;  %% '	 y  qt--Xe__ 8>>??? s##  	 z%   %*[[a%8%8"!U#.w8>>???x::%   8>>???
 Fy # qt!3!3E!:!:;;% 	# # "..E!H..9V$$ #IIaLLL$HVAbD\%8%8%?%?@@E"F  9&AABBBRxsy  <| >>V##s   J) )+KKfilenamerv   namec                 2  
 d|z  
| sd S 
| v r| 
         S || v r| |         S g }t          
fd|                                 D                       }t          |          D ]i\  }\  }}|                    dd          \  }}|                    d          r
|d d         }|t          |          k    r|                    |           i |sd S d                    |          }d|v r/|                    dd          \  }	}}|	pd	}	t          ||	d
          S |S )Nz%s*c              3   P   K   | ] \  }}|                               ||fV  !d S rE   )
startswith).0rx   ry   name_sufs      r=   	<genexpr>z/content_disposition_filename.<locals>.<genexpr>   sP       
 
'S%S^^H=U=U
%L
 
 
 
 
 
r<   rT   r   rK   r]   rO   rP   rf   rg   )	sorteditems	enumeraterl   rU   rh   appendri   r   )rv   r   ru   fnparamsnumrx   ry   r{   tailrz   r   s             @r=   r4   r4      si    t|H t	V		h	d| 
 
 
 
+1<<>>
 
 
 
 
 "+8!4!4 	 	C#uiiQ''GAt}}S!! !CRCys3xxU#### 	4%<<!&S!!4!4Ha*7H5(H555r<   c                   ~    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
ed
                  fdZddZdS )MultipartResponseWrapperzzWrapper around the MultipartReader.

    It takes care about
    underlying connection and close it when it needs in.
    respr5   streamr.   rA   Nc                 "    || _         || _        d S rE   )r   r   )selfr   r   s      r=   __init__z!MultipartResponseWrapper.__init__   s    
 	r<   c                     | S rE   r;   r   s    r=   	__aiter__z"MultipartResponseWrapper.__aiter__       r<   )r.   r0   c                 P   K   |                                   d {V }|t          |S rE   nextStopAsyncIterationr   parts     r=   	__anext__z"MultipartResponseWrapper.__anext__   7       YY[[      <$$r<   c                 >    | j         j                                        S )z2Returns True when all response data had been read.)r   contentat_eofr   s    r=   r   zMultipartResponseWrapper.at_eof   s    y '')))r<   c                    K   | j                                          d{V }| j                                         r|                                  d{V  |S )z#Emits next multipart reader object.N)r   r   r   releaser   rw   s     r=   r   zMultipartResponseWrapper.next   sh       [%%''''''''; 	!,,..       r<   c                 H   K   | j                                          d{V  dS )z_Release the connection gracefully.

        All remaining content is read to the void.
        N)r   r   r   s    r=   r   z MultipartResponseWrapper.release   s4      
 i!!!!!!!!!!!r<   )r   r5   r   r.   rA   N)rA   r   rA   N)r8   r9   r:   __doc__r   r   r   r   rF   r   r   r   r   r;   r<   r=   r   r      s          " 
	      	2	3   * * * * *	%;<	=   " " " " " "r<   r   c                      e Zd ZdZdZdedddeddfd	Zded          fd
Z	defdZ
dee         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d%dZdddee         defdZdddee         deeeef                  fdZdddee         deeeef                  fdZdefdZdedefdZdedefdZdedefd Z d!edefd"Z!e"dee         fd#            Z#e"dee         fd$            Z$dS )&r0   z&Multipart reader for single body part.i    boundaryheadersCIMultiDictProxy[str]r   rA   Nc                    || _         || _        || _        d| _        | j                             t
          d           }|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   lengths        r=   r   zBodyPartReader.__init__  s{     !!!.$77&,&8s6{{{d%*WW,0&(r<   c                     | S rE   r;   r   s    r=   r   zBodyPartReader.__aiter__  r   r<   c                 P   K   |                                   d {V }|t          |S rE   r   r   s     r=   r   zBodyPartReader.__anext__  s5      YY[[      <$$r<   c                 F   K   |                                   d {V }|sd S |S rE   )readr   s     r=   r   zBodyPartReader.next  s7      YY[[       	4r<   Fdecoder   c                   K   | j         rdS t                      }| j         s:|                    |                     | j                   d{V            | j         :|r|                     |          S |S )zReads body part data.

        decode: Decodes data following by encoding
                method from Content-Encoding header. If it missed
                data remains untouched
        r<   N)r   	bytearrayextend
read_chunk
chunk_sizer   )r   r   datas      r=   r   zBodyPartReader.read   s       < 	3{{, 	@KKdoodo>>>>>>>>??? , 	@ 	%;;t$$$r<   sizec                 l  K   | j         rdS | j        r|                     |           d{V }n|                     |           d{V }| xj        t          |          z  c_        | j        | j        k    rd| _         | j         r/| j                                         d{V }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clrfs       r=   r   zBodyPartReader.read_chunk0  s      
 < 	3< 	=66t<<<<<<<<EE66t<<<<<<<<ECJJ&t|++DL< 	E//11111111D4D  r<   c                    K   | j         
J d            t          || j         | j        z
            }| j                            |           d {V }|S )Nz(Content-Length required for chunked read)r   minr   r   r   )r   r   r   r   s       r=   r   z&BodyPartReader._read_chunk_from_lengthF  sd       |'')S'''t|d.>>??
m((44444444r<   c           
        K   |t          | j                  dz   k    s
J d            | j        d u }|r%| j                            |           d {V | _        | j                            |           d {V }| xj        t          | j                                                  z  c_        | j        dk     s
J d            | j        J | j        |z   }d| j        z   }|r|                    |          }nF|                    |t          dt          | j                  t          |          z
                      }|dk    rt          j                    5  t          j        dt                     | j                            ||d                     d d d            n# 1 swxY w Y   ||k    r| j        d |         | _        |t          | j                  |         }|sd	| _        | j        }|| _        |S )
NrP   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   rX   maxrm   catch_warningsfilterwarningsDeprecationWarningunread_datar   )r   r   first_chunkr   windowrb   idxresults           r=   r   z&BodyPartReader._read_chunk_from_streamN  sV      C''!++++I ,++&$. 	>%)]%7%7%=%=======Dm((........S!5!5!7!7888 1$$$&9$$$+++!E)& 	M++c""CC++c3q#d.>*?*?#c((*J#K#KLLC!88(** 8 8';MNNNN))&,7778 8 8 8 8 8 8 8 8 8 8 8 8 8 8 czz#'#3DSD#9 3t/00367E $#! s   >FF#&F#c                 6  K   | j         rdS | j        r| j                                        }n| j                                         d{V }|                    | j                  rV|                    d          }| j        }| j        dz   }||k    s||k    r#d| _         | j                            |           dS n]| j                                         d{V }|                    | j                  r
|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_lines         r=   r   zBodyPartReader.readlinep  s8     < 	3< 	2<''))DD//11111111D??4>** 	+ KK((E~H NU2M  E]$:$:###D)))s %;
 #m4466666666I##DN33 !CRCyL	***r<   c                 |   K   | j         rdS | j         s)|                     | j                   d{V  | j         'dS dS )z0Like read(), but reads all the data to the void.N)r   r   r   r   s    r=   r   zBodyPartReader.release  se      < 	F, 	3//$/222222222 , 	3 	3 	3 	3 	3r<   )rz   rz   c                   K   |                      d           d{V }|p|                     d          }|                    |          S )z;Like read(), but assumes that body part contains text data.Tr   Nrf   default)r   get_charsetr   r   rz   r   s      r=   r_   zBodyPartReader.text  sZ      YYdY++++++++ @t///@@{{8$$$r<   c                  K   |                      d           d{V }|sdS |p|                     d          }t          t          t          t
          f         t          j        |                    |                              S )z<Like read(), but assumes that body parts contains JSON data.Tr   Nrf   r   )	r   r   r   r	   rh   r   jsonloadsr   r   s      r=   r   zBodyPartReader.json  s      YYdY++++++++ 	4@t///@@DcNDJt{{8/D/D$E$EFFFr<   c                2  K   |                      d           d{V }|sg S ||}n|                     d          }	 |                                                    |          }n # t          $ r t          d|z            w xY wt          |d|          S )zFLike read(), but assumes that body parts contain form urlencoded data.Tr   Nrf   r   z'data cannot be decoded with %s encoding)keep_blank_valuesrz   )r   r   r   r   rs   
ValueErrorr   )r   rz   r   real_encodingdecoded_datas        r=   formzBodyPartReader.form  s      YYdY++++++++ 	I$MM ,,W,==M	X;;==//>>LL! 	X 	X 	XFVWWW	X ""
 
 
 	
s   'A' 'Bc                     | j         S )z<Returns True if the boundary was reached or False otherwise.r   r   s    r=   r   zBodyPartReader.at_eof  
    |r<   r   c                     t           | j        v r|                     |          }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   _decode_content)r   r   s     r=   r   zBodyPartReader.decode  sJ     %440066Dt|++''---r<   c                     | j                             t          d                                          }|dk    r|S |dv r$t	          |d                              |          S t          d|           )Nr]   identity>   gzipdeflateT)rz   suppress_deflate_headerunknown content encoding: )r   r   r   rp   r   decompress_syncRuntimeErrorr   r   rz   s      r=   r   zBodyPartReader._decode_content  s    <##$4b99??AAz!!K***#!(,   od##$
 BBBCCCr<   c                    | j                             t          d                                          }|dk    rt	          j        |          S |dk    rt          j        |          S |dv r|S t          d	                    |                    )Nr]   base64quoted-printable)binary8bit7bit%unknown content transfer encoding: {})
r   r   r   rp   r  	b64decodebinasciia2b_qpr  formatr  s      r=   r   z'BodyPartReader._decode_content_transfer  s    <##$=rBBHHJJx#D)))+++?4(((333K:AA(KK  r<   r   c                     | j                             t          d          }t          |          }|j                            d|          S )z>Returns charset parameter from Content-Type header or default.r]   charset)r   r   r    r#   
parameters)r   r   ctypemimetypes       r=   r   zBodyPartReader.get_charset  s?      r22!%(("&&y':::r<   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   r3   r   r   r   r4   r   r{   rv   s      r=   r   zBodyPartReader.name  s6     .dl.>.>?R.S.STT	6+FF;;;r<   c                     t          | j                            t                              \  }}t	          |d          S )zReturns filename specified in Content-Disposition header.

        Returns None if the header is missing or malformed.
        r~   r  r  s      r=   r~   zBodyPartReader.filename  s6     .dl.>.>?R.S.STT	6+FJ???r<   r   )%r8   r9   r:   r   r   bytesr-   r   r   r   r   r   r   rF   r   r   r   r   r   r   r   rh   r_   r	   r   r   r   r   r   r   r   r   r   r   r$   r   r~   r;   r<   r=   r0   r0      sG       00J))(?)JV)	) ) ) )=)9:        HUO     ,1   D U      ,6  S %    ,# %     #  %        D    :3 3 3 3 7; % % %hsm %s % % % % 7; G G Ghsm GxSRUX?W G G G G 7; 
 
 
hsm 
tE#s(O?T 
 
 
 
(    
5 
U 
 
 
 

DE 
De 
D 
D 
D 
DU u    ;3 ;3 ; ; ; ; <hsm < < < U< @(3- @ @ @ U@ @ @r<   r0   )orderc                   @     e Zd Zdedededdf fdZdeddfdZ xZS )	BodyPartReaderPayloadry   argskwargsrA   Nc                      t                      j        |g|R i | i }|j        
|j        |d<   |j        
|j        |d<   |r | j        di | d S d S )Nr   r~   
attachmentT)r   T)superr   r   r~   set_content_disposition)r   ry   r  r  rv   	__class__s        r=   r   zBodyPartReaderPayload.__init__  s    0000000!#:!"ZF6N>%!&F: 	G(D(FFvFFFFF	G 	Gr<   writerc                    K   | j         }|                    d           d {V }|rN|                    |                    |                     d {V  |                    d           d {V }|Ld S d S )Ni   )r   )r}   r   writer   )r   r$  fieldr   s       r=   r&  zBodyPartReaderPayload.write	  s      &&E&22222222 	7,,u||E22333333333***66666666E  	7 	7 	7 	7 	7r<   )r8   r9   r:   r0   r   r   r&  __classcell__r#  s   @r=   r  r    s        
Gn 
GS 
GC 
GD 
G 
G 
G 
G 
G 
G7# 7$ 7 7 7 7 7 7 7 7r<   r  c                   R   e Zd ZdZeZdZeZde	e
e
f         deddfdZded         fdZdeed ef                  fd	Zed
ddefd            ZdefdZdeed ef                  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 dS )r.   zMultipart body reader.Nr   r   rA   c                     || _         d|                                 z                                   | _        || _        d | _        d| _        d| _        g | _        d S )Nz--FT)	r   _get_boundaryencoder   r   
_last_partr   _at_bofr   )r   r   r   s      r=   r   zMultipartReader.__init__  sT    !3!3!5!55==??NR$&r<   r0   c                     | S rE   r;   r   s    r=   r   zMultipartReader.__aiter__%  s	     r<   c                 P   K   |                                   d {V }|t          |S rE   r   r   s     r=   r   zMultipartReader.__anext__*  r   r<   responser5   c                 Z    |                      | | |j        |j                            }|S )zConstructs reader instance from HTTP response.

        :param response: :class:`~aiohttp.client.ClientResponse` instance
        )response_wrapper_clsr   r   )clsr2  objs      r=   from_responsezMultipartReader.from_response2  s7     &&cc(*H,<==
 
 
r<   c                     | j         S )z@Returns True if the final boundary was reached, false otherwise.r   r   s    r=   r   zMultipartReader.at_eof@  r   r<   c                 0  K   | j         rdS |                                  d{V  | j        r"|                                  d{V  d| _        n|                                  d{V  | j         rdS |                                  d{V | _        | 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   s    r=   r   zMultipartReader.nextD  s      
 < 	4++---------< 	(11333333333 DLL%%'''''''''< 	4 $ 4 4 6 6666666r<   c                    K   | j         sA|                                  d{V }|dS |                                 d{V  | j         ?dS dS )z=Reads all the body parts to the void till the final boundary.N)r   r   r   r   s     r=   r   zMultipartReader.releaseV  sy      , 	!$$$$$$D|,,..       	 , 	! 	! 	! 	! 	!r<   c                 d   K   |                                   d{V }|                     |          S )z"Returns the next body part reader.N)_read_headers_get_part_reader)r   r   s     r=   r=  zMultipartReader.fetch_next_part^  s?       **,,,,,,,,$$W---r<   r   c                 .   |                     t          d          }t          |          }|j        dk    r@| j         t          |           || j                  S |                     || j                  S |                     | j        || j                  S )zDispatches the response by the `Content-Type` header.

        Returns a suitable reader instance.

        :param dict headers: Response headers
        r]   	multipart)r   r    r#   typemultipart_reader_clsr   part_reader_clsr   )r   r   r  r  s       r=   rA  z MultipartReader._get_part_readere  s     L"--!%((=K''(0!tDzz'4=999,,WdmDDD''OOOr<   c                 (   t          | j        t                             }|j        dk    s
J d            d|j        vr"t          d| j        t                   z            |j        d         }t          |          dk    rt          d|z            |S )NrC  z!multipart/* content type expectedr   z$boundary missed for Content-Type: %sF   z&boundary %r is too long (70 chars max))r#   r   r    rD  r  r   r   )r   r  r   s      r=   r,  zMultipartReader._get_boundaryy  s    !$,|"<==}+++-P+++X0006l9SS   &z2x==2EPQQQr<   c                    K   | j         r| j                                         S | j                                         d {V S rE   )r   ro   r   r   r   s    r=   	_readlinezMultipartReader._readline  sJ      < 	&<##%%%]++---------r<   c                    K   	 |                                   d {V }|dk    rt          d| j        z            |                                }|| j        k    rd S || j        dz   k    r	d| _        d S p)NTr<   z#Could not find starting boundary %rr   )rJ  r   r   r   r   r   r   s     r=   r;  z*MultipartReader._read_until_first_boundary  s      	..********E|| 9T^L   LLNNE&&$.5000#	r<   c                   K   |                                   d {V                                 }|| j        k    rd S || j        dz   k    rd| _        |                                   d {V }|                                   d {V }|d d         dk    r| j                            |           d S | j                            ||g           d S t          d|d| j                  )Nr   TrP   zInvalid boundary z, expected )rJ  r   r   r   r   r   r   r   )r   r   epiloguer   s       r=   r<  zMultipartReader._read_boundary  s     ~~''''''''//11DN""Ddnu,,,DL!^^--------H"nn........I !}%%##I.....
 ##Y$9:::::WWWT^WWXXXr<   c                    K   dg}	 | j                                          d {V }|                                }|                    |           |snLt	                      }|                    |          \  }}|S )Nr<   )r   r   rq   r   r%   parse_headers)r   linesr   parserr   raw_headerss         r=   r@  zMultipartReader._read_headers  s      	-0022222222EKKMMELL 	 %33E::r<   c                    K   | j         e| j                                         s| j                                          d{V  | 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   s    r=   r:  z(MultipartReader._maybe_release_last_part  sx      ?&?))++ 0o--/////////L 7888"DOOO	 '&r<   r   )rA   r   )!r8   r9   r:   r   r   r4  rE  r0   rF  r   rh   r-   r   r   r   r   r   r   classmethodr7  rF   r   r   r   r=  rA  r,  r  rJ  r;  r<  r@  r:  r;   r<   r=   r.   r.     s$          4  $O'S 1 'L 'T ' ' ' '	'	(   
	%)>9:	;    " 
"   [    	%)>9:	;   $! ! ! !.	 .0	1. . . .P(P 
 .0	1P P P P(s     . . . . .
   Y Y Y Y.
 
 
 
# # # # # #r<   r.   c                   N    e Zd ZdZd dedee         ddf fdZd!dZd	eee	                  d
ee	         dee
         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                  defdZdedefdZ	 d"dedeee                  defdZ	 d"de e!e"eef                  e#eef         f         deee                  defdZ$edee         fd            Z%d#dededdfdZ& xZ'S )$r/   zMultipart body writer.mixedNsubtyper   rA   c                 "   ||nt          j                    j        }	 |                    d          | _        n# t
          $ r t          d          d w xY wd| d| j         }t                      	                    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   rX  r   r  r#  s       r=   r   zMultipartWriter.__init__  s    '3889I	S%__W55DNN! 	S 	S 	SGHHdR	SGWGG1EGGE222#%s	   : Ac                     | S rE   r;   r   s    r=   	__enter__zMultipartWriter.__enter__  r   r<   exc_typeexc_valexc_tbc                     d S rE   r;   )r   rd  re  rf  s       r=   __exit__zMultipartWriter.__exit__  s	     	r<   c                 *    t          | j                  S rE   )iterra  r   s    r=   __iter__zMultipartWriter.__iter__  s    DK   r<   c                 *    t          | j                  S rE   )r   ra  r   s    r=   __len__zMultipartWriter.__len__  s    4;r<   c                     dS )NTr;   r   s    r=   __bool__zMultipartWriter.__bool__  s    tr<   s   \A[!#$%&'*+\-.^_`|~\w]+\Zs   [\x00-\x08\x0A-\x1F\x7F]c                 N   | j         }t          j        | j        |          r|                    d          S t          j        | j        |          rt          d          |                    dd          }|                    dd          }d|                    d          z   dz   S )zzWrap boundary parameter value in quotes, if necessary.

        Reads self.boundary and returns a unicode string.
        rZ  z*boundary value contains invalid characters   \s   \\   "s   \"rL   )	r   ra   match_valid_tchar_regexr   search_invalid_qdtext_char_regexr   replace)r   ry   quoted_value_contents      r=   r`  zMultipartWriter._boundary_value  s    & 8D+U33 	)<<(((9T4e<< 	KIJJJ  %}}UG<<3;;D&II)00999C??r<   c                 6    | j                             d          S )NrZ  )r   r   r   s    r=   r   zMultipartWriter.boundary  s    ~$$W---r<   r6  r   c                 8   |t                      }t          |t                    r/|j                            |           |                     |          S 	 t          ||          }|                     |          S # t          $ r t          d|z            w xY w)Nr   zCannot create payload from %r)	r   
isinstancer)   r   updateappend_payloadr+   r'   	TypeError)r   r6  r   payloads       r=   r   zMultipartWriter.append  s    ?!mmGc7## 		4Kw'''&&s+++4%c7;;; **7333  G G G ?# EFFFGs   A< <Br  c                    |j                             t          d                                          }|r|dvrt	          d|           |dk    rd}|j                             t
          d                                          }|dvr"t	          d                    |                    |dk    rd}|j        }| |s|st          |          |j         t          <   | j
                            |||f           |S )	z)Adds a new body part to multipart writer.r]   )r   r   r   r  r   N)r]   r  r  r  r  r  )r   r   r   rp   r  r   r  r   rh   r   ra  r   )r   r  rz   te_encodingr   s        r=   r~  zMultipartWriter.append_payload)  s)    #*/"5"5#
 #
 %'' 	  	H(GGGFHFFGGGz!!H &-_%8%8%&
 &
 %'' 	 JJJ:AA+NN   (""K |X.1$iiGON+GX{;<<<r<   c                 j    |t                      }|                     t          ||                    S )zHelper to append JSON part.Nr{  )r   r~  r&   )r   r6  r   s      r=   append_jsonzMultipartWriter.append_jsonI  s3     ?!mmG"";sG#D#D#DEEEr<   c                 6   t          |t          t          f          sJ |t                      }t          |t                    r!t	          |                                          }t          |d          }|                     t          ||d                    S )z&Helper to append form urlencoded part.NT)doseqz!application/x-www-form-urlencoded)r   r[  )	r|  r   r   r   listr   r   r~  r*   )r   r6  r   r   s       r=   append_formzMultipartWriter.append_formR  s     #'233333?!mmGc7## 	$syy{{##CD)))""g4W  
 
 	
r<   c                    d}| j         D ]^\  }}}|s	|s|j         dS |t          dt          | j                  z   dz   |j        z   t          |j                  z   dz             z  }_|dt          | j                  z   dz   z  }|S )zSize of the payload.r   NrP      )ra  r   r   r   r   _binary_headers)r   totalr   rz   r  s        r=   r   zMultipartWriter.sizeg  s     +/; 	 	'D(K ; $)*;ttSdn%%& ) d*++	,
   EE 	S(((1,,r<   Tr$  close_boundaryc                 `  K   | j         D ]\  }}}|                    d| j        z   dz              d{V  |                    |j                   d{V  |s|rst	          |          }|r|                    |           |r|                    |           |                    |           d{V  |                                 d{V  n|                    |           d{V  |                    d           d{V  |r(|                    d| j        z   dz              d{V  dS dS )zWrite body.r   r   Ns   --
)ra  r&  r   r  MultipartPayloadWriterenable_compressionenable_encoding	write_eof)r   r$  r  r   rz   r  ws          r=   r&  zMultipartWriter.write{  s     +/; 	( 	('D(K,,ut~5?@@@@@@@@@,,t3444444444 	); 	)*622 3((222 3%%k222jjmm#######kkmm########jj(((((((((,,w'''''''''' 	C,,ut~5	ABBBBBBBBBBB	C 	Cr<   )rW  N)rA   r/   rE   )T)(r8   r9   r:   r   rh   r   r   rc  r   BaseExceptionr   rh  r
   _Partrk  r   rm  rF   ro  ra   compilert  rv  propertyr`  r   r   r   r)   r   r~  r  r   r   r   r   r  r   r&  r(  r)  s   @r=   r/   r/     s          & & &# &RV & & & & & &"   4./ -( '	
 
   !(5/ ! ! ! !         $     $$ABB!+,H!I!I@ @ @ @ X@> .# . . . X.4 4# 4c1B(C 4w 4 4 4 4g '    B @DF FF!),s*;!<F	F F F F 04
 
8E#s(O,gc3h.??@
 ,s+,
 
	
 
 
 
* hsm    X&C C# Ct Ct C C C C C C C Cr<   r/   c                   j    e Zd ZdeddfdZdeddfdZdej        fdede	ddfd	Z
dd
ZdeddfdZdS )r  r$  rA   Nc                 >    || _         d | _        d | _        d | _        d S rE   )_writer	_encoding	_compress_encoding_buffer)r   r$  s     r=   r   zMultipartPayloadWriter.__init__  s%    (,3759r<   rz   c                 h    |dk    r|| _         t                      | _        d S |dk    r	d| _         d S d S )Nr  r  )r  r   r  )r   rz   s     r=   r  z&MultipartPayloadWriter.enable_encoding  sE    x%DN$-KKD!!!+++/DNNN ,+r<   r   strategyc                 4    t          |d|          | _        d S )NT)rz   r   r  )r   r  )r   rz   r  s      r=   r  z)MultipartPayloadWriter.enable_compression  s'     ($(
 
 
r<   c                 ,  K   | j         =| j                                         }|r"d | _         |                     |           d {V  | j        dk    r@| j        r;| j                            t          j        | j                             d {V  d S d S d S )Nr  )r  flushr&  r  r  r  r  	b64encoderL  s     r=   r  z MultipartPayloadWriter.write_eof  s      >%N((**E (!%jj'''''''''>X%%$ Rl(()9$:O)P)PQQQQQQQQQQQ &%R Rr<   r   c                 t  K   | j         &|r$| j                             |           d {V }|sd S | j        dk    r| j        }|J |                    |           |rxt          t          |          d          \  }}|d |dz           ||dz  d          c}| _        |r8t          j        |          }| j	        
                    |           d {V  d S d S d S | j        dk    r4| j	        
                    t          j        |                     d {V  d S | j	        
                    |           d {V  d S )Nr  r   r  )r  compressr  r  r   divmodr   r  r  r  r&  r  b2a_qp)r   r   bufdivmod	enc_chunkb64chunks          r=   r&  zMultipartPayloadWriter.write  s     >% "n55e<<<<<<<< F>X%%'C???JJu 7!#c((A..S47	#'	NCa		N0	40 7%/	::H,,,X666666666667 77 7 ^111,$$X_U%;%;<<<<<<<<<<<,$$U+++++++++++r<   r   )r8   r9   r:   r   r   rh   r  zlibZ_DEFAULT_STRATEGYr   r  r  r  r&  r;   r<   r=   r  r    s        :s :t : : : :0 0 0 0 0 0 (9P
 

36
	
 
 
 
	R 	R 	R 	R, ,4 , , , , , ,r<   r  )r~   )Mr  r  r   ra   r\  rm   r  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%   r  r&   r'   r(   r)   r*   r+   r,   streamsr-   __all__client_reqrepr5   RuntimeWarningr1   r2   rh   r3   r4   r   r0   	try_firstr  r.   r  r/   r  r;   r<   r=   <module>r     s      				                                                7 6 6 6 6 6 6 6 6 6 A A A A A A A A A A ? ? ? ? ? ? ? ?              8 7 7 7 7 7 7 7 7 7 7 7                        " ! ! ! ! !  .------	 	 	 	 	. 	 	 		 	 	 	 	 	 	 	`$SM`$
8C=$sCx.()`$ `$ `$ `$H ,6 CH%(c]   B," ," ," ," ," ," ," ,"^{@ {@ {@ {@ {@ {@ {@ {@| nEO4447 7 7 7 7G 7 7 547*t# t# t# t# t# t# t# t#n 	gsC DC DC DC DC DCg DC DC DCN7, 7, 7, 7, 7, 7, 7, 7, 7, 7,r<   