o
    f1                     @  sv  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)f Z*ej+e* Z,ej-e* Z.ej'e.e,f Z/G dd de"Z0G dd de"Z1d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&   K/var/www/NoticeGen/venv/lib/python3.10/site-packages/starlette/responses.py__init__   s   zResponse.__init__bytesc                 C  s&   |d u rdS t |tr|S || jS )N    )
isinstancer)   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&   )r1   hr&   r&   r'   r4   =   s    s   content-lengths   content-typer"   r   )   i0  r/   ztext/zcharset=z
; charset=)itemsgetattrr   strlenappendr,   r   
startswithr0   r-   raw_headers)	r%   r   r=   populate_content_lengthpopulate_content_typekeysr"   content_lengthcontent_typer&   r&   r'   r#   3   s2   
zResponse.init_headersr   c                 C  s   t | dst| jd| _| jS )N_headers)raw)hasattrr   r=   rC   )r%   r&   r&   r'   r   U   s   
zResponse.headers /Flaxkeyr9   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usegmtrM   rO   rP   rQ   rS   )strictrH   nonez1samesite must be either 'strict', 'lax' or 'none'rT   rF   )headers
   set-cookier/   )httpcookiesSimpleCookier+   r   r   r0   outputstripr=   r;   r,   )r%   rI   rJ   rK   rM   rO   rP   rQ   rS   rT   cookie
cookie_valr&   r&   r'   
set_cookie[   s.   

zResponse.set_cookiec              
   C  s   | j |dd|||||d d S )Nr   )rK   rM   rO   rP   rQ   rS   rT   )rb   )r%   rI   rO   rP   rQ   rS   rT   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.rF   http.response.startrg   statusr   http.response.body)rg   r"   )r   r=   r"   r   )r%   rd   re   rf   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   )rF   NNrG   NFFrH   )rI   r9   rJ   r9   rK   rL   rM   rN   rO   r9   rP   r   rQ   rR   rS   rR   rT   rU   r   r   )rG   NFFrH   )rI   r9   rO   r9   rP   r   rQ   rR   rS   rR   rT   rU   r   r   rd   r   re   r   rf   r   r   r   )__name__
__module____qualname__r   r-   r(   r!   r#   propertyr   rb   rc   rn   r&   r&   r&   r'   r      s:    
"*r   c                   @     e Zd ZdZdS )HTMLResponsez	text/htmlNrr   rs   rt   r   r&   r&   r&   r'   rw          rw   c                   @  rv   )PlainTextResponse
text/plainNrx   r&   r&   r&   r'   rz      ry   rz   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,   r.   r&   r&   r'   r!      s   zJSONResponse.renderr   NNNro   rp   )rr   rs   rt   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   r9   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   )rr   rs   rt   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__re   r   c                   s"   	 | I d H }|d dkrd S q)NTrg   zhttp.disconnectr&   )r%   re   messager&   r&   r'   listen_for_disconnect   s   z'StreamingResponse.listen_for_disconnectrf   r   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 )Nri   rj   rl   Trg   r"   	more_bodyr*   F)r   r=   r   r+   r)   r,   r-   )r%   rf   chunkr&   r&   r'   stream_response   s   

z!StreamingResponse.stream_responserd   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%   rd   re   rf   r   r&   r   r'   rn     s   (
	zStreamingResponse.__call__r   )r   r   r   r   r   r   r   r   r   r   r   r   )re   r   r   r   )rf   r   r   r   rq   )rr   rs   rt   __annotations__r(   r   r   rn   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
attachmentrO   str | os.PathLike[str]r   r   r   r   r   r   r   r   filenamestat_resultos.stat_result | Nonemethodcontent_disposition_typer9   r   r   c
                 C  s   || _ || _|| _|d urtdt |d u r!t|p|d p d}|| _|| _| 	| | jd urPt
| j}
|
| jkrBd|	|
}nd|	| j}| jd| || _|d ur^| | 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)rO   r   r   warningswarnDeprecationWarningr   r   r   r#   r   formatr   
setdefaultr   set_stat_headers)r%   rO   r   r   r   r   r   r   r   r   content_disposition_filenamecontent_dispositionr&   r&   r'   r(     s6   



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 )
NTrV   -"F)usedforsecurityzcontent-lengthzlast-modifiedetag)r9   st_sizer   st_mtimer	   r,   r   r   )r%   r   rA   last_modified	etag_baser   r&   r&   r'   r   :  s   
zFileResponse.set_stat_headersrd   r   re   r   rf   r   c           	   	     s  | 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  n^d|v rtd|d v rt|dt| j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  |sW 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.ri   rj   r   HEADrl   r*   Fr   
extensionszhttp.response.pathsend)rg   rO   rb)modeT)r   r   	to_threadrun_syncosstatrO   r   FileNotFoundErrorRuntimeErrorst_modeS_ISREGr   r=   upperr9   	open_fileread
chunk_sizer:   r   )	r%   rd   re   rf   r   r   filer   r   r&   r&   r'   rn   D  sJ   


 
(
zFileResponse.__call__)r   NNNNNNr   )rO   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r9   r   r   )r   r   r   r   rq   )rr   rs   rt   r   r(   r   rn   r&   r&   r&   r'   r     s    
(
r   )2
__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   rw   rz   r|   r   Unionr9   r)   ContentIterableSyncContentStreamr   r   r   r   r   r&   r&   r&   r'   <module>   s>     

7