o
    	+iS                     @  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
mZ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 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l.m/Z/m0Z0m1Z1 G dd dZ2G dd de2Z3G dd de2Z4G dd de2Z5G dd de2Z6e7e8B e9B Z:ee: Z;ee: Z<e<e;B Z=G dd de2Z>G dd de?Z@G dd  d e?ZAG d!d" d"e2ZBdS )#    )annotationsN)AsyncIterable	AwaitableCallableIterableMappingSequence)datetime)format_datetime
formatdate)partial)
guess_type)	token_hex)AnyLiteral)quote)collapse_excgroups)BackgroundTask)iterate_in_threadpool)URLHeadersMutableHeaders)ClientDisconnect)ReceiveScopeSendc                   @  s   e Zd ZdZdZ					d9d:ddZd;ddZd<d=ddZed>ddZ										d?d@d-d.Z
					dAdBd/d0ZdCd7d8ZdS )DResponseNutf-8   contentr   status_codeintheadersMapping[str, str] | None
media_type
str | None
backgroundBackgroundTask | NonereturnNonec                 C  s4   || _ |d ur
|| _|| _| || _| | d S N)r    r$   r&   renderbodyinit_headersselfr   r    r"   r$   r&    r0   P/var/www/html/psymed-ai/venv/lib/python3.10/site-packages/starlette/responses.py__init__"   s   zResponse.__init__bytes | memoryviewc                 C  s*   |d u rdS t |ttB r|S || jS )N    )
isinstancebytes
memoryviewencodecharsetr/   r   r0   r0   r1   r+   1   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 }|d urI|rI| jdk sI| jd	v sItt|}|d|d
f | j}|d urn|rn|drdd|	 vrd|d| j
 7 }|d|d
f || _d S )NTc                 S  s(   g | ]\}}|  d |d fqS )latin-1)lowerr8   ).0kvr0   r0   r1   
<listcomp>>   s   ( z)Response.init_headers.<locals>.<listcomp>c                 S  s   g | ]}|d  qS )r   r0   )r=   hr0   r0   r1   r@   ?   s    s   content-lengths   content-typer,   r   )   i0  r;   ztext/zcharset=z
; charset=)itemsgetattrr    strlenappendr8   r$   
startswithr<   r9   raw_headers)	r/   r"   rI   populate_content_lengthpopulate_content_typekeysr,   content_lengthcontent_typer0   r0   r1   r-   8   s*   
zResponse.init_headersr   c                 C  s   t | dst| jd| _| jS )N_headers)raw)hasattrr   rI   rO   )r/   r0   r0   r1   r"   T   s   
zResponse.headers /FlaxkeyrE   valuemax_age
int | Noneexpiresdatetime | str | int | Nonepathdomainsecureboolhttponlysamesite'Literal['lax', 'strict', 'none'] | Nonepartitionedc                 C  s  t j }|||< |d ur||| d< |d ur-t|tr't|dd|| d< n||| d< |d ur7||| d< |d urA||| d< |rId|| d< |rQd|| d< |	d ure|	 d	v s_J d
|	|| d< |
rvtjdk rpt	dd|| d< |j
dd }| jd|df d S )Nzmax-ageTusegmtrY   r[   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.rb   rR   )headers
   set-cookier;   )httpcookiesSimpleCookier5   r	   r
   r<   sysversion_info
