o
    [h4,                  
   @   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"yp   dZdZ!Y nw 	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,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urlos.PathLike[str]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/home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/starlette/responses.pyr      s   


r   c                   @   s  e Zd ZdZdZ					d(dejdedede	de
d	dfd
dZdejd	efddZd)d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dede	de	dedede	d	dfdd Zd+de	de	de	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'   8   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}|r=|r=tt|}|d|d	f | j}|d ur\|r\|d
rR|d| j 7 }|d|d	f || _	d S )NTc                 S   s(   g | ]\}}|  d |d fqS )latin-1)lowerr0   ).0kvr   r   r   
<listcomp>E   s    z)Response.init_headers.<locals>.<listcomp>c                 S   s   g | ]}|d  qS )r   r   )r5   hr   r   r   r8   I   s    s   content-lengths   content-typer(   r-   r3   ztext/z
; charset=)
itemsgetattrstrlenappendr0   r$   
startswithr1   raw_headers)	r+   r#   r@   Zpopulate_content_lengthZpopulate_content_typekeysr(   content_lengthcontent_typer   r   r   r)   ?   s(   

zResponse.init_headersc                 C   s   t | dst| jd| _| jS )N_headers)raw)hasattrr
   r@   rD   )r+   r   r   r   r#   Z   s   
zResponse.headers /Flaxkeyvaluemax_ageexpirespathdomainsecurehttponlyr   c
                 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-agerM   rN   rO   TrP   rQ   )r   rI   nonez1samesite must be either 'strict', 'lax' or 'none'r   rG   )headers
   set-cookier3   )	httpcookiesSimpleCookier4   outputstripr@   r>   r0   )r+   rJ   rK   rL   rM   rN   rO   rP   rQ   r   cookieZ
cookie_valr   r   r   
set_cookie`   s*   
zResponse.set_cookiec                 C   s   | j |dd||d d S )Nr   )rM   rL   rN   rO   )rZ   )r+   rJ   rN   rO   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)ra   r(   )r"   r@   r(   r%   r+   r\   r]   r^   r   r   r   __call__   s   

zResponse.__call__)Nr    NNNr&   )rG   NNrH   NFFrI   )rH   N)__name__
__module____qualname__r$   r1   typingAnyintdictr<   r   r,   r/   r'   Mappingr)   propertyr
   r#   boolrZ   r[   r   r   r   re   r   r   r   r   r   %   sp    
	

$r   c                   @      e Zd ZdZdS )HTMLResponsez	text/htmlNrf   rg   rh   r$   r   r   r   r   rq          rq   c                   @   rp   )PlainTextResponse
text/plainNrr   r   r   r   r   rt      rs   rt   c                   @   s$   e Zd ZdZdejdefddZdS )JSONResponsezapplication/jsonr!   r   c                 C   s   t j|ddd dddS )NF),:)ensure_ascii	allow_nanindent
separatorsr   )jsondumpsr0   r2   r   r   r   r'      s   zJSONResponse.renderN)rf   rg   rh   r$   ri   rj   r/   r'   r   r   r   r   rv      s    rv   c                       sD   e Zd Z			d
dejeef deded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)superr,   r   r<   r#   )r+   r   r"   r#   r%   	__class__r   r   r,      s   zRedirectResponse.__init__)r   NN)rf   rg   rh   ri   Unionr<   r	   rk   rl   r   r,   __classcell__r   r   r   r   r      s    r   c                   @   sx   e Zd Z				ddejdededed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 )StreamingResponser    Nr!   r"   r#   r$   r%   r   c                 C   sL   t |tjr
|| _nt|| _|| _|d u r| jn|| _|| _| | d S r&   )	r.   ri   AsyncIterablebody_iteratorr   r"   r$   r%   r)   r*   r   r   r   r,      s   
zStreamingResponse.__init__r]   c                    s"   	 | I d H }|d dkrd S q)NTra   zhttp.disconnectr   )r+   r]   messager   r   r   listen_for_disconnect   s   z'StreamingResponse.listen_for_disconnectr^   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 )Nr_   r`   rc   Tra   r(   	more_bodyr-   F)r"   r@   r   r.   r/   r0   r1   )r+   r^   chunkr   r   r   stream_response   s   

z!StreamingResponse.stream_responser\   c                    sF   t | jd|if| jd|ifI d H  | jd ur!|  I d H  d S d S )Nr^   r]   )r   r   r   r%   rd   r   r   r   re      s   

zStreamingResponse.__call__)r    NNN)rf   rg   rh   ri   rj   rk   rl   r<   r   r,   r   r   r   r   r   re   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ded	e	d
ede
j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    NrN   r   r"   r#   r$   r%   filenamestat_resultmethodr   c	                 C   s   t d usJ d|| _|| _|| _|d uo| dk| _|d u r*t|p$|d p)d}|| _|| _| 	| | jd urWt
| j}	|	| jkrJd|	}
nd| j}
| jd|
 || _|d ure| | d S d S )Nz0'aiofiles' must be installed to use FileResponseHEADr   ru   zattachment; filename*=utf-8''{}zattachment; filename="{}"zcontent-disposition)aiofilesrN   r"   r   uppersend_header_onlyr   r$   r%   r)   r   formatr#   
setdefaultr   set_stat_headers)r+   rN   r"   r#   r$   r%   r   r   r   Zcontent_disposition_filenamecontent_dispositionr   r   r   r,      s,   



zFileResponse.__init__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md5r0   	hexdigestr#   r   )r+   r   rB   Zlast_modifiedZ	etag_baser   r   r   r   r     s   
zFileResponse.set_stat_headersr\   r]   r^   c           	   	      sL  | j d u r7zt| jI d H }| | W n ty%   td| j dw |j}t|s7td| j d|d| j	| j
dI d H  | jrS|dddd	I d H  nCtj| jd
d4 I d H ,}d}|r|| jI d H }t|| jk}|d||d	I d H  |sdW 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.r_   r`   rc   r-   Fr   rb)modeT)r   aio_statrN   r   FileNotFoundErrorRuntimeErrorst_moder   S_ISREGr"   r@   r   r   openread
chunk_sizer=   r%   )	r+   r\   r]   r^   r   r   filer   r   r   r   r   re     sF   



(
zFileResponse.__call__)r    NNNNNN)rf   rg   rh   r   ri   r   r<   rk   rl   r   r   r   r,   r   r   r   r   re   r   r   r   r   r      s<    	

"
r   )T)/r   http.cookiesrT   r}   r   r   r   ri   email.utilsr   	mimetypesr   r   urllib.parser   r   Zstarlette.backgroundr   Zstarlette.concurrencyr   r   Zstarlette.datastructuresr	   r
   Zstarlette.typesr   r   r   rU   Morsel	_reservedr   Zaiofiles.osr   ImportErrorr   r<   ro   TupleOptionalr   rq   rt   rv   r   r   r   r   r   r   r   <module>   sJ    
p1