Ë
    RPfµ"  ã                  óÀ   — d dl m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mZmZ ddlmZmZmZmZmZ 	 	 	 	 dd„Z G d„ d	«      Z G d
„ d«      Z G d„ dee«      Zy)é    )ÚannotationsN)ÚPathé   )ÚAsyncByteStreamÚFileContentÚ	FileTypesÚRequestDataÚRequestFilesÚSyncByteStream)Úformat_form_paramÚguess_content_typeÚpeek_filelike_lengthÚprimitive_value_to_strÚto_bytesc                ó  — | r| j                  d«      sy d| v rp| j                  d«      D ]\  }|j                  «       j                  «       j                  d«      sŒ1|j                  «       t	        d«      d  j                  d«      c S  y )Ns   multipart/form-dataó   ;s	   boundary=ó   ")Ú
startswithÚsplitÚstripÚlowerÚlen)Úcontent_typeÚsections     úJ/var/www/fastapitest/venv/lib/python3.12/site-packages/httpx/_multipart.pyÚ(get_multipart_boundary_from_content_typer      s„   € ñ ˜|×6Ñ6Ð7MÔNØð ˆ|ÑØ#×)Ñ)¨$Ó/ò 	HˆGØ�}‰}‹×$Ñ$Ó&×1Ñ1°,Õ?Ø—}‘}“¤s¨<Ó'8Ð':Ð;×AÑAÀ$ÓGÒGð	Hð ó    c                  ó8   — e Zd ZdZdd„Zd	d„Zd	d„Zd
d„Zdd„Zy)Ú	DataFieldzB
    A single form field item, within a multipart form field.
    c                ó.  — t        |t        «      st        dt        |«      › d|›�«      ‚|�:t        |t        t        t
        t        f«      st        dt        |«      › d|›�«      ‚|| _        t        |t        «      r|| _	        y t        |«      | _	        y )Nz)Invalid type for name. Expected str, got ú: z5Invalid type for value. Expected primitive type, got )
Ú
isinstanceÚstrÚ	TypeErrorÚtypeÚbytesÚintÚfloatÚnamer   Úvalue)Úselfr)   r*   s      r   Ú__init__zDataField.__init__,   s˜   € Ü˜$¤Ô$ÜØ;¼DÀ»J¸<ÀrÈ$ÈÐRóð ð Ð¤Z°¼¼UÄCÌÐ7OÔ%PÜðÜ˜U›�} B u ið1óð ð ˆŒ	ä ¤uÔ-ˆEð 	�
Ü3IÈ%Ó3Pð 	�
r   c                ó�   — t        | d«      s/t        d| j                  «      }dj                  d|dg«      | _        | j                  S )NÚ_headersr)   r   ó    Content-Disposition: form-data; ó   

)Úhasattrr   r)   Újoinr.   )r+   r)   s     r   Úrender_headerszDataField.render_headers;   sB   € Ü�t˜ZÔ(Ü$ V¨T¯Y©YÓ7ˆDØŸH™HØ4°d¸KÐHóˆDŒMð �}‰}Ðr   c                óf   — t        | d«      st        | j                  «      | _        | j                  S )NÚ_data)r1   r   r*   r5   ©r+   s    r   Úrender_datazDataField.render_dataD   s&   € Ü�t˜WÔ%Ü! $§*¡*Ó-ˆDŒJà�z‰zÐr   c                óp   — | j                  «       }| j                  «       }t        |«      t        |«      z   S ©N)r3   r7   r   )r+   ÚheadersÚdatas      r   Ú
get_lengthzDataField.get_lengthJ   s1   € Ø×%Ñ%Ó'ˆØ×ÑÓ!ˆÜ�7‹|œc $›iÑ'Ð'r   c              #  óT   K  — | j                  «       –— | j                  «       –— y ­wr9   ©r3   r7   r6   s    r   ÚrenderzDataField.renderO   s$   è ø€ Ø×!Ñ!Ó#Ò#Ø×ÑÓ Ó ùs   ‚&(N)r)   r#   r*   z str | bytes | int | float | NoneÚreturnÚNone©r@   r&   )r@   r'   ©r@   ztyping.Iterator[bytes])	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r,   r3   r7   r<   r?   © r   r   r   r   '   s    „ ñó
óóó(ô
!r   r   c                  ó<   — e Zd ZdZdZd	d„Zd
d„Zdd„Zdd„Zdd„Z	y)Ú	FileFieldzB
    A single file field item, within a multipart form field.
    i   c           	     ó   — || _         i }d }t        |t        «      r1t        |«      dk(  r|\  }}nHt        |«      dk(  r|\  }}}n3|\  }}}}n+t	        t        t        |dd«      «      «      j                   }|}|€t        |«      }t        d„ |D «       «      }|�|s||d<   t        |t        j                  «      rt        d«      ‚t        |t        j                  «      rt        d«      ‚|| _        || _        || _        y )	Né   é   r)   Úuploadc              3  ó@   K  — | ]  }d |j                  «       v –— Œ y­w)zcontent-typeN)r   )Ú.0Úkeys     r   ú	<genexpr>z%FileField.__init__.<locals>.<genexpr>x   s   è ø€ Ò%WÈ n¸¿	¹	»Ô&CÑ%Wùó   ‚úContent-Typez?Multipart file uploads require 'io.BytesIO', not 'io.StringIO'.zDMultipart file uploads must be opened in binary mode, not text mode.)r)   r"   Útupler   r   r#   Úgetattrr   ÚanyÚioÚStringIOr$   Ú
