o
    Eh
2                     @   s$  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	 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mZmZmZ G d	d
 d
e
je
jZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZ				ddededej de!def
ddZ"dS )    N)dumps)Path)	urlencode   )StreamConsumed)FileContent	FileTypesRequestDataRequestFiles)format_form_paramguess_content_typepeek_filelike_lengthto_bytesc                   @   sn   e Zd Zdejeef fddZdefddZdej	e
 fddZdd	d
Zdeje
 fddZdddZdS )ContentStreamreturnc                 C   s   i S )zR
        Return a dictionary of headers that are implied by the encoding.
         selfr   r   Q/var/www/html/env_mimamsha/lib/python3.10/site-packages/httpx/_content_streams.pyget_headers   s   zContentStream.get_headersc                 C      dS )z
        Return `True` if `__aiter__` can be called multiple times.

        We need this in cases such determining if we can re-issue a request
        body when we receive a redirect response.
        Tr   r   r   r   r   
can_replay   s   zContentStream.can_replayc                 c   s    dV  d S N    r   r   r   r   r   __iter__$      
zContentStream.__iter__Nc                 C   s   d S Nr   r   r   r   r   close'      zContentStream.closec                 C  s   dV  d S r   r   r   r   r   r   	__aiter__*   r   zContentStream.__aiter__c                    s   d S r   r   r   r   r   r   aclose-   s   zContentStream.acloser   N)__name__
__module____qualname__typingDictstrr   boolr   Iteratorbytesr   r   AsyncIteratorr   r    r   r   r   r   r      s    	
r   c                   @   sl   e Zd ZdZdejeef ddfddZdej	eef fddZ
deje fd	d
Zdeje fddZdS )
ByteStreamz1
    Request content encoded as plain bytes.
    bodyr   Nc                 C   s$   t |tr|d| _d S || _d S Nutf-8)
isinstancer'   encoder-   )r   r-   r   r   r   __init__6   s   $zByteStream.__init__c                 C   s    | j si S tt| j }d|iS )NContent-Length)r-   r'   len)r   content_lengthr   r   r   r   9   s   zByteStream.get_headersc                 c       | j V  d S r   r-   r   r   r   r   r   ?      zByteStream.__iter__c                 C     | j V  d S r   r7   r   r   r   r   r   B   r8   zByteStream.__aiter__)r"   r#   r$   __doc__r%   Unionr'   r*   r2   r&   r   r)   r   r+   r   r   r   r   r   r,   1   s    r,   c                   @   s   e Zd ZdZ	ddeje dejddfddZde	fdd	Z
dejeef fd
dZdeje fddZdeje fddZdddZdS )IteratorStreamzI
    Request content encoded as plain bytes, using an byte iterator.
    Niterator
close_funcr   c                 C      || _ || _d| _d S NF)r=   r>   is_stream_consumed)r   r=   r>   r   r   r   r2   K      
zIteratorStream.__init__c                 C   r   r@   r   r   r   r   r   r   R   r   zIteratorStream.can_replayc                 C      ddiS NzTransfer-Encodingchunkedr   r   r   r   r   r   U      zIteratorStream.get_headersc                 c   s*    | j rt d| _ | jD ]}|V  qd S NT)rA   r   r=   r   partr   r   r   r   X   s   
zIteratorStream.__iter__c                 C      t d)Nz5Attempted to call a async iterator on an sync stream.RuntimeErrorr   r   r   r   r   _   rF   zIteratorStream.__aiter__c                 C   s   | j d ur|    d S d S r   r>   r   r   r   r   r   b   s   
zIteratorStream.closer   r!   )r"   r#   r$   r:   r%   r)   r*   Callabler2   r(   r   r&   r'   r   r   r+   r   r   r   r   r   r   r<   F   s    
r<   c                   @   s   e Zd ZdZ	ddeje dejddfddZde	fdd	Z
dejeef fd
dZdeje fddZdeje fddZdddZdS )AsyncIteratorStreamzO
    Request content encoded as plain bytes, using an async byte iterator.
    N	aiteratorr>   r   c                 C   r?   r@   )rP   r>   rA   )r   rP   r>   r   r   r   r2   l   rB   zAsyncIteratorStream.__init__c                 C   r   r@   r   r   r   r   r   r   s   r   zAsyncIteratorStream.can_replayc                 C   rC   rD   r   r   r   r   r   r   v   rF   zAsyncIteratorStream.get_headersc                 C   rJ   )Nz5Attempted to call a sync iterator on an async stream.rK   r   r   r   r   r   y   rF   zAsyncIteratorStream.__iter__c                 C  s4   | j rt d| _ | j2 z	3 d H W }|V  q6 d S rG   )rA   r   rP   rH   r   r   r   r   |   s   zAsyncIteratorStream.__aiter__c                    s"   | j d ur|   I d H  d S d S r   rM   r   r   r   r   r       s   
