o
    RhN                     @  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 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 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m Z  d dl!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 Z0e	j1e0 Z2e	j3e0 Z4e	j,e4e2f Z5G dd de'Z6G dd de7Z8G dd de7Z9e:dZ;G dd  d e'Z<dS )!    )annotationsN)datetime)format_datetime
formatdate)partial)
guess_type)	token_hex)quote)BackgroundTask)iterate_in_threadpool)URLHeadersMutableHeaders)ClientDisconnect)ReceiveScopeSendc                   @  s   e Zd ZdZdZ					d8d9ddZd:ddZd;d<ddZed=ddZ									d>d?d,d-Z
					d@dAd.d/ZdBd6d7ZdS )CResponseNutf-8   content
typing.Anystatus_codeintheaderstyping.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    r(   U/home/air/sanwanet/backup_V2/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fr|S || jS )N    )
isinstancebytes
memoryviewencodecharsetr'   r   r(   r(   r)   r#   /   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)lowerr0   ).0kvr(   r(   r)   
<listcomp><   s   ( z)Response.init_headers.<locals>.<listcomp>c                 S  s   g | ]}|d  qS )r   r(   )r5   hr(   r(   r)   r8   =   s    s   content-lengths   content-typer$   r   )   i0  r3   ztext/zcharset=z
; charset=)itemsgetattrr   strlenappendr0   r   
startswithr4   r1   raw_headers)	r'   r   rA   populate_content_lengthpopulate_content_typekeysr$   content_lengthcontent_typer(   r(   r)   r%   6   s*   
zResponse.init_headersr   c                 C  s   t | dst| jd| _| jS )N_headers)raw)hasattrr   rA   rG   )r'   r(   r(   r)   r   R   s   
zResponse.headers /Flaxkeyr=   valuemax_age
int | Noneexpiresdatetime | str | int | Nonepathdomainsecureboolhttponlysamesite.typing.Literal['lax', 'strict', 'none'] | Nonec
                 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< |
jdd }| j	
d|df d S )Nzmax-ageTusegmtrQ   rS   rT   rU   rW   )strictrL   nonez1samesite must be either 'strict', 'lax' or 'none'rX   rJ   )headers
   set-cookier3   )httpcookiesSimpleCookier-   r   r   r4   outputstriprA   r?   r0   )r'   rM   rN   rO   rQ   rS   rT   rU   rW   rX   cookie
