o
    }Thr0                     @  sx  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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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! 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(e)e*f Z+ej,e+ Z-ej.e+ Z/ej'e/e-f Z0G dd de"Z1G dd de"Z2dS )    )annotationsN)datetime)format_datetime
formatdate)partial)
guess_type)quote)md5_hexdigest)BackgroundTask)iterate_in_threadpool)URLMutableHeaders)ReceiveScopeSendc                   @  s   e Zd ZdZdZ					d8d9ddZd:ddZd;d<ddZed=ddZ									d>d?d,d-Z
					d@dAd.d/ZdBd6d7ZdS )CResponseNutf-8   content
typing.Anystatus_codeintheaderstyping.Mapping[str, str] | None
media_type
str | None
backgroundBackgroundTask | NonereturnNonec                 C  s4   || _ |d ur
|| _|| _| || _| | d S N)r   r   r   renderbodyinit_headersselfr   r   r   r   r    r&   T/home/air/segue/gemini/back/venv/lib/python3.10/site-packages/starlette/responses.py__init__   s   zResponse.__init__bytes | memoryviewc                 C  s*   |d u rdS t |ttfr|S || jS )N    )
isinstancebytes
memoryview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rn|rn|drdd|	 vrd|d| j
 7 }|d|d
f || _d S )NTc                 S  s(   g | ]\}}|  d |d fqS )latin-1)lowerr.   ).0kvr&   r&   r'   
<listcomp>9   s   ( z)Response.init_headers.<locals>.<listcomp>c                 S  s   g | ]}|d  qS )r   r&   )r3   hr&   r&   r'   r6   :   s    s   content-lengths   content-typer"   r   )   i0  r1   ztext/zcharset=z
; charset=)itemsgetattrr   strlenappendr.   r   
startswithr2   r/   raw_headers)	r%   r   r?   populate_content_lengthpopulate_content_typekeysr"   content_lengthcontent_typer&   r&   r'   r#   3   s*   
zResponse.init_headersr   c                 C  s   t | dst| jd| _| jS )N_headers)raw)hasattrr   r?   rE   )r%   r&   r&   r'   r   O   s   
zResponse.headers /Flaxkeyr;   valuemax_age
int | Noneexpiresdatetime | str | int | Nonepathdomainsecureboolhttponlysamesite.typing.Literal['lax', 'strict', 'none'] | 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usegmtrO   rQ   rR   rS   rU   )strictrJ   nonez1samesite must be either 'strict', 'lax' or 'none'rV   rH   )headers
   set-cookier1   )httpcookiesSimpleCookier+   r   r   r2   outputstripr?   r=   r.   )r%   rK   rL   rM   rO   rQ   rR   rS   rU   rV   cookie
cookie_valr&   r&   r'   
set_cookieU   s.   

zResponse.set_cookiec              
   C  s   | j |dd|||||d d S )Nr   )rM   rO   rQ   rR   rS   rU   rV   )rd   )r%   rK   rQ   rR   rS   rU   rV   r&   r&   r'   delete_cookie|   s   	
zResponse.delete_cookiescoper   receiver   sendr   c                   sn   |d dkr	dnd}||d | j | jdI d H  ||d | jdI d H  | jd ur5|  I d H  d S d S )	Ntype	websocketz
websocket.rH   http.response.startri   statusr   http.response.body)ri   r"   )r   r?   r"   r   )r%   rf   rg   rh   prefixr&   r&   r'   __call__   s   

