a
    hP                     @  s  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	Z	d dl
Z
d dlmZmZmZmZm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mZmZmZ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,m-Z- d dl.m/Z/ d dl0m1Z1m2Z2m3Z3 G dd dZ4G dd de4Z5G dd de4Z6G dd de4Z7G dd de4Z8ee9e:e;f Z<ee< Z=ee< Z>ee>e=f Z?G dd de4Z@G dd deAZBG dd  d eAZCeDd!ZEG d"d# d#e4ZFdS )$    )annotationsN)AsyncIterable	AwaitableIterableMappingSequence)datetime)format_datetime
formatdate)partial)
guess_type)	token_hex)AnyCallableLiteralUnion)quote)collapse_excgroups)BackgroundTask)iterate_in_threadpool)URLHeadersMutableHeaders)ClientDisconnect)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"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   r   intMapping[str, str] | None
str | NoneBackgroundTask | NoneNonecontentstatus_codeheaders
media_type
backgroundreturnc                 C  s4   || _ |d ur|| _|| _| || _| | d S N)r'   r)   r*   renderbodyinit_headersselfr&   r'   r(   r)   r*    r2   O/var/www/html/assistant/venv/lib/python3.9/site-packages/starlette/responses.py__init__#   s    zResponse.__init__zbytes | memoryviewr&   r+   c                 C  s*   |d u rdS t |ttfr|S || jS )N    )
isinstancebytes
memoryviewencodecharsetr1   r&   r2   r2   r3   r-   2   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 }|d ur|r| jdk s| jd	v stt|}|d|d
f | j}|d ur|r|drd|	 vr|d| j
 7 }|d|d
f || _d S )NTc                 S  s(   g | ] \}}|  d |d fqS )latin-1)lowerr:   ).0kvr2   r2   r3   
<listcomp>?   r6   z)Response.init_headers.<locals>.<listcomp>c                 S  s   g | ]}|d  qS )r   r2   )r?   hr2   r2   r3   rB   @   r6   s   content-lengths   content-typer.   r   )   i0  r=   ztext/zcharset=z
; charset=)itemsgetattrr'   strlenappendr:   r)   
startswithr>   r;   raw_headers)	r1   r(   rK   Zpopulate_content_lengthZpopulate_content_typekeysr.   content_lengthcontent_typer2   r2   r3   r/   9   s2    zResponse.init_headersr   )r+   c                 C  s   t | dst| jd| _| jS )N_headers)raw)hasattrr   rK   rO   )r1   r2   r2   r3   r(   U   s    
zResponse.headers /FlaxrG   z
int | Nonezdatetime | str | int | Noneboolz'Literal['lax', 'strict', 'none'] | None)keyvaluemax_ageexpirespathdomainsecurehttponlysamesitepartitionedr+   c                 C  s  t j }|||< |d ur&||| d< |d urZt|trNt|dd|| d< n||| d< |d urn||| d< |d ur||| d< |rd|| d< |rd|| d< |	d ur|	 d	v sJ d
|	|| d< |
rtjdk rt	dd|| d< |j
dd }| jd|df d S )Nzmax-ageTusegmtrY   rZ   r[   r\   r]   )strictrT   nonez1samesite must be either 'strict', 'lax' or 'none'r^   )      z@Partitioned cookies are only supported in Python 3.14 and above.r_   rR   )headers
   set-cookier=   )httpcookiesSimpleCookier7   r   r	   r>   sysversion_info
ValueErroroutputstriprK   rI   r:   )r1   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   cookieZ
cookie_valr2   r2   r3   
set_cookie[   s6    


zResponse.set_cookie)rV   rZ   r[   r\   r]   r^   r+   c              
   C  s   | j |dd|||||d d S )Nr   )rX   rY   rZ   r[   r\   r]   r^   )rp   )r1   rV   rZ   r[   r\   r]   r^   r2   r2   r3   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 urd|  I d H  d S )	NtypeZ	websocketz
websocket.rR   http.response.startrv   statusr(   http.response.body)rv   r.   )r'   rK   r.   r*   )r1   rs   rt   ru   prefixr2   r2   r3   __call__   s    

