o
    :ήcn2                  
   @   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
 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rdd 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%e.f Z/ej0e/ Z1ej2e/ Z3ej$e3e1f Z4G d d! d!e)Z5G d"d# d#e)Z6dS )%    N)
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   :/tmp/pip-target-vg8gfxp4/lib/python/starlette/responses.pyr      s   


r   c                   @   sh  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 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(   9   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)lowerr1   ).0kvr   r   r   
<listcomp>H   s    z)Response.init_headers.<locals>.<listcomp>c                 S   s   g | ]}|d  qS )r   r   )r6   hr   r   r   r9   L   s    s   content-lengths   content-typer)   r!   )   i0  r4   ztext/z
; charset=)itemsgetattrr#   strlenappendr1   r%   
startswithr2   raw_headers)	r,   r$   rB   populate_content_lengthpopulate_content_typekeysr)   content_lengthcontent_typer   r   r   r*   @   s6   

zResponse.init_headersc                 C   s   t | dst| jd| _| jS )N_headers)raw)hasattrr
   rB   rH   )r,   r   r   r   r$   a   s   
zResponse.headers /Flaxkeyvaluemax_ageexpirespathdomainsecurehttponlyr   )rM   r   nonec
                 C   s   t j }
||
|< |d ur||
| d< |d ur||
| d< |d ur'||
| d< |d ur1||
| d< |r9d|
| d< |rAd|
| d< |	d urU|	 dv sOJ d	|	|
| d
< |
jdd }| jd|df d S )Nzmax-agerQ   rR   rS   TrT   rU   )r   rM   rV   z1samesite must be either 'strict', 'lax' or 'none'r   rK   )headers
   set-cookier4   )	httpcookiesSimpleCookier5   outputstriprB   r@   r1   )r,   rN   rO   rP   rQ   rR   rS   rT   rU   r   cookie
cookie_valr   r   r   
set_cookieg   s*   
zResponse.set_cookiec              
   C   s   | j |dd|||||d d S )Nr   )rP   rQ   rR   rS   rT   rU   r   )r_   )r,   rN   rR   rS   rT   rU   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)rf   r)   )r#   rB   r)   r&   )r,   ra   rb   rc   r   r   r   __call__   s   

zResponse.__call__)Nr!   NNNr'   )rK   NNrL   NFFrM   )rL   NFFrM   )__name__
__module____qualname__r%   r2   typingAnyintOptionalMappingr>   r   r-   r0   r(   r*   propertyr
   r$   boolr   r_   r`   r   r   r   ri   r   r   r   r   r   &   s    

!	

'
r   c                   @      e Zd ZdZdS )HTMLResponsez	text/htmlNrj   rk   rl   r%   r   r   r   r   ru          ru   c                   @   rt   )PlainTextResponse
text/plainNrv   r   r   r   r   rx      rw   rx   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dumpsr1   r3   r   r   r   r(      s   zJSONResponse.renderr!   NNN)rj   rk   rl   r%   rm   rn   ro   rp   Dictr>   r   r-   r0   r(   __classcell__r   r   r|   r   rz      s(    
rz   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 )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)rj   rk   rl   rm   Unionr>   r	   ro   rp   rq   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'   )	r/   rm   AsyncIterabler   r   r#   r%   r&   r*   r+   r   r   r   r-      s   
zStreamingResponse.__init__rb   c                    s"   	 | I d H }|d dkrd S q)NTrf   zhttp.disconnectr   )r,   rb   messager   r   r   listen_for_disconnect   s   z'StreamingResponse.listen_for_disconnectrc   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 )Nrd   re   rh   Trf   r)   	more_bodyr.   F)r#   rB   r   r/   r0   r1   r2   )r,   rc   chunkr   r   r   stream_response   s   

z!StreamingResponse.stream_responsera   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,   ra   rb   rc   r   r   r   r   ri   	  s   (
	zStreamingResponse.__call__r   )rj   rk   rl   AsyncContentStream__annotations__ContentStreamro   rm   rp   rq   r>   r   r-   r   r   r   r   r   ri   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
attachmentrR   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   ry   z{}; filename*=utf-8''{}z{}; filename="{}"zcontent-disposition)rR   r#   r   uppersend_header_onlyr   r%   r&   r*   r   formatr$   
setdefaultr   set_stat_headers)r,   rR   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 )	NT)usegmt-F)usedforsecurityzcontent-lengthzlast-modifiedetag)r>   st_sizer   st_mtimer   r1   r$   r   )r,   r   rF   last_modified	etag_baser   r   r   r   r   >  s   
zFileResponse.set_stat_headersra   rb   rc   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.rd   re   rh   r.   Fr   rb)modeT)r   r   	to_threadrun_syncr   statrR   r   FileNotFoundErrorRuntimeErrorst_modeS_ISREGr#   rB   r   	open_fileread
chunk_sizer?   r&   )	r,   ra   rb   rc   r   r   filer   r   r   r   r   ri   H  sF   


 
(
zFileResponse.__call__)r!   NNNNNNr   )rj   rk   rl   r   rm   r   r>   ro   rp   rq   r   r   r   r-   r   r   r   r   ri   r   r   r   r   r     sB    
	

$
r   )T)7http.cookiesrX   r   r   r   r   rm   email.utilsr   	functoolsr   	mimetypesr   r   urllib.parser   r   starlette._compatr   starlette.backgroundr   starlette.concurrencyr   starlette.datastructuresr	   r
   starlette.typesr   r   r   r   r   typing_extensionsrY   Morsel	_reservedr   r>   rs   Tuplerp   r   ru   rx   rz   r   r0   ContentIteratorSyncContentStreamr   r   r   r   r   r   r   r   r   <module>   sP    

 

7