o
     d[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rld dlm!Z! nd dl"m!Z! dej#j$j%d< 	d%dej&e'df de(dej)ej*e' ej*e' f f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urlos.PathLike[str]strictreturnc                 C   s   t jdk r
t| } t| |S )Nr   )sysversion_infoosfspathmimetypes_guess_type)r   r    r   >/usr/local/lib/python3.10/dist-packages/starlette/responses.pyr      s   


r   c                   @   st  e Zd ZdZdZ					d)dejdedejej	e
e
f  deje
 deje d	dfd
dZdejd	efddZ	d*dejej	e
e
f  d	dfddZed	efddZ								d+de
de
deje dejejee
ef  de
deje
 dededejed  d	dfd d!Z					d,de
de
deje
 dededejed  d	dfd"d#Zd$ed%ed&ed	dfd'd(ZdS )-ResponseNutf-8   contentstatus_codeheaders
media_type
backgroundr   c                 C   s4   || _ |d ur
|| _|| _| || _| | d S N)r%   r'   r(   renderbodyinit_headersselfr$   r%   r&   r'   r(   r   r   r    __init__+   s   zResponse.__init__c                 C   s&   |d u rdS t |tr|S || jS )N    )
isinstancebytesencodecharsetr.   r$   r   r   r    r*   :   s
   
zResponse.renderc           	      C   s   |d u rg }d}d}ndd |  D }dd |D }d|v}d|v}t| dd }|d urI|rI| jdk sI| jd	v sItt|}|d|d
f | j}|d urh|rh|dr^|d| j	 7 }|d|d
f || _
d S )NTc                 S   s(   g | ]\}}|  d |d fqS )latin-1)lowerr3   ).0kvr   r   r    
<listcomp>I   s    z)Response.init_headers.<locals>.<listcomp>c                 S   s   g | ]}|d  qS )r   r   )r8   hr   r   r    r;   M   s    s   content-lengths   content-typer+   r#   )   i0  r6   ztext/z
; charset=)itemsgetattrr%   strlenappendr3   r'   
startswithr4   raw_headers)	r.   r&   rD   populate_content_lengthpopulate_content_typekeysr+   content_lengthcontent_typer   r   r    r,   A   s6   

zResponse.init_headersc                 C   s   t | dst| jd| _| jS )N_headers)raw)hasattrr   rD   rJ   )r.   r   r   r    r&   b   s   
zResponse.headers /Flaxkeyvaluemax_ageexpirespathdomainsecurehttponlyr   )rO   r   nonec
                 C   s   t j }
||
|< |d ur||
| d< |d ur-t|tr't|dd|
| d< n||
| d< |d ur7||
| d< |d urA||
| d< |rId|
| d< |rQd|
| d< |	d ure|	 d	v s_J d
|	|
| d< |
jdd }| j	
d|df d S )Nzmax-ageTusegmtrS   rT   rU   rV   rW   )r   rO   rX   z1samesite must be either 'strict', 'lax' or 'none'r   rM   )headers
   set-cookier6   )httpcookiesSimpleCookier1   r   r   r7   outputstriprD   rB   r3   )r.   rP   rQ   rR   rS   rT   rU   rV   rW   r   cookie
cookie_valr   r   r    
set_cookieh   s.   

zResponse.set_cookiec              
   C   s   | j |dd|||||d d S )Nr   )rR   rS   rT   rU   rV   rW   r   )rc   )r.   rP   rT   rU   rV   rW   r   r   r   r    delete_cookie   s   	
zResponse.delete_cookiescopereceivesendc                    sR   |d| j | jdI d H  |d| jdI d H  | jd ur'|  I d H  d S d S )Nhttp.response.starttypestatusr&   http.response.body)rj   r+   )r%   rD   r+   r(   )r.   re   rf   rg   r   r   r    __call__   s   

zResponse.__call__)Nr#   NNNr)   )rM   NNrN   NFFrO   )rN   NFFrO   )__name__
__module____qualname__r'   r4   typingAnyintOptionalMappingr@   r	   r/   r2   r*   r,   propertyr   r&   Unionr   boolr   rc   rd   r   r   r   rm   r   r   r   r    r!   '   s    

!	

*
r!   c                   @      e Zd ZdZdS )HTMLResponsez	text/htmlNrn   ro   rp   r'   r   r   r   r    rz          rz   c                   @   ry   )PlainTextResponse
text/plainNr{   r   r   r   r    r}      r|   r}   c                       sv   e Zd ZdZ				ddejdedejeje	e	f  deje	 deje
 d	df fd
