U
    #ir0                     @  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d-dddddd	d
ddZdddddZd.dd	dddZeddddZ	d/ddddddddd d	d!
d"d#Z
d0dddddd d	d$d%d&Zd'd(d)d	d*d+d,ZdS )1ResponseNutf-8   
typing.Anyinttyping.Mapping[str, str] | None
str | NoneBackgroundTask | NoneNonecontentstatus_codeheaders
media_type
backgroundreturnc                 C  s4   || _ |d k	r|| _|| _| || _| | d S N)r   r   r   renderbodyinit_headersselfr   r   r   r   r    r'   [/var/www/html/me.goteku.com/backend/venv/lib/python3.8/site-packages/starlette/responses.py__init__   s    zResponse.__init__zbytes | memoryviewr   r    c                 C  s*   |d k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.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rd|	 kr|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'   )r4   hr'   r'   r(   r7   :   s     s   content-lengths   content-typer#   r   )   i0  r2   ztext/zcharset=z
; charset=)itemsgetattrr   strlenappendr/   r   
startswithr3   r0   raw_headers)	r&   r   r@   Zpopulate_content_lengthZpopulate_content_typekeysr#   content_lengthcontent_typer'   r'   r(   r$   3   s2    zResponse.init_headersr   )r    c                 C  s   t | dst| jd| _| jS )N_headers)raw)hasattrr   r@   rD   )r&   r'   r'   r(   r   O   s    
zResponse.headers /Flaxr<   z
int | Nonezdatetime | str | int | Noneboolz0typing.Literal[('lax', 'strict', 'none')] | None)
keyvaluemax_ageexpirespathdomainsecurehttponlysamesiter    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usegmtrN   rO   rP   rQ   rR   )strictrI   nonez1samesite must be either 'strict', 'lax' or 'none'rS   rG   )headers
   set-cookier2   )httpcookiesSimpleCookier,   r   r   r3   AssertionErroroutputstripr@   r>   r/   )r&   rK   rL   rM   rN   rO   rP   rQ   rR   rS   cookieZ
cookie_valr'   r'   r(   
set_cookieU   s.    

zResponse.set_cookie)rK   rO   rP   rQ   rR   rS   r    c              
   C  s   | j |dd|||||d d S )Nr   )rM   rN   rO   rP   rQ   rR   rS   )r`   )r&   rK   rO   rP   rQ   rR   rS   r'   r'   r(   delete_cookie|   s    	zResponse.delete_cookier   r   r   scopereceivesendr    c                   sh   |d dkrdnd}||d | j | jdI d H  ||d | jdI d H  | jd k	rd|  I d H  d S )	NtypeZ	websocketz
websocket.rG   http.response.startrf   statusr   http.response.body)rf   r#   )r   r@   r#   r   )r&   rc   rd   re   prefixr'   r'   r(   __call__   s    

zResponse.__call__)Nr   NNN)N)rG   NNrH   NFFrI   )rH   NFFrI   )__name__
__module____qualname__r   r0   r)   r"   r$   propertyr   r`   ra   rl   r'   r'   r'   r(   r      s8                "*     r   c                   @  s   e Zd ZdZdS )HTMLResponsez	text/htmlNrm   rn   ro   r   r'   r'   r'   r(   rq      s   rq   c                   @  s   e Zd ZdZdS )PlainTextResponse
text/plainNrr   r'   r'   r'   r(   rs      s   rs   c                      sB   e Zd ZdZddddddd	d
 fddZdddddZ  ZS )JSONResponsezapplication/jsonr   Nr   r   r   r   r   r   r   c                   s   t  ||||| d S r!   )superr)   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