zResponse.__call__)Nr   NNN)N)	rR   NNrS   NFFrT   F)rS   NFFrT   )__name__
__module____qualname__r)   r;   r4   r-   r/   propertyr(   rp   rq   r|   r2   r2   r2   r3   r      s:                 $0     r   c                   @  s   e Zd ZdZdS )HTMLResponsez	text/htmlNr}   r~   r   r)   r2   r2   r2   r3   r      s   r   c                   @  s   e Zd ZdZdS )PlainTextResponse
text/plainNr   r2   r2   r2   r3   r      s   r   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,   )superr4   r0   	__class__r2   r3   r4      s    zJSONResponse.__init__r8   r5   c                 C  s   t j|ddd dddS )NF),:)ensure_ascii	allow_nanindent
separatorsr   )jsondumpsr:   r<   r2   r2   r3   r-      s    zJSONResponse.render)r   NNN)r}   r~   r   r)   r4   r-   __classcell__r2   r2   r   r3   r      s       
r   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 )Nr6   )r&   r'   r(   r*   z:/%#?=@[]!$&'()*+,;)safelocation)r   r4   r   rG   r(   )r1   r   r'   r(   r*   r   r2   r3   r4      s    zRedirectResponse.__init__)r   NN)r}   r~   r   r4   r   r2   r2   r   r3   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  sJ   t |tr|| _n
t|| _|| _|d u r0| jn|| _|| _| | d S r,   )r7   r   r   r   r'   r)   r*   r/   r0   r2   r2   r3   r4      s    

zStreamingResponse.__init__r   )rt   r+   c                   s    | I d H }|d dkr qq d S )Nrv   zhttp.disconnectr2   )r1   rt   messager2   r2   r3   listen_for_disconnect   s    z'StreamingResponse.listen_for_disconnectr   )ru   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 )Nrw   rx   rz   Trv   r.   	more_bodyr6   F)r'   rK   r   r7   r8   r9   r:   r;   )r1   ru   chunkr2   r2   r3   stream_response   s    
z!StreamingResponse.stream_responser   rr   c              
     s  t tt|di ddd}|dkr\z| |I d H  W q tyX   t Y q0 nt  t	
 4 I d H T ddd fd	d
} |t| j| |t| j|I d H  W d   I d H  q1 I d H s0    Y  W d    n1 s0    Y  | jd ur|  I d H  d S )NZasgispec_versionz2.0.)      zCallable[[], Awaitable[None]]r$   )funcr+   c                   s   |  I d H   j   d S r,   )Zcancel_scopecancel)r   Z
task_groupr2   r3   wrap  s    z(StreamingResponse.__call__.<locals>.wrap)tuplemapr    getsplitr   OSErrorr   r   anyioZcreate_task_groupZ
start_soonr   r   r*   )r1   rs   rt   ru   r   r   r2   r   r3   r|     s    $^zStreamingResponse.__call__)r   NNN)r}   r~   r   __annotations__r4   r   r   r|   r2   r2   r2   r3   r      s   
    r   c                   @  s   e Zd ZddddddZdS )	MalformedRangeHeaderMalformed range header.rG   r$   r5   c                 C  s
   || _ d S r,   )r&   r<   r2   r2   r3   r4     s    zMalformedRangeHeader.__init__N)r   r}   r~   r   r4   r2   r2   r2   r3   r     s   r   c                   @  s   e Zd ZdddddZdS )RangeNotSatisfiabler    r$   )max_sizer+   c                 C  s
   || _ d S r,   )r   )r1   r   r2   r2   r3   r4   "  s    zRangeNotSatisfiable.__init__Nr   r2   r2   r2   r3   r   !  s   r   z(\d*)-(\d*)c                   @  s   e Zd ZdZd0d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ddddddZddddddddd Zdd!dddd"d#d$Z	ddd%d&d'Z
eddd!d(d)d*Zd+dddd,d-d.d/ZdS )1FileResponsei   r   N
attachmentzstr | os.PathLike[str]r    r!   r"   r#   zos.stat_result | NonerG   r$   )
rZ   r'   r(   r)   r*   filenamestat_resultmethodcontent_disposition_typer+   c
                 C  s   || _ || _|| _|d ur&tdt |d u rBt|p6|d p@d}|| _|| _| 	| | j
