U
    &%e[3                     @   s  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
 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 d d	lmZ d d
lmZmZ d dlmZmZmZ ej dkrd dlm!Z! nd dl"m!Z! dej#j$j%d< d#ej&e'df e(ej)ej*e' ej*e' f dddZG dd d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/ej&e'e0f Z1ej2e1 Z3ej4e1 Z5ej&e5e3f Z6G dd  d e+Z7G d!d" d"e+Z8dS )$    N)datetime)format_datetime
formatdate)partial)
guess_type)quote)md5_hexdigest)BackgroundTask)iterate_in_threadpool)URLMutableHeaders)ReceiveScopeSend      )LiteralSameSitesamesiteTos.PathLike[str])urlstrictreturnc                 C   s   t jdk rt| } t| |S )Nr   )sysversion_infoosfspathmimetypes_guess_type)r   r    r   R/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/starlette/responses.pyr      s    

r   c                   @   s  e Zd ZdZdZdejeejej	e
e
f  eje
 eje ddddZejeddd	Zdejej	e
e
f  dd
ddZeedddZd e
e
eje ejejee
ef  e
eje
 eeejed  dd
ddZd!e
e
eje
 eeejed  ddddZeeeddddZdS )"ResponseNutf-8   contentstatus_codeheaders
media_type
backgroundr   c                 C   s4   || _ |d k	r|| _|| _| || _| | d S N)r&   r(   r)   renderbodyinit_headersselfr%   r&   r'   r(   r)   r   r   r    __init__+   s    zResponse.__init__r%   r   c                 C   s&   |d krdS t |tr|S || jS )N    )
isinstancebytesencodecharsetr/   r%   r   r   r    r+   :   s
    
zResponse.render)r'   r   c           	      C   s   |d krg }d}d}n0dd |  D }dd |D }d|k}d|k}t| dd }|d k	r|r| jdk s| jd	kstt|}|d|d
f | j}|d k	r|r|dr|d| j	 7 }|d|d
f || _
d S )NTc                 S   s(   g | ] \}}|  d |d fqS )latin-1)lowerr5   ).0kvr   r   r    
<listcomp>I   s   z)Response.init_headers.<locals>.<listcomp>c                 S   s   g | ]}|d  qS )r   r   )r:   hr   r   r    r=   M   s     s   content-lengths   content-typer,   r#   )   i0  r8   ztext/z
; charset=)itemsgetattrr&   strlenappendr5   r(   
startswithr6   raw_headers)	r/   r'   rF   Zpopulate_content_lengthZpopulate_content_typekeysr,   content_lengthcontent_typer   r   r    r-   A   s6    
zResponse.init_headers)r   c                 C   s   t | dst| jd| _| jS )N_headers)raw)hasattrr   rF   rJ   )r/   r   r   r    r'   b   s    
zResponse.headers /Flax)rO   r   none)
keyvaluemax_ageexpirespathdomainsecurehttponlyr   r   c
                 C   s   t j }
||
|< |d k	r&||
| d< |d k	rZt|trNt|dd|
| d< n||
| d< |d k	rn||
| d< |d k	r||
| d< |rd|
| d< |rd|
| d< |	d k	r|	 d	kstd
|	|
| d< |
jdd	 }| j
d|df d S )Nzmax-ageTusegmtrT   rU   rV   rW   rX   )r   rO   rP   z1samesite must be either 'strict', 'lax' or 'none'r   rM   )headers
   set-cookier8   )httpcookiesSimpleCookier3   r   r   r9   AssertionErroroutputstriprF   rD   r5   )r/   rQ   rR   rS   rT   rU   rV   rW   rX   r   cookieZ
cookie_valr   r   r    
set_cookieh   s.    

zResponse.set_cookie)rQ   rU   rV   rW   rX   r   r   c              
   C   s   | j |dd|||||d d S )Nr   )rS   rT   rU   rV   rW   rX   r   )rc   )r/   rQ   rU   rV   rW   rX   r   r   r   r    delete_cookie   s    	zResponse.delete_cookiescopereceivesendr   c                    sL   |d| j | jdI d H  |d| jdI d H  | jd k	rH|  I d H  d S )Nhttp.response.starttypestatusr'   http.response.body)rk   r,   )r&   rF   r,   r)   )r/   rf   rg   rh   r   r   r    __call__   s    

zResponse.__call__)Nr#   NNN)N)rM   NNrN   NFFrO   )rN   NFFrO   )__name__
__module____qualname__r(   r6   typingAnyintOptionalMappingrB   r	   r0   r4   r+   r-   propertyr   r'   Unionr   boolr   rc   rd   r   r   r   rn   r   r   r   r    r!   '   st         !        *     r!   c                   @   s   e Zd ZdZdS )HTMLResponsez	text/htmlNro   rp   rq   r(   r   r   r   r    rz      s   rz   c                   @   s   e Zd ZdZdS )PlainTextResponse
text/plainNr{   r   r   r   r    r|      s   r|   c                       sb   e Zd ZdZd
ejeejeje	e	f  eje	 eje
 dd fddZejeddd	Z  ZS )JSONResponsezapplication/jsonr#   Nr$   c                    s   t  ||||| d S r*   )superr0   r.   	__class__r   r    r0      s    zJSONResponse.__init__r1   c                 C   s   t j|ddd dddS )NF),:)ensure_ascii	allow_nanindent