separatorsr   )jsondumpsr/   r1   r'   r'   r(   r"      s    zJSONResponse.render)r   NNN)rm   rn   ro   r   r)   r"   __classcell__r'   r'   rw   r(   ru      s       
ru   c                      s,   e Zd Zddddddd fd	d
Z  ZS )RedirectResponse3  Nz	str | URLr   r   r   r   )urlr   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)rv   r)   r   r<   r   )r&   r   r   r   r   rw   r'   r(   r)      s    zRedirectResponse.__init__)r   NN)rm   rn   ro   r)   r   r'   r'   rw   r(   r      s      r   c                   @  sd   e Zd ZU ded< dddddd	d
dddZdd
dddZdd
dddZdddd
dddZdS )StreamingResponseAsyncContentStreambody_iteratorr   NContentStreamr   r   r   r   r   r   c                 C  sL   t |tjr|| _n
t|| _|| _|d kr2| jn|| _|| _| | d S r!   )	r,   typingAsyncIterabler   r   r   r   r   r$   r%   r'   r'   r(   r)      s    
zStreamingResponse.__init__r   )rd   r    c                   s    | I d H }|d dkr qq d S )Nrf   zhttp.disconnectr'   )r&   rd   messager'   r'   r(   listen_for_disconnect   s    z'StreamingResponse.listen_for_disconnectr   )re   r    c                   sz   |d| j | jdI d H  | j2 z<3 d H W }t|ttfsF|| j}|d|ddI d H  q 6 |ddddI d H  d S )Nrg   rh   rj   Trf   r#   	more_bodyr+   F)r   r@   r   r,   r-   r.   r/   r0   )r&   re   chunkr'   r'   r(   stream_response   s    
z!StreamingResponse.stream_responser   rb   c              
     s|   t  4 I d H D ddd fdd} |t| j| |t| j|I d H  W 5 Q I d H R X | jd k	rx|  I d H  d S )Nz+typing.Callable[[], typing.Awaitable[None]]r   )funcr    c                   s   |  I d H   j   d S r!   )Zcancel_scopecancel)r   Z
task_groupr'   r(   wrap   s    z(StreamingResponse.__call__.<locals>.wrap)anyioZcreate_task_groupZ
start_soonr   r   r   r   )r&   rc   rd   re   r   r'   r   r(   rl      s    &
zStreamingResponse.__call__)r   NNN)rm   rn   ro   __annotations__r)   r   r   rl   r'   r'   r'   r(   r      s   
    r   c                   @  sV   e Zd ZdZdddddd	dd
dddd
ddZdddddZdddddddZdS )FileResponsei   r   N
attachmentzstr | os.PathLike[str]r   r   r   r   zos.stat_result | Noner<   r   )
rO   r   r   r   r   filenamestat_resultmethodcontent_disposition_typer    c
                 C  s   || _ || _|| _|d k	r&tdt |d krBt|p6|d p@d}|| _|| _| 	| | jd k	rt
| j}
|
| jkr|	 d|
 }n|	 d| j d}| jd| || _|d k	r| | d S )Nz;The 'method' parameter is not used, and it will be removed.r   rt   z; filename*=utf-8''z; filename=""zcontent-disposition)rO   r   r   warningswarnDeprecationWarningr   r   r   r$   r   r   
setdefaultr   set_stat_headers)r&   rO   r   r   r   r   r   r   r   r   Zcontent_disposition_filenamecontent_dispositionr'   r'   r(   r)   
  s,    



zFileResponse.__init__zos.stat_result)r   r    c                 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 )
NTrT   -r   F)Zusedforsecurityzcontent-lengthzlast-modifiedetag)r<   st_sizer   st_mtimer	   r/   r   r   )r&   r   rB   Zlast_modifiedZ	etag_baser   r'   r'   r(   r   .  s    
zFileResponse.set_stat_headersr   r   r   rb   c           	   
     sL  | j d krzz&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  |d  dkr|dd	d
dI d H  nrtj| jddI d H 4 I d H H}d}|r|| jI d H }t|| jk}|d||dI d H  qW 5 Q I d H R X | jd k	rH|  I d H  d S )NzFile at path z does not exist.z is not a file.rg   rh   r   HEADrj   r+   Fr   rb)modeT)r   r   Z	to_threadZrun_syncosstatrO   r   FileNotFoundErrorRuntimeErrorst_modeS_ISREGr   r@   upper	open_fileread
chunk_sizer=   r   )	r&   rc   rd   re   r   r   filer   r   r'   r'   r(   rl   8  s<    


 zFileResponse.__call__)r   NNNNNNr   )rm   rn   ro   r   r)   r   rl   r'   r'   r'   r(   r     s           "$
r   )3
__future__r   http.cookiesrY   r   r   r   r   r   r   email.utilsr   r   	functoolsr   	mimetypesr   urllib.parser   r   Zanyio.to_threadZstarlette._compatr	   Zstarlette.backgroundr
   Zstarlette.concurrencyr   Zstarlette.datastructuresr   r   Zstarlette.typesr   r   r   r   rq   rs   ru   r   Unionr<   r-   r.   ZContentIterableZSyncContentStreamr   r   r   r   r   r'   r'   r'   r(   <module>   s<    

7