dd | jd urt| j}
|
| jkr|	 d|
 }n|	 d| j d}| j
d	| || _|d ur| | d S )
Nz;The 'method' parameter is not used, and it will be removed.r   r   zaccept-rangesr8   z; filename*=utf-8''z; filename=""zcontent-disposition)rZ   r'   r   warningswarnDeprecationWarningr   r)   r*   r/   r(   
setdefaultr   r   set_stat_headers)r1   rZ   r'   r(   r)   r*   r   r   r   r   Zcontent_disposition_filenamecontent_dispositionr2   r2   r3   r4   ,  s.    



zFileResponse.__init__zos.stat_result)r   r+   c                 C  s|   t |j}t|jdd}t |jd t |j }dtj| dd  d}| j	d| | j	d| | j	d	| d S )
NTr`   -r   F)usedforsecuritycontent-lengthlast-modifiedetag)
rG   st_sizer
   st_mtimehashlibmd5r:   	hexdigestr(   r   )r1   r   rM   Zlast_modifiedZ	etag_baser   r2   r2   r3   r   Q  s    
zFileResponse.set_stat_headersr   r   r   rr   c              
     s   |d   dk}d|di v }| jd u rz&tjtj| jI d H }| 	| W n$ t
yt   td| j dY q0 |j}t|std| j dn| j}t|d}|d	}	|d
}
|	d u s|
d ur| |
s| |||I d H   nz| |	|j}W n tyD } z(t|jdd|||I d H W  Y d }~S d }~0  ty } z6tddd|j id}||||I d H W  Y d }~S d }~0 0 t|dkr|d \}}| ||||j|I d H  n| |||j|I d H  | jd ur|  I d H  d S )Nr   HEADhttp.response.pathsend
extensionszFile at path z does not exist.z is not a file.)rs   rangezif-rangei  )r'   i  zContent-Rangez*/)r'   r(      r   )upperr   r   r   Z	to_threadZrun_syncosstatrZ   r   FileNotFoundErrorRuntimeErrorst_modeS_ISREGr   _should_use_range_handle_simple_parse_range_headerr   r   r   r&   r   r   rH   _handle_single_range_handle_multiple_rangesr*   )r1   rs   rt   ru   send_header_onlysend_pathsendr   moder(   
http_rangehttp_if_rangerangesexcresponsestartendr2   r2   r3   r|   [  s<    




0(zFileResponse.__call__rU   )ru   r   r   r+   c              	     s   |d| j | jdI d H  |r6|ddddI d H  n|rV|dt| jdI d H  ntj| jd	d
I d H 4 I d H V}d}|r|| jI d H }t|| jk}|d||dI d H  qzW d   I d H  q1 I d H s0    Y  d S )Nrw   rx   rz   r6   Fr   r   )rv   rZ   rbr   T)	r'   rK   rG   rZ   r   	open_fileread
chunk_sizerH   )r1   ru   r   r   filer   r   r2   r2   r3   r     s     zFileResponse._handle_simple)ru   r   r   	file_sizer   r+   c           	   	     s&  d| d|d  d| | j d< t|| | j d< |dd| jd	I d H  |rf|d
dddI d H  ntj| jddI d H 4 I d H }||I d H  d}|r|t| j	|| I d H }|t
|7 }t
|| j	ko||k }|d
||dI d H  qW d   I d H  q"1 I d H s0    Y  d S )Nzbytes r   r   rS   content-ranger   rw      rx   rz   r6   Fr   r   r   T)r(   rG   rK   r   r   rZ   seekr   minr   rH   )	r1   ru   r   r   r   r   r   r   r   r2   r2   r3   r     s      z!FileResponse._handle_single_rangezlist[tuple[int, int]])ru   r   r   r   r+   c              	     s  t d}| |||| jd \}}d| | jd< t|| jd< |dd| jdI d H  |rv|d	d
ddI d H  ntj| jddI d H 4 I d H }|D ]\}	}
|d	||	|
ddI d H  ||	I d H  |	|
k r|	t
| j|
|	 I d H }|	t|7 }	|d	|ddI d H  q|d	dddI d H  q|d	d| ddddI d H  W d   I d H  q1 I d H sx0    Y  d S )N   zcontent-typezmultipart/byteranges; boundary=r   r   rw   r   rx   rz   r6   Fr   r   r   T   
z
--z--
r=   )r   generate_multipartr(   rG   rK   r   r   rZ   r   r   r   r   rH   r:   )r1   ru   r   r   r   boundaryrM   Zheader_generatorr   r   r   r   r2   r2   r3   r     s0     
z$FileResponse._handle_multiple_ranges)r   r+   c                 C  s   || j d kp|| j d kS )Nr   r   )r(   )r1   r   r2   r2   r3   r     s    zFileResponse._should_use_range)r   r   r+   c                   sL  g }z|  dd\}}W n ty0   t Y n0 |  }|dkrNtd fddt|D }t|dkrztdt fd	d
|D rt	 tdd
 |D rtdt|dkr|S g }|D ]|\}}t
t|D ]X}|| \}	}
||
krqq||	k r||||f  qqt||	t||
f||<  qq|||f q|S )N=r   r8   zOnly support bytes rangec                   sl   g | ]d}|d kr|d r$t |d n t |d  |d rb|d rbt |d  k rbt |d d n fqS ))rR   rR   r   r   )r    )r?   _r   r2   r3   rB     s
   "2z4FileResponse._parse_range_header.<locals>.<listcomp>r   z%Range header: range must be requestedc                 3  s,   | ]$\}}d |  ko k n   V  qdS )r   Nr2   )r?   r   r   r   r2   r3   	<genexpr>  r6   z3FileResponse._parse_range_header.<locals>.<genexpr>c                 s  s   | ]\}}||kV  qd S r,   r2   r?   r   r   r2   r2   r3   r     r6   z)Range header: start must be less than end)r   rl   r   rn   r>   _RANGE_PATTERNfindallrH   anyr   r   insertr   maxrI   )r   r   r   ZunitsZrange_resultr   r   pZp_startZp_endr2   r   r3   r     s@    
	
z FileResponse._parse_range_headerzSequence[tuple[int, int]]z'tuple[int, Callable[[int, int], bytes]])r   r   r   rN   r+   c                   sV   t  }d| t  t t tfdd|D d|  }| fddfS )a  
        Multipart response headers generator.

        ```
        --{boundary}\n
        Content-Type: {content_type}\n
        Content-Range: bytes {start}-{end-1}/{max_size}\n
        \n
        ..........content...........\n
        --{boundary}\n
        Content-Type: {content_type}\n
        Content-Range: bytes {start}-{end-1}/{max_size}\n
        \n
        ..........content...........\n
        --{boundary}--\n
        ```
        ,   c                 3  s:   | ]2\}}t t|t t|d     ||  V  qdS )r   N)rH   rG   r   )static_header_part_lenr2   r3   r     s   z2FileResponse.generate_multipart.<locals>.<genexpr>   c                   s.   d  d d|  d|d  d d dS )	Nz--z
Content-Type: z
Content-Range: bytes r   r   rS   z

r=   )r:   )r   r   )r   rN   r   r2   r3   <lambda>!  s    &z1FileResponse.generate_multipart.<locals>.<lambda>)rH   rG   sum)r1   r   r   r   rN   Zboundary_lenrM   r2   )r   rN   r   r  r3   r     s    zFileResponse.generate_multipart)r   NNNNNNr   )r}   r~   r   r   r4   r   r|   r   r   r   r   staticmethodr   r   r2   r2   r2   r3   r   )  s&           "%
)#3r   )G
__future__r   r   http.cookiesrg   r   r   rer   rj   r   collections.abcr   r   r   r   r   r   email.utilsr	   r
   	functoolsr   	mimetypesr   Zsecretsr   typingr   r   r   r   urllib.parser   r   Zanyio.to_threadZstarlette._utilsr   Zstarlette.backgroundr   Zstarlette.concurrencyr   Zstarlette.datastructuresr   r   r   Zstarlette.requestsr   Zstarlette.typesr   r   r   r   r   r   r   r   rG   r8   r9   ZContentZSyncContentStreamr   r   r   	Exceptionr   r   compiler   r   r2   r2   r2   r3   <module>   sN    @
