o
    ùT·j"'  ã                   @  s  d dl m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mZmZ ddlmZmZmZ ddd	œZe d
d„ edƒD ƒ¡ e d dd„ e ¡ D ƒ¡¡Ze d¡Ze d¡Zd'dd„Zd(dd„Zd)dd „ZG d!d"„ d"ƒZ G d#d$„ d$ƒZ!G d%d&„ d&ee
ƒZ"dS )*é    )ÚannotationsN)ÚPathé   )ÚAsyncByteStreamÚFileContentÚ	FileTypesÚRequestDataÚRequestFilesÚSyncByteStream)Úpeek_filelike_lengthÚprimitive_value_to_strÚto_bytesz%22z\\)ú"ú\c                 C  s&   i | ]}|d krt |ƒd|d›�“qS )é   ú%Ú02X)Úchr©Ú.0Úc© r   úT/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/httpx2/_multipart.pyÚ
<dictcomp>   s   & r   é    ú|c                 C  s   g | ]}t  |¡‘qS r   )ÚreÚescaper   r   r   r   Ú
<listcomp>   s    r   z[!#$%&'*+\-.^_`|~0-9A-Za-z]+z[\x00-\x08\x0a-\x1f\x7f]ÚnameÚstrÚvalueÚreturnÚbytesc                 C  s*   d
dd„}t  ||¡}| › d|› d� ¡ S )z;
    Encode a name/value pair within a multipart form.
    Úmatchútyping.Match[str]r"   r    c                 S  s   t |  d¡ S )Nr   )Ú!_HTML5_FORM_ENCODING_REPLACEMENTSÚgroup)r$   r   r   r   Úreplacer$   s   z$_format_form_param.<locals>.replacerz="r   N)r$   r%   r"   r    )Ú_HTML5_FORM_ENCODING_REÚsubÚencode)r   r!   r(   r   r   r   Ú_format_form_param   s   
r,   Úfilenameú
str | Nonec                 C  s   | rt  | ¡d p
dS dS )z‘
    Guesses the mimetype based on a filename. Defaults to `application/octet-stream`.

    Returns `None` if `filename` is `None` or empty.
    r   zapplication/octet-streamN)Ú	mimetypesÚ
guess_type)r-   r   r   r   Ú_guess_content_type+   s   r1   Úcontent_typeúbytes | Nonec                 C  s^   | r|   d¡s	d S d| v r-|  d¡D ]}| ¡  ¡   d¡r,| ¡ tdƒd …  d¡  S qd S )Ns   multipart/form-dataó   ;s	   boundary=ó   ")Ú
startswithÚsplitÚstripÚlowerÚlen)r2   Úsectionr   r   r   Ú(get_multipart_boundary_from_content_type6   s   ÿr<   c                   @  sB   e Zd ZdZddd	„Zddd„Zddd„Zddd„Zddd„ZdS )Ú	DataFieldzB
    A single form field item, within a multipart form field.
    r   r    r!   ú str | bytes | int | float | Noner"   ÚNonec                 C  s|   t |tƒstdt|ƒ› d|›�ƒ‚|d ur*t |ttttfƒs*tdt|ƒ› d|›�ƒ‚|| _t |tƒr7|| _	d S t|ƒ| _	d S )Nz)Invalid type for name. Expected str, got ú: z5Invalid type for value. Expected primitive type, got )
Ú
isinstancer    Ú	TypeErrorÚtyper#   ÚintÚfloatr   r   r!   )Úselfr   r!   r   r   r   Ú__init__I   s   
"zDataField.__init__r#   c                 C  s.   t | dƒstd| jƒ}d d|dg¡| _| jS )NÚ_headersr   ó    ó    Content-Disposition: form-data; ó   

)Úhasattrr,   r   ÚjoinrH   )rF   r   r   r   r   Úrender_headersQ   s   
zDataField.render_headersc                 C  s   t | dƒst| jƒ| _| jS )NÚ_data)rL   r   r!   rO   ©rF   r   r   r   Úrender_dataX   s   
zDataField.render_datarD   c                 C  s    |   ¡ }|  ¡ }t|ƒt|ƒ S ©N)rN   rQ   r:   )rF   ÚheadersÚdatar   r   r   Ú
get_length^   s   zDataField.get_lengthútyping.Iterator[bytes]c                 c  s   � |   ¡ V  |  ¡ V  d S rR   ©rN   rQ   rP   r   r   r   Úrenderc   s   €
zDataField.renderN)r   r    r!   r>   r"   r?   ©r"   r#   )r"   rD   ©r"   rV   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__rG   rN   rQ   rU   rX   r   r   r   r   r=   D   s    



r=   c                   @  sF   e Zd ZdZdZdd	d
„Zddd„Zddd„Zddd„Zddd„Z	dS )Ú	FileFieldzB
    A single file field item, within a multipart form field.
    i   r   r    r!   r   r"   r?   c                 C  sâ   || _ i }d }t|tƒr*t|ƒdkr|\}}n t|ƒdkr#|\}}}n|\}}}}nttt|ddƒƒƒj }|}|d u r?t|ƒ}tdd„ |D ƒƒ}|d urR|sR||d< t|t	j
ƒr\tdƒ‚t|t	jƒrftd	ƒ‚|| _|| _|| _d S )
Né   é   r   Úuploadc                 s  s   � | ]	}d |  ¡ v V  qdS )zcontent-typeN)r9   )r   Úkeyr   r   r   Ú	<genexpr>Œ   s   € z%FileField.__init__.<locals>.<genexpr>úContent-Typez?Multipart file uploads require 'io.BytesIO', not 'io.StringIO'.zDMultipart file uploads must be opened in binary mode, not text mode.)r   rA   Útupler:   r   r    Úgetattrr1   ÚanyÚioÚStringIOrB   Ú
TextIOBaser-   ÚfilerS   )rF   r   r!   rS   r2   r-   ÚfileobjÚhas_content_type_headerr   r   r   rG   o   s.   