TextIOBaseÚfilenameÚfiler:   )r+   r)   r*   r:   r   r[   ÚfileobjÚhas_content_type_headers           r   r,   zFileField.__init__[   s  € ØˆŒ	ð #%ˆØ#'ˆô �eœUÔ#Ü�5‹z˜QŠð %*Ñ!�™'Ü�U“˜q’Ø27Ñ/�˜'¡<ð <AÑ8�˜' <±äœC¤¨¨v°xÓ @ÓAÓB×GÑGˆHØˆGàÐÜ-¨hÓ7ˆLä"%Ñ%WÈwÔ%WÓ"WÐØÐ#Ñ,Cð '3ˆG�NÑ#ä�gœrŸ{™{Ô+ÜØQóð ô �gœrŸ}™}Ô-ÜØVóð ð !ˆŒØˆŒ	Øˆ�r   c                ó  — | j                  «       }t        | j                  t        t        f«      r*t        |«      t        t        | j                  «      «      z   S t        | j                  «      }|€y t        |«      |z   S r9   )r3   r"   r\   r#   r&   r   r   r   )r+   r:   Úfile_lengths      r   r<   zFileField.get_lengthŒ   sg   € Ø×%Ñ%Ó'ˆä�d—i‘i¤#¤u Ô.Ü�w“<¤#¤h¨t¯y©yÓ&9Ó":Ñ:Ð:ä*¨4¯9©9Ó5ˆð ÐØä�7‹|˜kÑ)Ð)r   c                óÌ  — t        | d«      sÍdt        d| j                  «      g}| j                  r)t        d| j                  «      }|j	                  d|g«       | j
                  j                  «       D ]<  \  }}d|› d�j                  «       |j                  «       }}|j	                  ||g«       Œ> |j                  d«       d	j                  |«      | _
        | j                  S )