cookie_valr(   r(   r)   
set_cookieX   s.   

zResponse.set_cookiec              
   C  s   | j |dd|||||d d S )Nr   )rO   rQ   rS   rT   rU   rW   rX   )rf   )r'   rM   rS   rT   rU   rW   rX   r(   r(   r)   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.rJ   http.response.startrk   statusr   http.response.body)rk   r$   )r   rA   r$   r   )r'   rh   ri   rj   prefixr(   r(   r)   __call__   s   

zResponse.__call__)Nr   NNNr   r   r   r   r   r   r   r   r   r   r    r!   )r   r   r    r+   r"   )r   r   r    r!   )r    r   )rJ   NNrK   NFFrL   )rM   r=   rN   r=   rO   rP   rQ   rR   rS   r   rT   r   rU   rV   rW   rV   rX   rY   r    r!   )rK   NFFrL   )rM   r=   rS   r=   rT   r   rU   rV   rW   rV   rX   rY   r    r!   rh   r   ri   r   rj   r   r    r!   )__name__
__module____qualname__r   r1   r*   r#   r%   propertyr   rf   rg   rr   r(   r(   r(   r)   r      s:    
*r   c                   @     e Zd ZdZdS )HTMLResponsez	text/htmlNru   rv   rw   r   r(   r(   r(   r)   rz          rz   c                   @  ry   )PlainTextResponse
text/plainNr{   r(   r(   r(   r)   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"   )superr*   r&   	__class__r(   r)   r*      s   zJSONResponse.__init__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.renderr   NNNrs   )r   r   r    r.   )ru   rv   rw   r   r*   r#   __classcell__r(   r(   r   r)   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 )Nr,   )r   r   r   r   z:/%#?=@[]!$&'()*+,;)safelocation)r   r*   r	   r=   r   )r'   r   r   r   r   r   r(   r)   r*      s   zRedirectResponse.__init__)r   NN)
r   r   r   r   r   r   r   r   r    r!   )ru   rv   rw   r*   r   r(   r(   r   r)   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  sL   t |tjr
|| _nt|| _|| _|d u r| jn|| _|| _| | d S r"   )	r-   typingAsyncIterabler   r   r   r   r   r%   r&   r(   r(   r)   r*      s   
zStreamingResponse.__init__ri   r   c                   s"   	 | I d H }|d dkrd S q)NTrk   zhttp.disconnectr(   )r'   ri   messager(   r(   r)   listen_for_disconnect   s   z'StreamingResponse.listen_for_disconnectrj   r   c                   s|   |d| j | jdI d H  | j2 z3 d H W }t|ttfs$|| j}|d|ddI d H  q6 |ddddI d H  d S )Nrm   rn   rp   Trk   r$   	more_bodyr,   F)r   rA   r   r-   r.   r/   r0   r1   )r'   rj   chunkr(   r(   r)   stream_response   s   
z!StreamingResponse.stream_responserh   r   c              	     s   t tt|di ddd}|dkr,z
| |I d H  W nD ty+   t w 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 saw   Y  | jd urt|  I d H  d S d S )Nasgispec_versionz2.0.)      func+typing.Callable[[], typing.Awaitable[None]]r    r!   c                   s   |  I d H   j   d S r"   )cancel_scopecancel)r   
task_groupr(   r)   wrap  s   z(StreamingResponse.__call__.<locals>.wrap)r   r   r    r!   )tuplemapr   getsplitr   OSErrorr   anyiocreate_task_group
start_soonr   r   r   )r'   rh   ri   rj   r   r   r(   r   r)   rr      s    $(
	zStreamingResponse.__call__r   )r   r   r   r   r   r   r   r   r   r   r    r!   )ri   r   r    r!   )rj   r   r    r!   rt   )ru   rv   rw   __annotations__r*   r   r   rr   r(   r(   r(   r)   r      s   
 

r   c                   @  s   e Zd Zd	d
ddZdS )MalformedRangeHeaderMalformed range header.r   r=   r    r!   c                 C  
   || _ d S r"   )r   r2   r(   r(   r)   r*        
zMalformedRangeHeader.__init__N)r   )r   r=   r    r!   ru   rv   rw   r*   r(   r(   r(   r)   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   r(   r(   r)   r*     r   zRangeNotSatisfiable.__init__N)r   r   r    r!   r   r(   r(   r(   r)   r     s    r   z(\d*)-(\d*)c                   @  s   e Zd ZdZ								d>d?ddZd@ddZdAd"d#ZdBd&d'ZdCd+d,ZdDd/d0Z	dEd2d3Z
edFd5d6ZdGd<d=ZdS )HFileResponsei   r   N
attachmentrS   str | os.PathLike[str]r   r   r   r   r   r   r   r   filenamestat_resultos.stat_result | Nonemethodcontent_disposition_typer=   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-rangesr.   z; filename*=utf-8''z; filename=""zcontent-disposition)rS   r   r   warningswarnDeprecationWarningr   r   r   r%   r   
setdefaultr	   r   set_stat_headers)r'   rS   r   r   r   r   r   r   r   r   content_disposition_filenamecontent_dispositionr(   r(   r)   r*   "  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 )
NTrZ   -r   F)usedforsecuritycontent-lengthlast-modifiedetag)
r=   st_sizer   st_mtimehashlibmd5r0   	hexdigestr   r   )r'   r   rE   last_modified	etag_baser   r(   r(   r)   r   G  s   
zFileResponse.set_stat_headersrh   r   ri   r   rj   r   c              
     s  |d   dk}| jd u rDztjtj| jI d H }| | W n t	y1   t
