B
    ind[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)      )LiteralZSameSitesamesiteTzos.PathLike[str])urlstrictreturnc             C   s   t jdk rt| } t| |S )N)r   r   )sysversion_infoosfspathmimetypes_guess_type)r   r    r   7/tmp/pip-unpacked-wheel-_bom8ime/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 )"ResponseNz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 )zlatin-1)lowerr-   ).0kvr   r   r   
<listcomp>J   s   z)Response.init_headers.<locals>.<listcomp>c             S   s   g | ]}|d  qS )r   r   )r0   hr   r   r   r3   M   s    s   content-lengths   content-typer&   r   )   i0  zlatin-1ztext/z
; charset=)itemsgetattrr!   strlenappendr-   r#   
startswithr.   raw_headers)	r(   r"   r<   Zpopulate_content_lengthZpopulate_content_typekeysr&   content_lengthcontent_typer   r   r   r'   A   s*    
zResponse.init_headers)r   c             C   s   t | dst| jd| _| jS )N_headers)raw)hasattrr   r<   r@   )r(   r   r   r   r"   b   s    
zResponse.headers /Flax)rE   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)usegmtrJ   rK   rL   rM   rN   )r   rE   rF   z1samesite must be either 'strict', 'lax' or 'none'r   rC   )headers
   set-cookiezlatin-1)httpcookiesSimpleCookier+   r   r   r/   AssertionErroroutputstripr<   r:   r-   )r(   rG   rH   rI   rJ   rK   rL   rM   rN   r   cookieZ
cookie_valr   r   r   
set_cookieh   s,    

zResponse.set_cookie)rG   rK   rL   rM   rN   r   r   c          
   C   s   | j |dd|||||d d S )Nr   )rI   rJ   rK   rL   rM   rN   r   )rX   )r(   rG   rK   rL   rM   rN   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 )Nzhttp.response.start)typestatusr"   zhttp.response.body)r]   r&   )r!   r<   r&   r$   )r(   rZ   r[   r\   r   r   r   __call__   s    
zResponse.__call__)Nr   NNN)N)rC   NNrD   NFFrE   )rD   NFFrE   )__name__
__module____qualname__r#   r.   typingAnyintOptionalMappingr8   r	   r)   r,   r%   r'   propertyr   r"   Unionr   boolr   rX   rY   r   r   r   r_   r   r   r   r   r   '   s:       *       <    r   c               @   s   e Zd ZdZdS )HTMLResponsez	text/htmlN)r`   ra   rb   r#   r   r   r   r   rk      s   rk   c               @   s   e Zd ZdZdS )PlainTextResponsez
text/plainN)r`   ra   rb   r#   r   r   r   r   rl      s   rl   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   N)r    r!   r"   r#   r$   r   c                s   t  ||||| d S )N)superr)   )r(   r    r!   r"   r#   r$   )	__class__r   r   r)      s    zJSONResponse.__init__)r    r   c             C   s   t j|ddd dddS )NF),:)ensure_ascii	allow_nanindent
separatorszutf-8)jsondumpsr-   )r(   r    r   r   r   r%      s    zJSONResponse.render)r   NNN)r`   ra   rb   r#   rc   rd   re   rf   Dictr8   r	   r)   r,   r%   __classcell__r   r   )ro   r   rm      s      *rm   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 )Nr*   )r    r!   r"   r$   z:/%#?=@[]!$&'()*+,;)safelocation)rn   r)   r   r8   r"   )r(   r   r!   r"   r$   )ro   r   r   r)      s    zRedirectResponse.__init__)r{   NN)r`   ra   rb   rc   ri   r8   r   re   rf   rg   r	   r)   ry   r   r   )ro   r   rz      s     *rz   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   N)r    r!   r"   r#   r$   r   c             C   sL   t |tjr|| _n
t|| _|| _|d kr2| jn|| _|| _| | d S )N)	r+   rc   AsyncIterabler   r
   r!   r#   r$   r'   )r(   r    r!   r"   r#   r$   r   r   r   r)      s    
zStreamingResponse.__init__)r[   r   c                s$   x| I d H }|d dkrP qW d S )Nr]   zhttp.disconnectr   )r(   r[   messager   r   r   listen_for_disconnect   s    z'StreamingResponse.listen_for_disconnect)r\   r   c          	      s   |d| j | jdI d H  xX| j2 y3 d H }W n
 tk
shX t|tsP|| j}|d|ddI d H  q"   Y  W |ddddI d H  d S )Nzhttp.response.start)r]   r^   r"   zhttp.response.bodyT)r]   r&   	more_bodyr*   F)r!   r<   r   StopAsyncIterationr+   r,   r-   r.   )r(   r\   chunkr   r   r   stream_response   s     
$z!StreamingResponse.stream_response)rZ   r[   r\   r   c          
      s|   t  4 I d H D dd d fdd} |t| j| |t| j|I d H  W d 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 )N)Zcancel_scopecancel)r   )
task_groupr   r   wrap  s    z(StreamingResponse.__call__.<locals>.wrap)anyioZcreate_task_groupZ
start_soonr   r   r   r$   )r(   rZ   r[   r\   r   r   )r   r   r_     s    &
zStreamingResponse.__call__)r   NNN)r`   ra   rb   AsyncContentStream__annotations__ContentStreamre   rc   rf   rg   r8   r	   r)   r   r   r   r   r   r_   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
attachmentzos.PathLike[str])
rK   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   z
text/plainz{}; filename*=utf-8''{}z{}; filename="{}"zcontent-disposition)rK   r!   r   uppersend_header_onlyr   r#   r$   r'   r   formatr"   
setdefaultr   set_stat_headers)r(   rK   r!   r"   r#   r$   r   r   r   r   Zcontent_disposition_filenamecontent_dispositionr   r   r   r)     s(    





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 )	NT)rO   -F)Zusedforsecurityzcontent-lengthzlast-modifiedetag)r8   st_sizer   st_mtimer   r-   r"   r   )r(   r   r>   Zlast_modifiedZ	etag_baser   r   r   r   r   B  s    
zFileResponse.set_stat_headers)rZ   r[   r\   r   c       	   
      sF  | j d krzy&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  nvtj| jd
dI d H 4 I d H L}d}x@|r|| jI d H }t|| jk}|d||d	I d H  qW W d Q I d H R X | jd k	rB|  I d H  d S )NzFile at path z does not exist.z is not a file.zhttp.response.start)r]   r^   r"   zhttp.response.bodyr*   F)r]   r&   r   rb)modeT)r   r   Z	to_threadZrun_syncr   statrK   r   FileNotFoundErrorRuntimeErrorst_modeS_ISREGr!   r<   r   	open_fileread
chunk_sizer9   r$   )	r(   rZ   r[   r\   r   r   filer   r   r   r   r   r_   L  s4    

 $zFileResponse.__call__)r   NNNNNNr   )r`   ra   rb   r   rc   ri   r8   re   rf   rg   r	   r   r   r)   r   r   r   r   r_   r   r   r   r   r     s          N
r   )T)9http.cookiesrQ   rv   r   r   r   rc   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   typing_extensionsrR   Morsel	_reservedri   r8   rj   Tuplerf   r   rk   rl   rm   rz   r,   ZContentIteratorZSyncContentStreamr   r   r   r~   r   r   r   r   r   <module>   sD   
$ 

7