Nr.   r/   r)   r[   s   ; z
r!   r0   r   )r1   r   r)   r[   Úextendr:   ÚitemsÚencodeÚappendr2   r.   )r+   Úpartsr[   Úheader_nameÚheader_valuerQ   Úvals          r   r3   zFileField.render_headers›   sÊ   € Ü�t˜ZÔ(à3Ü! &¨$¯)©)Ó4ðˆEð �}Š}Ü,¨Z¸¿¹ÓG�Ø—‘˜e XÐ.Ô/Ø-1¯\©\×-?Ñ-?Ó-Aò )Ñ)�˜\Ø! + ¨bÐ1×8Ñ8Ó:¸L×<OÑ<OÓ<Q�S�Ø—‘˜c 3˜ZÕ(ð)ð �L‰L˜Ô%ØŸH™H U›OˆDŒMà�}‰}Ðr   c              #  óÌ  K  — t        | j                  t        t        f«      rt	        | j                  «      –— y t        | j                  d«      r	 | j                  j                  d«       | j                  j                  | j                  «      }|r6t	        |«      –— | j                  j                  | j                  «      }|rŒ5y y # t        j                  $ r Y Œsw xY w­w)NÚseekr   )r"   r\   r#   r&   r   r1   rk   rX   ÚUnsupportedOperationÚreadÚ
CHUNK_SIZE©r+   Úchunks     r   r7   zFileField.render_data¬   s¦   è ø€ Ü�d—i‘i¤#¤u Ô.Ü˜4Ÿ9™9Ó%Ò%Øä�4—9‘9˜fÔ%ðØ—	‘	—‘˜qÔ!ð —	‘	—‘˜tŸ™Ó/ˆÙÜ˜5“/Ò!Ø—I‘I—N‘N 4§?¡?Ó3ˆEô øô	 ×*Ñ*ò Ùðüs1   ‚AC$ÁC Á-AC$Ã	C$ÃC!ÃC$Ã C!Ã!C$c              #  ód   K  — | j                  «       –— | j                  «       E d {  –—†  y 7 Œ­wr9   r>   r6   s    r   r?   zFileField.render¼   s'   è ø€ Ø×!Ñ!Ó#Ò#Ø×#Ñ#Ó%×%Ò%ús   ‚&0¨.©0N)r)   r#   r*   r   r@   rA   ©r@   z
int | NonerB   rC   )
rD   rE   rF   rG   rn   r,   r<   r3   r7   r?   rH   r   r   rJ   rJ   T   s(   „ ñð €Jó/ób*óó"4ô &r   rJ   c                  óf   — e Zd ZdZ	 d
	 	 	 	 	 	 	 dd„Z	 	 	 	 	 	 dd„Zdd„Zdd„Zdd„Zdd„Z	dd	„Z
y)ÚMultipartStreamzC
    Request content as streaming multipart encoded form data.
    Nc                óì   — |€2t        j                  d«      j                  «       j                  d«      }|| _        d|j                  d«      z  | _        t        | j                  ||«      «      | _	        y )Né   Úasciiz multipart/form-data; boundary=%s)
ÚosÚurandomÚhexrd   ÚboundaryÚdecoder   ÚlistÚ_iter_fieldsÚfields)r+   r;   Úfilesr{   s       r   r,   zMultipartStream.__init__Æ   si   € ð ÐÜ—z‘z "“~×)Ñ)Ó+×2Ñ2°7Ó;ˆHà ˆŒØ>ÀÇÁØóB
ñ 
ˆÔô ˜4×,Ñ,¨T°5Ó9Ó:ˆ�r   c              #  ó>  K  — |j                  «       D ]A  \  }}t        |t        t        f«      r|D ]  }t	        ||¬«      –— Œ Œ3t	        ||¬«      –— ŒC t        |t
        j                  «      r|j                  «       n|}|D ]  \  }}t        ||¬«      –— Œ y ­w)N)r)   r*   )rc   r"   rU   r}   r   ÚtypingÚMappingrJ   )r+   r;   r€   r)   r*   ÚitemÚ