zResponse.__call__)Nr   NNNr   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r)   r    )r   r   r   r   )r   r   )rH   NNrI   NFFrJ   )rK   r;   rL   r;   rM   rN   rO   rP   rQ   r   rR   r   rS   rT   rU   rT   rV   rW   r   r   )rI   NFFrJ   )rK   r;   rQ   r;   rR   r   rS   rT   rU   rT   rV   rW   r   r   rf   r   rg   r   rh   r   r   r   )__name__
__module____qualname__r   r/   r(   r!   r#   propertyr   rd   re   rp   r&   r&   r&   r'   r      s:    
*r   c                   @     e Zd ZdZdS )HTMLResponsez	text/htmlNrs   rt   ru   r   r&   r&   r&   r'   rx          rx   c                   @  rw   )PlainTextResponse
text/plainNry   r&   r&   r&   r'   r{      rz   r{   c                      s6   e Zd ZdZ				dd fddZdddZ  ZS )JSONResponsezapplication/jsonr   Nr   r   r   r   r   r   r   r   r   r   r   r   c                   s   t  ||||| d S r    )superr(   r$   	__class__r&   r'   r(      s   zJSONResponse.__init__r,   c                 C  s   t j|ddd dddS )NF),:)ensure_ascii	allow_nanindent
separatorsr   )jsondumpsr.   r0   r&   r&   r'   r!      s   zJSONResponse.renderr   NNNrq   )r   r   r   r,   )rs   rt   ru   r   r(   r!   __classcell__r&   r&   r   r'   r}      s    
r}   c                      s&   e Zd Z			dd fddZ  ZS )RedirectResponse3  Nurl	str | URLr   r   r   r   r   r   r   r   c                   s.   t  jd|||d tt|dd| jd< d S )Nr*   )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)
r   r   r   r   r   r   r   r   r   r   )rs   rt   ru   r(   r   r&   r&   r   r'   r      s
    r   c                   @  sH   e Zd ZU ded< 				dd ddZd!ddZd"ddZd#ddZdS )$StreamingResponseAsyncContentStreambody_iteratorr   Nr   ContentStreamr   r   r   r   r   r   r   r   r   r   c                 C  sL   t |tjr
|| _nt|| _|| _|d u r| jn|| _|| _| | d S r    )	r+   typingAsyncIterabler   r   r   r   r   r#   r$   r&   r&   r'   r(      s   
zStreamingResponse.__init__rg   r   c                   s"   	 | I d H }|d dkrd S q)NTri   zhttp.disconnectr&   )r%   rg   messager&   r&   r'   listen_for_disconnect   s   z'StreamingResponse.listen_for_disconnectrh   r   c                   s|   |d| j | jdI d H  | j2 z3 d H W }t|ttfs$|| j}|d|ddI d H  q6 |ddddI d H  d S )Nrk   rl   rn   Tri   r"   	more_bodyr*   F)r   r?   r   r+   r,   r-   r.   r/   )r%   rh   chunkr&   r&   r'   stream_response   s   
z!StreamingResponse.stream_responserf   r   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   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   r   )anyiocreate_task_group
start_soonr   r   r   r   )r%   rf   rg   rh   r   r&   r   r'   rp      s   (
	zStreamingResponse.__call__r   )r   r   r   r   r   r   r   r   r   r   r   r   )rg   r   r   r   )rh   r   r   r   rr   )rs   rt   ru   __annotations__r(   r   r   rp   r&   r&   r&   r'   r      s   
 

r   c                   @  s@   e Zd ZdZ								d$d%ddZd&ddZd'd"d#ZdS )(FileResponsei   r   N
attachmentrQ   str | os.PathLike[str]r   r   r   r   r   r   r   r   filenamestat_resultos.stat_result | Nonemethodcontent_disposition_typer;   r   r   c
                 C  s   || _ || _|| _|d urtdt |d u r!t|p|d p d}|| _|| _| 	| | jd urSt
| j}
|
| jkrC|	 d|
 }n	|	 d| j d}| jd| || _|d ura| | d S d S )Nz;The 'method' parameter is not used, and it will be removed.r   r|   z; filename*=utf-8''z; filename=""zcontent-disposition)rQ   r   r   warningswarnDeprecationWarningr   r   r   r#   r   r   
setdefaultr   set_stat_headers)r%   rQ   r   r   r   r   r   r   r   r   content_disposition_filenamecontent_dispositionr&   r&   r'   r(   
  s.   



zFileResponse.__init__os.stat_resultc                 C  sv   t |j}t|jdd}t |jd t |j }dt| dd d}| jd| | jd| | jd	| d S )
NTrX   -r   F)usedforsecurityzcontent-lengthzlast-modifiedetag)r;   st_sizer   st_mtimer	   r.   r   r   )r%   r   rC   last_modified	etag_baser   r&   r&   r'   r   .  s   
zFileResponse.set_stat_headersrf   r   rg   r   rh   r   c           	   	     sd  | 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  |d  dkr\|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  |spW 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.rk   rl   r   HEADrn   r*   Fr   rb)modeT)r   r   	to_threadrun_syncosstatrQ   r   FileNotFoundErrorRuntimeErrorst_modeS_ISREGr   r?   upper	open_fileread
chunk_sizer<   r   )	r%   rf   rg   rh   r   r   filer   r   r&   r&   r'   rp   8  sF   


 
(
zFileResponse.__call__)r   NNNNNNr   )rQ   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r;   r   r   )r   r   r   r   rr   )rs   rt   ru   r   r(   r   rp   r&   r&   r&   r'   r     s    
$
r   )3
__future__r   http.cookiesr]   r   r   r   r   r   r   email.utilsr   r   	functoolsr   	mimetypesr   urllib.parser   r   anyio.to_threadstarlette._compatr	   starlette.backgroundr
   starlette.concurrencyr   starlette.datastructuresr   r   starlette.typesr   r   r   r   rx   r{   r}   r   Unionr;   r,   r-   ContentIterableSyncContentStreamr   r   r   r   r   r&   r&   r&   r'   <module>   s>     

7