separatorsr"   )jsondumpsr5   r7   r   r   r    r+      s    zJSONResponse.render)r#   NNN)ro   rp   rq   r(   rr   rs   rt   ru   DictrB   r	   r0   r4   r+   __classcell__r   r   r   r    r~      s       
r~   c                       sL   e Zd Zdejeef eejej	eef  eje
 dd fddZ  ZS )RedirectResponse3  N)r   r&   r'   r)   r   c                    s.   t  jd|||d tt|dd| jd< d S )Nr2   )r%   r&   r'   r)   z:/%#?=@[]!$&'()*+,;)safelocation)r   r0   r   rB   r'   )r/   r   r&   r'   r)   r   r   r    r0      s       zRedirectResponse.__init__)r   NN)ro   rp   rq   rr   rx   rB   r   rt   ru   rv   r	   r0   r   r   r   r   r    r      s      r   c                   @   s   e Zd ZU eed< deeejej	e
e
f  eje
 eje ddddZedddd	Zedd
ddZeeeddddZdS )StreamingResponsebody_iteratorr#   Nr$   c                 C   sL   t |tjr|| _n
t|| _|| _|d kr2| jn|| _|| _| | d S r*   )	r3   rr   AsyncIterabler   r
   r&   r(   r)   r-   r.   r   r   r    r0      s    
zStreamingResponse.__init__)rg   r   c                    s    | I d H }|d dkr qq d S )Nrk   zhttp.disconnectr   )r/   rg   messager   r   r    listen_for_disconnect   s    z'StreamingResponse.listen_for_disconnect)rh   r   c                    sv   |d| j | jdI d H  | j2 z83 d H W }t|tsB|| j}|d|ddI d H  q 6 |ddddI d H  d S )Nri   rj   rm   Trk   r,   	more_bodyr2   F)r&   rF   r   r3   r4   r5   r6   )r/   rh   chunkr   r   r    stream_response   s    

z!StreamingResponse.stream_responsere   c              
      s|   t  4 I d H D dd d fdd} |t| j| |t| j|I d H  W 5 Q I d H R X | jd k	rx|  I d H  d S )Nz+typing.Callable[[], typing.Awaitable[None]])funcr   c                    s   |  I d H   j   d S r*   )Zcancel_scopecancel)r   Z
task_groupr   r    wrap  s    z(StreamingResponse.__call__.<locals>.wrap)anyioZcreate_task_groupZ
start_soonr   r   r   r)   )r/   rf   rg   rh   r   r   r   r    rn     s    &
zStreamingResponse.__call__)r#   NNN)ro   rp   rq   AsyncContentStream__annotations__ContentStreamrt   rr   ru   rv   rB   r	   r0   r   r   r   r   r   rn   r   r   r   r    r      s    
    r   c                   @   s   e Zd ZdZdejedf eejej	eef  eje eje
 eje ejej eje edd
ddZejdd	d
dZeeeddddZdS )FileResponsei   r#   N
attachmentr   )
rU   r&   r'   r(   r)   filenamestat_resultmethodcontent_disposition_typer   c
                 C   s   || _ || _|| _|d k	o$| dk| _|d krDt|p8|d pBd}|| _|| _| | | jd k	rt	| j}
|
| jkrd
|	|
}nd
|	| j}| jd| || _|d k	r| | d S )NHEADr   r}   z{}; filename*=utf-8''{}z{}; filename="{}"zcontent-disposition)rU   r&   r   uppersend_header_onlyr   r(   r)   r-   r   formatr'   
setdefaultr   set_stat_headers)r/   rU   r&   r'   r(   r)   r   r   r   r   Zcontent_disposition_filenamecontent_dispositionr   r   r    r0     s0    



  zFileResponse.__init__)r   r   c                 C   sn   t |j}t|jdd}t |jd t |j }t| dd}| jd| | jd| | jd| d S )	NTrY   -F)Zusedforsecurityzcontent-lengthzlast-modifiedetag)rB   st_sizer   st_mtimer   r5   r'   r   )r/   r   rH   Zlast_modifiedZ	etag_baser   r   r   r    r   B  s    
zFileResponse.set_stat_headersre   c           	   
      sB  | j d krzz&tjtj| jI d H }| | W n& tk
rV   t	d| j dY n$X |j
}t|szt	d| j d|d| j| jdI d H  | jr|dddd	I d H  nrtj| jd
dI d H 4 I d H H}d}|r|| jI d H }t|| jk}|d||d	I d H  qW 5 Q I d H R X | jd k	r>|  I d H  d S )NzFile at path z does not exist.z is not a file.ri   rj   rm   r2   Fr   rb)modeT)r   r   Z	to_threadZrun_syncr   statrU   r   FileNotFoundErrorRuntimeErrorst_modeS_ISREGr&   rF   r   	open_fileread
chunk_sizerC   r)   )	r/   rf   rg   rh   r   r   filer   r   r   r   r    rn   L  s<    


 zFileResponse.__call__)r#   NNNNNNr   )ro   rp   rq   r   rr   rx   rB   rt   ru   rv   r	   r   r   r0   r   r   r   r   rn   r   r   r   r    r     s.           
$
r   )T)9http.cookiesr\   r   r   r   r   rr   r   email.utilsr   r   	functoolsr   	mimetypesr   r   urllib.parser   r   Zstarlette._compatr   Zstarlette.backgroundr	   Zstarlette.concurrencyr
   Zstarlette.datastructuresr   r   Zstarlette.typesr   r   r   r   r   Ztyping_extensionsr]   Morsel	_reservedrx   rB   ry   Tupleru   r!   rz   r|   r~   r   r4   ZContentIteratorZSyncContentStreamr   r   r   r   r   r   r   r   r    <module>   sL   
   

7