zAsyncIteratorStream.acloser   r!   )r"   r#   r$   r:   r%   r+   r*   rN   r2   r(   r   r&   r'   r   r)   r   r   r    r   r   r   r   rO   g   s    
rO   c                   @   sd   e Zd ZdZdejddfddZdejeef fddZ	dej
e fd	d
Zdeje fddZdS )
JSONStreamz*
    Request content encoded as JSON.
    jsonr   Nc                 C   s   t |d| _d S r.   )
json_dumpsr1   r-   )r   rR   r   r   r   r2         zJSONStream.__init__c                 C      t t| j}d}||dS )Nzapplication/jsonr3   zContent-Typer'   r4   r-   r   r5   content_typer   r   r   r         
zJSONStream.get_headersc                 c   r6   r   r7   r   r   r   r   r      r8   zJSONStream.__iter__c                 C  r9   r   r7   r   r   r   r   r      r8   zJSONStream.__aiter__)r"   r#   r$   r:   r%   Anyr2   r&   r'   r   r)   r*   r   r+   r   r   r   r   r   rQ      s    rQ   c                   @   sb   e Zd ZdZdeddfddZdejeef fddZ	dej
e fd	d
Zdeje fddZdS )URLEncodedStreamz3
    Request content as URL encoded form data.
    datar   Nc                 C   s   t |ddd| _d S )NT)doseqr/   )r   r1   r-   )r   r]   r   r   r   r2      s   zURLEncodedStream.__init__c                 C   rU   )Nz!application/x-www-form-urlencodedrV   rW   rX   r   r   r   r      rZ   zURLEncodedStream.get_headersc                 c   r6   r   r7   r   r   r   r   r      r8   zURLEncodedStream.__iter__c                 C  r9   r   r7   r   r   r   r   r      r8   zURLEncodedStream.__aiter__)r"   r#   r$   r:   dictr2   r%   r&   r'   r   r)   r*   r   r+   r   r   r   r   r   r\      s    r\   c                	   @   s   e Zd ZdZG dd dZG dd dZ	ddejded	e	d
dfddZ
dejded
ejejd  fddZd
eje	 fddZd
eje fddZd
efddZd
efddZd
ejeef fddZd
eje	 fddZd
eje	 fddZdS )MultipartStreamzC
    Request content as streaming multipart encoded form data.
    c                   @   s|   e Zd ZdZdedejeef ddfddZdefdd	Z	defd
dZ
defddZdefddZdeje fddZdS )zMultipartStream.DataFieldzJ
        A single form field item, within a multipart form field.
        namevaluer   Nc                 C   s8   t |ts	tdt |ttfstd|| _|| _d S )Nz$Invalid type for name. Expected str.z.Invalid type for value. Expected str or bytes.)r0   r'   	TypeErrorr*   ra   rb   )r   ra   rb   r   r   r   r2      s   

z"MultipartStream.DataField.__init__c                 C   s.   t | dstd| j}dd|dg| _| jS )N_headersra   r       Content-Disposition: form-data;    

)hasattrr   ra   joinrd   )r   ra   r   r   r   render_headers   s   
z(MultipartStream.DataField.render_headersc                 C   s0   t | dst| jtr| jn| jd| _| jS )N_datar/   )rg   r0   rb   r*   r1   rj   r   r   r   r   render_data   s   


z%MultipartStream.DataField.render_datac                 C   s    |   }|  }t|t| S r   )ri   rk   r4   )r   headersr]   r   r   r   
get_length   s   z$MultipartStream.DataField.get_lengthc                 C   r   rG   r   r   r   r   r   r      r   z$MultipartStream.DataField.can_replayc                 c   s    |   V  |  V  d S r   ri   rk   r   r   r   r   render   s   
z MultipartStream.DataField.render)r"   r#   r$   r:   r'   r%   r;   r*   r2   ri   rk   intrm   r(   r   r)   ro   r   r   r   r   	DataField   s     	
rq   c                   @   sx   e Zd ZdZdededdfddZdefdd	Zde	fd
dZ
deje	 fddZdefddZdeje	 fddZdS )zMultipartStream.FileFieldzJ
        A single file field item, within a multipart form field.
        ra   rb   r   Nc                 C   sz   || _ t|tr!z|\}}}W n" ty    |\}}t|}Y nw ttt|ddj }|}t|}|| _|| _	|| _
d S )Nra   upload)ra   r0   tuple
ValueErrorr   r   r'   getattrfilenamefilerY   )r   ra   rb   rv   fileobjrY   r   r   r   r2      s   