dZdejd	efddZ  ZS )JSONResponsezapplication/jsonr#   Nr$   r%   r&   r'   r(   r   c                    s   t  ||||| d S r)   )superr/   r-   	__class__r   r    r/      s   zJSONResponse.__init__c                 C   s   t j|ddd dddS )NF),:)ensure_ascii	allow_nanindent
separatorsr"   )jsondumpsr3   r5   r   r   r    r*      s   zJSONResponse.renderr#   NNN)rn   ro   rp   r'   rq   rr   rs   rt   Dictr@   r	   r/   r2   r*   __classcell__r   r   r   r    r      s(    
r   c                       sZ   e Zd Z			d
dejeef dedejej	eef  deje
 ddf
 fdd	Z  ZS )RedirectResponse3  Nr   r%   r&   r(   r   c                    s.   t  jd|||d tt|dd| jd< d S )Nr0   )r$   r%   r&   r(   z:/%#?=@[]!$&'()*+,;)safelocation)r   r/   r   r@   r&   )r.   r   r%   r&   r(   r   r   r    r/      s   zRedirectResponse.__init__)r   NN)rn   ro   rp   rq   rw   r@   r   rs   rt   ru   r	   r/   r   r   r   r   r    r      s    r   c                   @   s   e Zd ZU eed< 				ddededejej	e
e
f  deje
 deje d	dfd
dZded	dfddZded	dfddZdededed	dfddZdS )StreamingResponsebody_iteratorr#   Nr$   r%   r&   r'   r(   r   c                 C   sL   t |tjr
|| _nt|| _|| _|d u r| jn|| _|| _| | d S r)   )	r1   rq   AsyncIterabler   r
   r%   r'   r(   r,   r-   r   r   r    r/      s   
zStreamingResponse.__init__rf   c                    s"   	 | I d H }|d dkrd S q)NTrj   zhttp.disconnectr   )r.   rf   messager   r   r    listen_for_disconnect   s   z'StreamingResponse.listen_for_disconnectrg   c                    sx   |d| j | jdI d H  | j2 z3 d H W }t|ts"|| j}|d|ddI d H  q6 |ddddI d H  d S )Nrh   ri   rl   Trj   r+   	more_bodyr0   F)r%   rD   r   r1   r2   r3   r4   )r.   rg   chunkr   r   r    stream_response   s   

z!StreamingResponse.stream_responsere   c              	      s   t  4 I d H ' d fdd} |t| j| |t| j|I d H  W d   I d H  n1 I d H s6w   Y  | jd urI|  I d H  d S d S )Nfunc+typing.Callable[[], typing.Awaitable[None]]r   c                    s   |  I d H   j   d S r)   )cancel_scopecancel)r   
task_groupr   r    wrap  s   z(StreamingResponse.__call__.<locals>.wrap)r   r   r   N)anyiocreate_task_group
start_soonr   r   r   r(   )r.   re   rf   rg   r   r   r   r    rm     s   (
	zStreamingResponse.__call__r   )rn   ro   rp   AsyncContentStream__annotations__ContentStreamrs   rq   rt   ru   r@   r	   r/   r   r   r   r   r   rm   r   r   r   r    r      s,   
 
r   c                   @   s   e Zd ZdZ								ddejedf dedejej	eef  d	eje d
eje
 deje dejej deje deddfddZdejddfddZdedededdfddZdS )FileResponsei   r#   N
attachmentrT   r   r%   r&   r'   r(   filenamestat_resultmethodcontent_disposition_typer   c
                 C   s   || _ || _|| _|d uo| dk| _|d u r"t|p|d p!d}|| _|| _| | | jd urQt	| j}
|
| jkrCd
|	|
}nd
|	| j}| jd| || _|d ur_| | d S d S )NHEADr   r~   z{}; filename*=utf-8''{}z{}; filename="{}"zcontent-disposition)rT   r%   r   uppersend_header_onlyr   r'   r(   r,   r   formatr&   
setdefaultr   set_stat_headers)r.   rT   r%   r&   r'   r(   r   r   r   r   content_disposition_filenamecontent_dispositionr   r   r    r/     s.   



zFileResponse.__init__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)usedforsecurityzcontent-lengthzlast-modifiedetag)r@   st_sizer   st_mtimer   r3   r&   r   )r.   r   rH   last_modified	etag_baser   r   r   r    r   B  s   
zFileResponse.set_stat_headersre   rf   rg   c           	   	      sZ  | j d u r;ztjtj| jI d H }| | W n ty)   t	d| j dw |j
}t|s;t	d| j d|d| j| jdI d H  | jrW|dddd	I d H  nFtj| jd
dI d H 4 I d H ,}d}|r|| jI d H }t|| jk}|d||d	I d H  |skW d   I d H  n1 I d H sw   Y  | jd ur|  I d H  d S d S )NzFile at path z does not exist.z is not a file.rh   ri   rl   r0   Fr   rb)modeT)r   r   	to_threadrun_syncr   statrT   r   FileNotFoundErrorRuntimeErrorst_modeS_ISREGr%   rD   r   	open_fileread
chunk_sizerA   r(   )	r.   re   rf   rg   r   r   filer   r   r   r   r    rm   L  sF   


 
(
zFileResponse.__call__)r#   NNNNNNr   )rn   ro   rp   r   rq   rw   r@   rs   rt   ru   r	   r   r   r/   r   r   r   r   rm   r   r   r   r    r     sB    
	

$
r   )T)9http.cookiesr\   r   r   r   r   rq   r   email.utilsr   r   	functoolsr   	mimetypesr   r   urllib.parser   r   starlette._compatr   starlette.backgroundr	   starlette.concurrencyr
   starlette.datastructuresr   r   starlette.typesr   r   r   r   r   typing_extensionsr]   Morsel	_reservedrw   r@   rx   Tuplert   r!   rz   r}   r   r   r2   ContentIteratorSyncContentStreamr   r   r   r   r   r   r   r   r    <module>   sR    

 

7