a
    ((a4,                     @   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Zd dlm	Z	 d dl
mZ d dlmZmZ d dlmZ d dlmZmZ d dlmZmZ d dlmZmZmZ d	ejjjd
< zd dlZd dl mZ! W n e"y   dZdZ!Y n0 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,G dd de(Z-G dd de(Z.dS )     N)
formatdate)
guess_type)quote
quote_plus)BackgroundTask)iterate_in_threadpoolrun_until_first_complete)URLMutableHeaders)ReceiveScopeSendSameSitesamesite)statTos.PathLike[str])urlstrictreturnc                 C   s   t jdk rt| } t| |S )N)      )sysversion_infoosfspathmimetypes_guess_type)r   r    r   Z/Users/bob/PycharmProjects/fastapi/venv/lib/python3.9/site-packages/starlette/responses.pyr      s    

r   c                   @   s   e Zd ZdZdZdejeee	e
ddddZejeddd	Zdeje	e	f dd
ddZeedddZde	e	eee	e	eee	dd
ddZd e	e	e	ddddZeeedd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__r"   r   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(   8   s
    
zResponse.render)r$   r   c           	      C   s   |d u rg }d}d}n0dd |  D }dd |D }d|v}d|v}t| dd}|rz|rztt|}|d|d	f | j}|d ur|r|d
r|d| j 7 }|d|d	f || _	d S )NTc                 S   s(   g | ] \}}|  d |d fqS )latin-1)lowerr2   ).0kvr   r   r   
<listcomp>E   s   z)Response.init_headers.<locals>.<listcomp>c                 S   s   g | ]}|d  qS )r   r   )r7   hr   r   r   r:   I   r/   s   content-lengths   content-typer)   r/   r5   ztext/z
; charset=)
itemsgetattrstrlenappendr2   r%   
startswithr3   raw_headers)	r,   r$   rB   Zpopulate_content_lengthZpopulate_content_typekeysr)   content_lengthcontent_typer   r   r   r*   ?   s(    
zResponse.init_headers)r   c                 C   s   t | dst| jd| _| jS )N_headers)raw)hasattrr
   rB   rF   )r,   r   r   r   r$   Z   s    
zResponse.headers /Flax)
keyvaluemax_ageexpirespathdomainsecurehttponlyr   r   c
                 C   s   t j }
||
|< |d ur&||
| d< |d ur:||
| d< |d urN||
| d< |d urb||
| d< |rrd|
| d< |rd|
| d< |	d ur|	 dv sJ d	|	|
| d
< |
jdd }| jd|df d S )Nzmax-agerO   rP   rQ   TrR   rS   )r   rK   nonez1samesite must be either 'strict', 'lax' or 'none'r   rI   )headers
   set-cookier5   )	httpcookiesSimpleCookier6   outputstriprB   r@   r2   )r,   rL   rM   rN   rO   rP   rQ   rR   rS   r   cookieZ
cookie_valr   r   r   
set_cookie`   s*    
zResponse.set_cookie)rL   rP   rQ   r   c                 C   s   | j |dd||d d S )Nr   )rO   rN   rP   rQ   )r\   )r,   rL   rP   rQ   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 urH|  I d H  d S )Nhttp.response.starttypestatusr$   http.response.body)rd   r)   )r#   rB   r)   r&   r,   r_   r`   ra   r   r   r   __call__   s    

zResponse.__call__)Nr    NNN)N)rI   NNrJ   NFFrK   )rJ   N)__name__
__module____qualname__r%   r3   typingAnyintdictr>   r   r-   r1   r(   Mappingr*   propertyr
   r$   boolr\   r]   r   r   r   rh   r   r   r   r   r   %   sR                $r   c                   @   s   e Zd ZdZdS )HTMLResponsez	text/htmlNri   rj   rk   r%   r   r   r   r   rs      s   rs   c                   @   s   e Zd ZdZdS )PlainTextResponse