z"MultipartStream.FileField.__init__c                 C   s   |   }t| jttfrt|t| j S zt| j}W n ty9   t| dr*J t	| j
 | _t| j}Y nw t|| S )Nrj   )ri   r0   rw   r'   r*   r4   r   OSErrorrg   r   readrj   )r   rl   file_lengthr   r   r   rm      s   z$MultipartStream.FileField.get_lengthc                 C   sx   t | ds9dtd| jg}| jrtd| j}|d|g | jd ur.| j }|d|g |d d|| _	| j	S )	Nrd   re   ra   rv   s   ; s   
Content-Type: rf   r   )
rg   r   ra   rv   extendrY   r1   appendrh   rd   )r   partsrv   rY   r   r   r   ri     s   




z(MultipartStream.FileField.render_headersc                 c   sx    t | jttfrt| jV  d S t| dr| jV  d S | jD ]}t|V  q|  r:| j s2J | j	d d S d S )Nrj   r   )
r0   rw   r'   r*   r   rg   rj   r   seekableseekr   chunkr   r   r   rk     s   

z%MultipartStream.FileField.render_datac                 C   s   t | jttfr
dS | j S rG   )r0   rw   r'   r*   r   r   r   r   r   r   .  s   z$MultipartStream.FileField.can_replayc                 c   s    |   V  |  E d H  d S r   rn   r   r   r   r   ro   1  s   
z MultipartStream.FileField.render)r"   r#   r$   r:   r'   r   r2   rp   rm   r*   ri   r%   r)   rk   r(   r   ro   r   r   r   r   	FileField   s    r   Nr]   filesboundaryr   c                 C   sD   |d u rt td}|| _d|d | _t| ||| _	d S )N   z multipart/form-data; boundary=%sascii)
binasciihexlifyosurandomr   decoderY   list_iter_fieldsfields)r   r]   r   r   r   r   r   r2   5  s   zMultipartStream.__init__)r   rq   c                 c   sp    |  D ]\}}t|tr|D ]
}| j||dV  qq| j||dV  q|  D ]\}}| j||dV  q)d S )N)ra   rb   )itemsr0   r   rq   r   )r   r]   r   ra   rb   itemr   r   r   r   A  s   
zMultipartStream._iter_fieldsc                 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   ro   )r   fieldr   r   r   iter_chunksN  s   
zMultipartStream.iter_chunksc                 c   sH    t | j}| jD ]}d| d V  | V  dV  q	d| d V  d S )N      )r4   r   r   rm   )r   boundary_lengthr   r   r   r   iter_chunks_lengthsU  s   


z#MultipartStream.iter_chunks_lengthsc                 C   s   t |  S r   )sumr   r   r   r   r   get_content_length^  s   z"MultipartStream.get_content_lengthc                 C   s   t dd | jD S )Nc                 s   s    | ]}|  V  qd S r   )r   ).0r   r   r   r   	<genexpr>d  s    z-MultipartStream.can_replay.<locals>.<genexpr>)allr   r   r   r   r   r   c  rT   zMultipartStream.can_replayc                 C   s   t |  }| j}||dS )NrV   )r'   r   rY   rX   r   r   r   r   f  s   
zMultipartStream.get_headersc                 c   s    |   D ]}|V  qd S r   r   r   r   r   r   r   k     zMultipartStream.__iter__c                 C  s   |   D ]}|V  qd S r   r   r   r   r   r   r   o  r   zMultipartStream.__aiter__r   )r"   r#   r$   r:   rq   r   r%   Mappingr
   r*   r2   r)   r;   r   r   rp   r   r   r(   r   r&   r'   r   r   r+   r   r   r   r   r   r`      s8    ,U

	r`   r]   r   rR   r   r   c                 C   s   | s|durt |dS |rti ||dS tddS t| tr,|r't| ||dS t| dS t| ttfr8t| dS t| drKt	
t	jt | } t| dS t| d	r^t	
t	jt | } t| d
S tdt| )zq
    Handles encoding the given `data`, `files`, and `json`, returning
    a `ContentStream` implementation.
    N)rR   )r]   r   r   r   r7   )r]   r   )rP   r   )r=   zUnexpected type for 'data', )rQ   r`   r,   r0   r_   r\   r'   r*   rg   r%   castr+   rO   r)   r<   rc   type)r]   r   rR   r   r   r   r   r1   t  s&   









r1   )NNNN)#r   r   r%   rR   r   rS   pathlibr   urllib.parser   httpcore_exceptionsr   _typesr   r   r	   r
   _utilsr   r   r   r   AsyncByteStreamSyncByteStreamr   r,   r<   rO   rQ   r\   r`   r[   r*   r1   r   r   r   r   <module>   sB    !! F