zFileField.__init__ú
int | Nonec                 C  sP   |   ¡ }t| jttfƒrt|ƒtt| jƒƒ S t| jƒ}|d u r"d S t|ƒ| S rR   )rN   rA   rl   r    r#   r:   r   r   )rF   rS   Úfile_lengthr   r   r   rU   œ   s   
zFileField.get_lengthr#   c                 C  s¾   t | dƒs\dtd| jƒg}| jrtd| jƒ}| d|g¡ | j ¡ D ].\}}t |¡d u r1t	dƒ‚t
 |¡d ur<t	dƒ‚d|› d	� ¡ | ¡ }}| ||g¡ q"| d
¡ d |¡| _| jS )NrH   rJ   r   r-   s   ; zInvalid multipart header name.z4Invalid control character in multipart header value.z
r@   rK   rI   )rL   r,   r   r-   ÚextendrS   ÚitemsÚ_HEADER_NAME_REÚ	fullmatchÚ
ValueErrorÚ _FORBIDDEN_HEADER_VALUE_CHARS_REÚsearchr+   ÚappendrM   rH   )rF   Úpartsr-   Úheader_nameÚheader_valuerc   Úvalr   r   r   rN   «   s"   

þ
zFileField.render_headersrV   c                 c  sŠ   � t | jttfƒrt| jƒV  d S t| jdƒr*z| j d¡ W n
 tjy)   Y nw | j 	| j
¡}|rCt|ƒV  | j 	| j
¡}|s3d S d S )NÚseekr   )rA   rl   r    r#   r   rL   r}   ri   ÚUnsupportedOperationÚreadÚ
CHUNK_SIZE©rF   Úchunkr   r   r   rQ   À   s   €ÿ
þzFileField.render_datac                 c  s   � |   ¡ V  |  ¡ E d H  d S rR   rW   rP   r   r   r   rX   Ð   s   €
zFileField.renderN)r   r    r!   r   r"   r?   ©r"   ro   rY   rZ   )
r[   r\   r]   r^   r€   rG   rU   rN   rQ   rX   r   r   r   r   r_   h   s    

-

r_   c                   @  sZ   e Zd ZdZ	dddd„Zd dd„Zd!dd„Zd"dd„Zd#dd„Zd!dd„Z	d$dd„Z
dS )%ÚMultipartStreamzC
    Request content as streaming multipart encoded form data.
    NrT   r   Úfilesr	   Úboundaryr3   r"   r?   c                 C  sJ   |d u rt  d¡ ¡  d¡}|| _d| d¡› �| _t|  ||¡ƒ| _	d S )Né   Úasciizmultipart/form-data; boundary=)
ÚosÚurandomÚhexr+   r†   Údecoder2   ÚlistÚ_iter_fieldsÚfields)rF   rT   r…   r†   r   r   r   rG   Ú   s
   zMultipartStream.__init__ú&typing.Iterator[FileField | DataField]c                 c  s‚   � |  ¡ D ]\}}t|ttfƒr|D ]	}t||d�V  qqt||d�V  qt|tjƒr/|  ¡ n|}|D ]\}}t||d�V  q3d S )N)r   r!   )rr   rA   rf   r�   r=   ÚtypingÚMappingr_   )rF   rT   r…   r   r!   ÚitemÚ
file_itemsr   r   r   rŽ   ç   s   €ÿÿzMultipartStream._iter_fieldsrV   c                 c  s>   � | j D ]}d| j V  | ¡ E d H  dV  qd| j V  d S )Ns   --%s
s   
s   --%s--
)r�   r†   rX   )rF   Úfieldr   r   r   Úiter_chunksó   s   €
zMultipartStream.iter_chunksro   c                 C  sd   t | jƒ}d}| jD ]}| ¡ }|du r dS |d| d 7 }||7 }|d7 }q
|d| d 7 }|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   Nr`   é   )r:   r†   r�   rU   )rF   Úboundary_lengthÚlengthr•   Úfield_lengthr   r   r   Úget_content_lengthú   s   


z"MultipartStream.get_content_lengthúdict[str, str]c                 C  s.   |   ¡ }| j}|d u rd|dœS t|ƒ|dœS )NÚchunked)zTransfer-Encodingre   )zContent-Lengthre   )r›   r2   r    )rF   Úcontent_lengthr2   r   r   r   Úget_headers  s
   
zMultipartStream.get_headersc                 c  s   � |   ¡ E d H  d S rR   ©r–   rP   r   r   r   Ú__iter__  s   €zMultipartStream.__iter__útyping.AsyncIterator[bytes]c                 C s   �|   ¡ D ]}|V  qd S rR   r    r�   r   r   r   Ú	__aiter__  s   €ÿzMultipartStream.__aiter__rR   )rT   r   r…   r	   r†   r3   r"   r?   )rT   r   r…   r	   r"   r�   rZ   rƒ   )r"   rœ   )r"   r¢   )r[   r\   r]   r^   rG   rŽ   r–   r›   rŸ   r¡   r£   r   r   r   r   r„   Õ   s    ü




r„   )r   r    r!   r    r"   r#   )r-   r.   r"   r.   )r2   r3   r"   r3   )#Ú
__future__r   ri   r/   r‰   r   r‘   Úpathlibr   Ú_typesr   r   r   r   r	   r
   Ú_utilsr   r   r   r&   ÚupdateÚrangeÚcompilerM   Úkeysr)   rs   rv   r,   r1   r<   r=   r_   r„   r   r   r   r   Ú<module>   s(     





$m