text/plainNrt   r   r   r   r   ru      s   ru   c                   @   s"   e Zd ZdZejedddZdS )JSONResponsezapplication/jsonr.   c                 C   s   t j|ddd dddS )NF),:)ensure_ascii	allow_nanindent
separatorsr   )jsondumpsr2   r4   r   r   r   r(      s    zJSONResponse.renderN)ri   rj   rk   r%   rl   rm   r1   r(   r   r   r   r   rw      s   rw   c                       s6   e Zd Zdejeef ee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)superr-   r   r>   r$   )r,   r   r#   r$   r&   	__class__r   r   r-      s    zRedirectResponse.__init__)r   NN)ri   rj   rk   rl   Unionr>   r	   rn   ro   r   r-   __classcell__r   r   r   r   r      s      r   c                   @   s\   e Zd Zdejeee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 )StreamingResponser    Nr!   c                 C   sL   t |tjr|| _n
t|| _|| _|d u r2| jn|| _|| _| | d S r'   )	r0   rl   AsyncIterablebody_iteratorr   r#   r%   r&   r*   r+   r   r   r   r-      s    
zStreamingResponse.__init__)r`   r   c                    s    | I d H }|d dkr qq d S )Nrd   zhttp.disconnectr   )r,   r`   messager   r   r   listen_for_disconnect   s    z'StreamingResponse.listen_for_disconnect)ra   r   c                    sv   |d| j | jdI d H  | j2 z83 d H W }t|tsB|| j}|d|ddI d H  q 6 |ddddI d H  d S )Nrb   rc   rf   Trd   r)   	more_bodyr/   F)r#   rB   r   r0   r1   r2   r3   )r,   ra   chunkr   r   r   stream_response   s    

z!StreamingResponse.stream_responser^   c                    s@   t | jd|if| jd|ifI d H  | jd ur<|  I d H  d S )Nra   r`   )r   r   r   r&   rg   r   r   r   rh      s    

zStreamingResponse.__call__)r    NNN)ri   rj   rk   rl   rm   rn   ro   r>   r   r-   r   r   r   r   r   rh   r   r   r   r   r      s       r   c                   @   sb   e Zd ZdZdejedf eeee	ee
j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    Nr   )	rP   r#   r$   r%   r&   filenamestat_resultmethodr   c	                 C   s   t d usJ d|| _|| _|| _|d uo4| dk| _|d u rTt|pH|d pRd}|| _|| _| 	| | jd urt
| j}	|	| jkrd|	}
nd| j}
| jd|
 || _|d ur| | d S )Nz0'aiofiles' must be installed to use FileResponseHEADr   rv   zattachment; filename*=utf-8''{}zattachment; filename="{}"zcontent-disposition)aiofilesrP   r#   r   uppersend_header_onlyr   r%   r&   r*   r   formatr$   
setdefaultr   set_stat_headers)r,   rP   r#   r$   r%   r&   r   r   r   Zcontent_disposition_filenamecontent_dispositionr   r   r   r-      s*    



zFileResponse.__init__)r   r   c                 C   sp   t |j}t|jdd}t |jd t |j }t|  }| j	d| | j	d| | j	d| d S )NT)usegmt-zcontent-lengthzlast-modifiedetag)
r>   st_sizer   st_mtimehashlibmd5r2   	hexdigestr$   r   )r,   r   rD   Zlast_modifiedZ	etag_baser   r   r   r   r     s    
zFileResponse.set_stat_headersr^   c           	   	      sP  | j d u rpzt| jI d H }| | W n$ tyL   td| j dY n$0 |j}t|sptd| j d|d| j	| j
dI d H  | jr|dddd	I d H  ntj| jd
d4 I d H Z}d}|r|| jI d H }t|| jk}|d||d	I d H  qW d   I d H  q21 I d H s(0    Y  | jd urL|  I d H  d S )NzFile at path z does not exist.z is not a file.rb   rc   rf   r/   Fr   rb)modeT)r   aio_statrP   r   FileNotFoundErrorRuntimeErrorst_moder   S_ISREGr#   rB   r   r   openread
chunk_sizer?   r&   )	r,   r_   r`   ra   r   r   filer   r   r   r   r   rh     s<    


:zFileResponse.__call__)r    NNNNNN)ri   rj   rk   r   rl   r   r>   rn   ro   r   r   r   r-   r   r   r   r   rh   r   r   r   r   r      s*          "
r   )T)/r   http.cookiesrV   r~   r   r   r   rl   email.utilsr   	mimetypesr   r   urllib.parser   r   Zstarlette.backgroundr   Zstarlette.concurrencyr   r   Zstarlette.datastructuresr	   r
   Zstarlette.typesr   r   r   rW   Morsel	_reservedr   Zaiofiles.osr   ImportErrorr   r>   rr   TupleOptionalr   rs   ru   rw   r   r   r   r   r   r   r   <module>   s@   
 p1