file_itemss          r   r~   zMultipartStream._iter_fieldsÕ   s–   è ø€ ð  Ÿ:™:›<ò 	8‰KˆD�%Ü˜%¤%¬ Ô/Ø!ò ;�DÜ#¨°TÔ:Ó:ñ;ô   T°Ô7Ó7ð	8ô '1°¼¿¹Ô&G�U—[‘[”]ÈUˆ
Ø%ò 	4‰KˆD�%Ü ¨UÔ3Ó3ñ	4ùs   ‚BBc              #  ó®   K  — | j                   D ]/  }d| j                  z  –— |j                  «       E d {  –—†  d–— Œ1 d| j                  z  –— y 7 Œ­w)Ns   --%s
s   
s   --%s--
)r   r{   r?   )r+   Úfields     r   Úiter_chunkszMultipartStream.iter_chunksã   sR   è ø€ Ø—[‘[ò 	ˆEØ §¡Ñ-Ò-Ø—|‘|“~×%Ð%Ø‹Mð	ð ˜dŸm™mÑ+Ó+ð &ús   ‚4A¶A·Ac                ó¾   — t        | j                  «      }d}| j                  D ]+  }|j                  «       }|€ y|d|z   dz   z  }||z  }|dz  }Œ- |d|z   dz   z  }|S )zœ
        Return the length of the multipart encoded content, or `None` if
        any of the files have a length that cannot be determined upfront.
        r   NrL   é   )r   r{   r   r<   )r+   Úboundary_lengthÚlengthr‡   Úfield_lengths        r   Úget_content_lengthz"MultipartStream.get_content_lengthê   sƒ   € ô
 ˜dŸm™mÓ,ˆØˆà—[‘[ò 	ˆEØ ×+Ñ+Ó-ˆLØÐ#Ùà�a˜/Ñ)¨AÑ-Ñ-ˆFØ�lÑ"ˆFØ�a‰K‰Fð	ð 	�!�oÑ%¨Ñ)Ñ)ˆØˆr   c                ód   — | j                  «       }| j                  }|€d|dœS t        |«      |dœS )NÚchunked)zTransfer-EncodingrT   )zContent-LengthrT   )rŽ   r   r#   )r+   Úcontent_lengthr   s      r   Úget_headerszMultipartStream.get_headers   s<   € Ø×0Ñ0Ó2ˆØ×(Ñ(ˆØÐ!Ø)2ÀLÑQÐQÜ"% nÓ"5À|ÑTÐTr   c              #  ó>   K  — | j                  «       D ]  }|–— Œ y ­wr9   ©rˆ   ro   s     r   Ú__iter__zMultipartStream.__iter__  s#   è ø€ Ø×%Ñ%Ó'ò 	ˆEØ‹Kñ	ùs   ‚c               ó@   K  — | j                  «       D ]  }|­–— Œ	 y ­wr9   r”   ro   s     r   Ú	__aiter__zMultipartStream.__aiter__  s#   è ø€ Ø×%Ñ%Ó'ò 	ˆEØŒKñ	ùrS   r9   )r;   r	   r€   r
   r{   úbytes | Noner@   rA   )r;   r	   r€   r
   r@   z&typing.Iterator[FileField | DataField]rC   rr   )r@   zdict[str, str])r@   ztyping.AsyncIterator[bytes])rD   rE   rF   rG   r,   r~   rˆ   rŽ   r’   r•   r—   rH   r   r   rt   rt   Á   sn   „ ñð "&ð	;àð;ð ð;ð ð	;ð
 
ó;ð4Øð4Ø(4ð4à	/ó4ó,óó,Uóôr   rt   )r   r˜   r@   r˜   )Ú
__future__r   rX   rx   r‚   Úpathlibr   Ú_typesr   r   r   r	   r
   r   Ú_utilsr   r   r   r   r   r   r   rJ   rt   rH   r   r   ú<module>r�      se   ðÝ "ã 	Û 	Û Ý ÷÷ ÷õ ðØðàó÷*!ñ *!÷Zj&ñ j&ôZL�n oõ Lr   