ValueErroroutputstriprI   rG   r8   )r/   rU   rV   rW   rY   r[   r\   r]   r_   r`   rb   cookie
cookie_valr0   r0   r1   
set_cookieZ   s6   


zResponse.set_cookiec              
   C  s   | j |dd|||||d d S )Nr   )rW   rY   r[   r\   r]   r_   r`   )rt   )r/   rU   r[   r\   r]   r_   r`   r0   r0   r1   delete_cookie   s   	
zResponse.delete_cookiescoper   receiver   sendr   c                   sn   |d dkr	dnd}||d | j | jdI d H  ||d | jdI d H  | jd ur5|  I d H  d S d S )	Ntype	websocketz
websocket.rR   http.response.startry   statusr"   http.response.body)ry   r,   )r    rI   r,   r&   )r/   rv   rw   rx   prefixr0   r0   r1   __call__   s   

zResponse.__call__)Nr   NNNr   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   )r   r   r(   r3   r*   )r"   r#   r(   r)   )r(   r   )	rR   NNrS   NFFrT   F)rU   rE   rV   rE   rW   rX   rY   rZ   r[   r%   r\   r%   r]   r^   r_   r^   r`   ra   rb   r^   r(   r)   )rS   NFFrT   )rU   rE   r[   rE   r\   r%   r]   r^   r_   r^   r`   ra   r(   r)   rv   r   rw   r   rx   r   r(   r)   )__name__
__module____qualname__r$   r9   r2   r+   r-   propertyr"   rt   ru   r   r0   r0   r0   r1   r      s<    
0r   c                   @     e Zd ZdZdS )HTMLResponsez	text/htmlNr   r   r   r$   r0   r0   r0   r1   r          r   c                   @  r   )PlainTextResponse
text/plainNr   r0   r0   r0   r1   r      r   r   c                      s6   e Zd ZdZ				dd fddZdddZ  ZS )JSONResponsezapplication/jsonr   Nr   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   c                   s   t  ||||| d S r*   )superr2   r.   	__class__r0   r1   r2      s   zJSONResponse.__init__r6   c                 C  s   t j|ddd dddS )NF),:)ensure_ascii	allow_nanindent
separatorsr   )jsondumpsr8   r:   r0   r0   r1   r+      s   zJSONResponse.renderr   NNNr   )r   r   r(   r6   )r   r   r   r$   r2   r+   __classcell__r0   r0   r   r1   r      s    
r   c                      s&   e Zd Z			dd fddZ  ZS )RedirectResponse3  Nurl	str | URLr    r!   r"   r#   r&   r'   r(   r)   c                   s.   t  jd|||d tt|dd| jd< d S )Nr4   )r   r    r"   r&   z:/%#?=@[]!$&'()*+,;)safelocation)r   r2   r   rE   r"   )r/   r   r    r"   r&   r   r0   r1   r2      s   zRedirectResponse.__init__)r   NN)
r   r   r    r!   r"   r#   r&   r'   r(   r)   )r   r   r   r2   r   r0   r0   r   r1   r      s
    r   c                   @  sH   e Zd ZU ded< 				dd ddZd!ddZd"ddZd#ddZdS )$StreamingResponseAsyncContentStreambody_iteratorr   Nr   ContentStreamr    r!   r"   r#   r$   r%   r&   r'   r(   r)   c                 C  sJ   t |tr	|| _nt|| _|| _|d u r| jn|| _|| _| | d S r*   )r5   r   r   r   r    r$   r&   r-   r.   r0   r0   r1   r2      s   

zStreamingResponse.__init__rw   r   c                   s"   	 | I d H }|d dkrd S q)NTry   zhttp.disconnectr0   )r/   rw   messager0   r0   r1   listen_for_disconnect   s   z'StreamingResponse.listen_for_disconnectrx   r   c                   s|   |d| j | jdI d H  | j2 z3 d H W }t|ttB s$|| j}|d|ddI d H  q6 |ddddI d H  d S )Nr{   r|   r~   Try   r,   	more_bodyr4   F)r    rI   r   r5   r6   r7   r8   r9   )r/   rx   chunkr0   r0   r1   stream_response   s   
z!StreamingResponse.stream_responserv   r   c              
     s  t tt|di ddd}|dkr,z
| |I d H  W nW ty+   t w t B t	
 4 I d H ' d fd
d} |t| j| |t| j|I d H  W d   I d H  n1 I d H sew   Y  W d    n1 stw   Y  | jd ur|  I d H  d S d S )Nasgispec_versionz2.0.)      funcCallable[[], Awaitable[None]]r(   r)   c                   s   |  I d H   j   d S r*   )cancel_scopecancel)r   
task_groupr0   r1   wrap  s   z(StreamingResponse.__call__.<locals>.wrap)r   r   r(   r)   )tuplemapr!   getsplitr   OSErrorr   r   anyiocreate_task_group
start_soonr   r   r&   )r/   rv   rw   rx   r   r   r0   r   r1   r     s&   $(

zStreamingResponse.__call__r   )r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   )rw   r   r(   r)   )rx   r   r(   r)   r   )r   r   r   __annotations__r2   r   r   r   r0   r0   r0   r1   r      s   
 

r   c                   @  s   e Zd Zd	d
ddZdS )MalformedRangeHeaderMalformed range header.r   rE   r(   r)   c                 C  
   || _ d S r*   )r   r:   r0   r0   r1   r2        
zMalformedRangeHeader.__init__N)r   )r   rE   r(   r)   r   r   r   r2   r0   r0   r0   r1   r     s    r   c                   @  s   e Zd ZdddZdS )	RangeNotSatisfiablemax_sizer!   r(   r)   c                 C  r   r*   )r   )r/   r   r0   r0   r1   r2   !  r   zRangeNotSatisfiable.__init__N)r   r!   r(   r)   r   r0   r0   r0   r1   r      s    r   c                   @  s   e Zd ZdZ								dBdCddZdDddZdEd"d#ZdFd'd(ZdGd,d-ZdHd0d1Z	dId3d4Z
edJd6d7ZedKd9d:ZdLd@dAZdS )MFileResponsei   r   N
attachmentr[   str | os.PathLike[str]r    r!   r"   r#   r$   r%   r&   r'   filenamestat_resultos.stat_result | Nonemethodcontent_disposition_typerE   r(   r)   c
                 C  s   || _ || _|| _|d urtdt |d u r!t|p|d p d}|| _|| _| 	| | j
dd | jd urZt| j}
|
| jkrJ|	 d|
 }n	|	 d| j d}| j
d	| || _|d urh| | d S d S )
Nz;The 'method' parameter is not used, and it will be removed.r   r   zaccept-rangesr6   z; filename*=utf-8''z; filename=""zcontent-disposition)r[   r    r   warningswarnDeprecationWarningr   r$   r&   r-   r"   
setdefaultr   r   set_stat_headers)r/   r[   r    r"   r$   r&   r   r   r   r   content_disposition_filenamecontent_dispositionr0   r0   r1   r2   (  s0   



zFileResponse.__init__os.stat_resultc                 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 )
NTrc   -r   F)usedforsecuritycontent-lengthlast-modifiedetag)
rE   st_sizer   st_mtimehashlibmd5r8   	hexdigestr"   r   )r/   r   rM   last_modified	etag_baser   r0   r0   r1   r   M  s   
zFileResponse.set_stat_headersrv   r   rw   r   rx   r   c              
     s  |d   dk}d|di v }| jd u rLztjtj| jI d H }| 	| W n t
y9   td| j dw |j}t|sKtd| j dn| j}t|d}|d	}	|d
}
|	d u sk|
d urv| |
sv| |||I d H  nvz	| |	|j}W nF ty } zt|jdd|||I d H W  Y d }~S d }~w ty } ztddd|j id}||||I d H W  Y d }~S d }~ww t|dkr|d \}}| ||||j|I d H  n| |||j|I d H  | jd ur|  I d H  d S d S )Nr   HEADhttp.response.pathsend
extensionszFile at path z does not exist.z is not a file.)rv   rangezif-rangei  )r    i  zContent-Rangez*/)r    r"      r   )upperr   r   r   	to_threadrun_syncosstatr[   r   FileNotFoundErrorRuntimeErrorst_modeS_ISREGr   _should_use_range_handle_simple_parse_range_headerr   r   r   r   r   r   rF   _handle_single_range_handle_multiple_rangesr&   )r/   rv   rw   rx   send_header_onlysend_pathsendr   moder"   
http_rangehttp_if_rangerangesexcresponsestartendr0   r0   r1   r   W  sJ   




(
zFileResponse.__call__r   r^   r   c              	     s   |d| j | jdI d H  |r|ddddI d H  d S |r.|dt| jdI d H  d S tj| jd	d
I d H 4 I d H -}d}|r_|| jI d H }t|| jk}|d||dI d H  |sBW d   I d H  d S 1 I d H spw   Y  d S )Nr{   r|   r~   r4   Fr   r   )ry   r[   rbr   T)	r    rI   rE   r[   r   	open_fileread
chunk_sizerF   )r/   rx   r   r   filer   r   r0   r0   r1   r     s    .zFileResponse._handle_simpler   r   	file_sizec           	   	     s*  d| d|d  d| | j d< t|| | j d< |dd| jd	I d H  |r5|d
dddI d H  d S tj| jddI d H 4 I d H D}||I d H  d}|r}|t| j	|| I d H }|t
|7 }t
|| j	koo||k }|d
||dI d H  |sQW d   I d H  d S 1 I d H sw   Y  d S )Nzbytes r   r   rS   content-ranger   r{      r|   r~   r4   Fr   r  r  T)r"   rE   rI   r   r  r[   seekr  minr  rF   )	r/   rx   r   r   r  r   r  r   r   r0   r0   r1   r     s      .z!FileResponse._handle_single_ranger   list[tuple[int, int]]c              	     s  t d}| |||| jd \}}d| | jd< t|| jd< |dd| jdI d H  |r<|d	d
ddI d H  d S tj| jddI d H 4 I d H m}|D ]L\}	}
|d	||	|
ddI d H  ||	I d H  |	|
k r|	t
| j|
|	 I d H }|	t|7 }	|d	|ddI d H  |	|
k sl|d	dddI d H  qN|d	d| ddddI d H  W d   I d H  d S 1 I d H sw   Y  d S )N   zcontent-typezmultipart/byteranges; boundary=r  r   r{   r	  r|   r~   r4   Fr   r  r  T   
z
--z--
r;   )r   generate_multipartr"   rE   rI   r   r  r[   r
  r  r  r  rF   r8   )r/   rx   r   r  r   boundaryrM   header_generatorr  r   r   r   r0   r0   r1   r     s6    .z$FileResponse._handle_multiple_rangesr   c                 C  s   || j d kp|| j d kS )Nr   r   )r"   )r/   r   r0   r0   r1   r     s   zFileResponse._should_use_ranger   c                   s4  g }z
| dd\}}W n
 ty   t w |  }|dkr%td| | }t|dkr5tdt fdd|D rDt td	d |D rQtd
t|dkrY|S g }|D ]:\}}t	t|D ](}	||	 \}
}||krtqg||
k r|
|	||f  nt||
t||f||	<  n|||f q]|S )N=r   r6   zOnly support bytes ranger   z%Range header: range must be requestedc                 3  s.    | ]\}}d |  ko k n   V  qdS )r   Nr0   )r=   r   _r  r0   r1   	<genexpr>  s   , z3FileResponse._parse_range_header.<locals>.<genexpr>c                 s  s    | ]	\}}||kV  qd S r*   r0   r=   r   r   r0   r0   r1   r    s    z)Range header: start must be less than end)r   ro   r   rq   r<   _parse_rangesrF   anyr   r   insertr  maxrG   )clsr   r  r   unitsrange_resultr   r   pp_startp_endr0   r  r1   r     s@   z FileResponse._parse_range_headerr  c           	   	   C  s   g }| dD ]R}| }|r|dkrqd|vrq| dd\}}| }| }z'|r0t|n|t| }|rF|rFt||k rFt|d n|}|||f W q tyY   Y qw |S )Nr   r   r   )r   rq   r!   rG   ro   )	r  r  r  r   part	start_strend_strr   r   r0   r0   r1   r    s$   $zFileResponse._parse_rangesSequence[tuple[int, int]]r  r   rN   'tuple[int, Callable[[int, int], bytes]]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<    | ]\}}t t|t t|d     ||  V  qdS )r   N)rF   rE   r  )static_header_part_lenr0   r1   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;   )r8   )r   r   )r  rN   r   r0   r1   <lambda>3  s   &z1FileResponse.generate_multipart.<locals>.<lambda>)rF   rE   sum)r/   r   r  r   rN   boundary_lenrM   r0   )r  rN   r   r(  r1   r    s   zFileResponse.generate_multipart)r   NNNNNNr   )r[   r   r    r!   r"   r#   r$   r%   r&   r'   r   r%   r   r   r   r%   r   rE   r(   r)   )r   r   r(   r)   r   )rx   r   r   r^   r   r^   r(   r)   )rx   r   r   r!   r   r!   r  r!   r   r^   r(   r)   )
rx   r   r   r  r  r!   r   r^   r(   r)   )r   rE   r(   r^   )r   rE   r  r!   r(   r  )r  rE   r  r!   r(   r  )
r   r%  r  rE   r   r!   rN   rE   r(   r&  )r   r   r   r  r2   r   r   r   r   r   r   classmethodr   r  r  r0   r0   r0   r1   r   %  s,    
%


)


#,r   )C
__future__r   r   http.cookiesrj   r   r   r   rm   r   collections.abcr   r   r   r   r   r   r	   email.utilsr
   r   	functoolsr   	mimetypesr   secretsr   typingr   r   urllib.parser   r   anyio.to_threadstarlette._utilsr   starlette.backgroundr   starlette.concurrencyr   starlette.datastructuresr   r   r   starlette.requestsr   starlette.typesr   r   r   r   r   r   r   r   rE   r6   r7   ContentSyncContentStreamr   r   r   	Exceptionr   r   r   r0   r0   r0   r1   <module>   sL      @