d| j dw |j}t|sCt
d| j dn| j}t|d}|d}|d}	|d u sc|	d urm| |	sm| ||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   HEADzFile at path z does not exist.z is not a file.)rh   rangezif-rangei  )r   i  zContent-Rangez*/)r   r      r   )upperr   r   	to_threadrun_syncosstatrS   r   FileNotFoundErrorRuntimeErrorst_modeS_ISREGr   r   _should_use_range_handle_simple_parse_range_headerr   r   r}   r   r   r   r>   _handle_single_range_handle_multiple_rangesr   )r'   rh   ri   rj   send_header_onlyr   moder   
http_rangehttp_if_rangerangesexcresponsestartendr(   r(   r)   rr   Q  sH   




(
zFileResponse.__call__r   rV   c              	     s   |d| j | 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 -}d	}|rN|| jI d H }t|| jk}|d||dI d H  |s1W d   I d H  d S 1 I d H s_w   Y  d S )
Nrm   rn   rp   r,   Fr   rbr   T)r   rA   r   	open_filerS   read
chunk_sizer>   )r'   rj   r   filer   r   r(   r(   r)   r   x  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   rK   content-ranger   rm      rn   rp   r,   Fr   r   r   T)r   r=   rA   r   r   rS   seekr   minr   r>   )	r'   rj   r   r   r   r   r   r   r   r(   r(   r)   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   rm   r   rn   rp   r,   Fr   r   r   T   
z
--z--
r3   )r   generate_multipartr   r=   rA   r   r   rS   r   r   r   r   r>   r0   )r'   rj   r   r   r   boundaryrE   header_generatorr   r   r   r   r(   r(   r)   r     s6    .z$FileResponse._handle_multiple_rangesr   c                 C  s   || j d kp|| j d kS )Nr   r   )r   )r'   r   r(   r(   r)   r     s   zFileResponse._should_use_ranger   c                   s@  g }z
|  dd\}}W n
 ty   t w |  }|dkr%td fddt|D }t|dkr;tdt fd	d
|D rJt	 tdd
 |D rWtdt|dkr_|S g }|D ]:\}}t
t|D ](}|| \}	}
||
krzqm||	k r||||f  nt||	t||
f||<  n|||f qc|S )N=r   r.   zOnly support bytes rangec                   sl   g | ]2}|d kr|d rt |d n t |d  |d r1|d r1t |d  k r1t |d d n fqS ))rJ   rJ   r   r   )r   )r5   _r   r(   r)   r8     s    "2z4FileResponse._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   Nr(   )r5   r   r  r  r(   r)   	<genexpr>  s   , z3FileResponse._parse_range_header.<locals>.<genexpr>c                 s  s    | ]	\}}||kV  qd S r"   r(   r5   r   r   r(   r(   r)   r    s    z)Range header: start must be less than end)r   
ValueErrorr   rc   r4   _RANGE_PATTERNfindallr>   anyr   r   insertr   maxr?   )r   r   r   unitsrange_resultr   r   pp_startp_endr(   r  r)   r     sD   
	z FileResponse._parse_range_header typing.Sequence[tuple[int, int]]r  r   rF   .tuple[int, typing.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)r>   r=   r  )static_header_part_lenr(   r)   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   rK   z

r3   )r0   )r   r   )r  rF   r   r(   r)   <lambda>  s   z1FileResponse.generate_multipart.<locals>.<lambda>)r>   r=   sum)r'   r   r  r   rF   boundary_lenrE   r(   )r  rF   r   r  r)   r     s   zFileResponse.generate_multipart)r   NNNNNNr   )rS   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r=   r    r!   )r   r   r    r!   rt   )rj   r   r   rV   r    r!   )rj   r   r   r   r   r   r   r   r   rV   r    r!   )
rj   r   r   r   r   r   r   rV   r    r!   )r   r=   r    rV   )r   r=   r   r   r    r   )
r   r  r  r=   r   r   rF   r=   r    r  )ru   rv   rw   r   r*   r   rr   r   r   r   r   staticmethodr   r   r(   r(   r(   r)   r     s(    
%


'


#3r   )=
__future__r   r   http.cookiesr_   r   r   rer   r   r   r   email.utilsr   r   	functoolsr   	mimetypesr   secretsr   urllib.parser	   r   anyio.to_threadstarlette.backgroundr
   starlette.concurrencyr   starlette.datastructuresr   r   r   starlette.requestsr   starlette.typesr   r   r   r   rz   r}   r   r   Unionr=   r.   r/   ContentIterableSyncContentStreamr   r   r   r   	Exceptionr   r   compiler	  r   r(   r(   r(   r)   <module>   sJ     

?
