a
    &gO                     @  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 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/e0e1f Z2e	j3e2 Z4e	j5e2 Z6e	j.e6e4f Z7G dd de)Z8G dd de9Z:G dd de9Z;e<dZ=G d d! d!e)Z>dS )"    )annotationsN)datetime)format_datetime
formatdate)partial)
guess_type)	token_hex)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#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 ur|| _|| _| || _| | d S N)r   r!   r"   renderbodyinit_headersselfr   r   r    r!   r"    r*   Q/var/www/html/texto_audio/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r)   r   r*   r*   r+   r%   0   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)lowerr2   ).0kvr*   r*   r+   
<listcomp>=   r.   z)Response.init_headers.<locals>.<listcomp>c                 S  s   g | ]}|d  qS )r   r*   )r7   hr*   r*   r+   r:   >   r.   s   content-lengths   content-typer&   r   )   i0  r5   ztext/zcharset=z
; charset=)itemsgetattrr   strlenappendr2   r!   
startswithr6   r3   raw_headers)	r)   r    rC   Zpopulate_content_lengthZpopulate_content_typekeysr&   content_lengthcontent_typer*   r*   r+   r'   7   s2    zResponse.init_headersr   )r#   c                 C  s   t | dst| jd| _| jS )N_headers)raw)hasattrr   rC   rG   )r)   r*   r*   r+   r    S   s    
zResponse.headers /Flaxr?   z
int | Nonezdatetime | str | int | Noneboolz.typing.Literal['lax', 'strict', 'none'] | None)
keyvaluemax_ageexpirespathdomainsecurehttponlysamesiter#   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< |
jdd }| j	
d|df d S )Nzmax-ageTusegmtrQ   rR   rS   rT   rU   )strictrL   nonez1samesite must be either 'strict', 'lax' or 'none'rV   rJ   )headers
   set-cookier5   )httpcookiesSimpleCookier/   r   r   r6   outputstriprC   rA   r2   )r)   rN   rO   rP   rQ   rR   rS   rT   rU   rV   cookieZ
cookie_valr*   r*   r+   
set_cookieY   s.    

zResponse.set_cookie)rN   rR   rS   rT   rU   rV   r#   c              
   C  s   | j |dd|||||d d S )Nr   )rP   rQ   rR   rS   rT   rU   rV   )rb   )r)   rN   rR   rS   rT   rU   rV   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 urd|  I d H  d S )	NtypeZ	websocketz
websocket.rJ   http.response.startrh   statusr    http.response.body)rh   r&   )r   rC   r&   r"   )r)   re   rf   rg   prefixr*   r*   r+   __call__   s    

zResponse.__call__)Nr   NNN)N)rJ   NNrK   NFFrL   )rK   NFFrL   )__name__
__module____qualname__r!   r3   r,   r%   r'   propertyr    rb   rc   rn   r*   r*   r*   r+   r      s8                "*     r   c                   @  s   e Zd ZdZdS )HTMLResponsez	text/htmlNro   rp   rq   r!   r*   r*   r*   r+   rs      s   rs   c                   @  s   e Zd ZdZdS )PlainTextResponse
text/plainNrt   r*   r*   r*   r+   ru      s   ru   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__r0   r-   c                 C  s   t j|ddd dddS )NF),:)ensure_ascii	allow_nanindent
separatorsr   )jsondumpsr2   r4   r*   r*   r+   r%      s    zJSONResponse.render)r   NNN)ro   rp   rq   r!   r,   r%   __classcell__r*   r*   ry   r+   rw      s       
rw   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)rx   r,   r	   r?   r    )r)   r   r   r    r"   ry   r*   r+   r,      s    zRedirectResponse.__init__)r   NN)ro   rp   rq   r,   r   r*   r*   ry   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 u r2| jn|| _|| _| | d S r$   )	r/   typingAsyncIterabler   r   r   r!   r"   r'   r(   r*   r*   r+   r,      s    
zStreamingResponse.__init__r   )rf   r#   c                   s    | I d H }|d dkr qq d S )Nrh   zhttp.disconnectr*   )r)   rf   messager*   r*   r+   listen_for_disconnect   s    z'StreamingResponse.listen_for_disconnectr   )rg   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 )Nri   rj   rl   Trh   r&   	more_bodyr.   F)r   rC   r   r/   r0   r1   r2   r3   )r)   rg   chunkr*   r*   r+   stream_response   s    
z!StreamingResponse.stream_responser   rd   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+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)tuplemapr   getsplitr   OSErrorr   r
   anyioZcreate_task_groupZ
start_soonr   r   r"   )r)   re   rf   rg   r   r   r*   r   r+   rn      s    $^zStreamingResponse.__call__)r   NNN)ro   rp   rq   __annotations__r,   r   r   rn   r*   r*   r*   r+   r      s   
    r   c                   @  s   e Zd ZddddddZdS )	MalformedRangeHeaderMalformed range header.r?   r   r-   c                 C  s
   || _ d S r$   )r   r4   r*   r*   r+   r,     s    zMalformedRangeHeader.__init__N)r   ro   rp   rq   r,   r*   r*   r*   r+   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   )r)   r   r*   r*   r+   r,     s    zRangeNotSatisfiable.__init__Nr   r*   r*   r*   r+   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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 | Noner?   r   )
rR   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   rv   zaccept-rangesr0   z; filename*=utf-8''z; filename=""zcontent-disposition)rR   r   r   warningswarnDeprecationWarningr   r!   r"   r'   r    
setdefaultr	   r   set_stat_headers)r)   rR   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  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 )
NTrW   -r   F)usedforsecuritycontent-lengthlast-modifiedetag)
r?   st_sizer   st_mtimehashlibmd5r2   	hexdigestr    r   )r)   r   rE   Zlast_modifiedZ	etag_baser   r*   r*   r+   r   I  s    
zFileResponse.set_stat_headersr   r   r   rd   c              
     s  |d   dk}| jd u rz&tjtj| jI d H }| | W n$ t	yd   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y2 } 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   HEADzFile at path z does not exist.z is not a file.)re   rangezif-rangei  )r   i  zContent-Rangez*/)r   r       r   )upperr   r   Z	to_threadZrun_syncosstatrR   r   FileNotFoundErrorRuntimeErrorst_modeS_ISREGr   r   _should_use_range_handle_simple_parse_range_headerr   r   ru   r   r   r   r@   _handle_single_range_handle_multiple_rangesr"   )r)   re   rf   rg   send_header_onlyr   moder    
http_rangehttp_if_rangerangesexcresponsestartendr*   r*   r+   rn   S  s:    




0(zFileResponse.__call__rM   )rg   r   r#   c              	     s   |d| j | jdI d H  |r6|ddd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 )
Nri   rj   rl   r.   Fr   rbr   T)r   rC   r   	open_filerR   read
chunk_sizer@   )r)   rg   r   filer   r   r*   r*   r+   r   z  s     zFileResponse._handle_simple)rg   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   rK   content-ranger   ri      rj   rl   r.   Fr   r   r   T)r    r?   rC   r   r   rR   seekr   minr   r@   )	r)   rg   r   r   r   r   r   r   r   r*   r*   r+   r     s      z!FileResponse._handle_single_rangezlist[tuple[int, int]])rg   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   ri   r   rj   rl   r.   Fr   r   r   T   
z
--z--
r5   )r   generate_multipartr    r?   rC   r   r   rR   r   r   r   r   r@   r2   )r)   rg   r   r   r   boundaryrE   Zheader_generatorr   r   r   r   r*   r*   r+   r     s0     
z$FileResponse._handle_multiple_ranges)r   r#   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_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   r0   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 ))rJ   rJ   r   r   )r   )r7   _r   r*   r+   r:     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   Nr*   )r7   r   r   r   r*   r+   	<genexpr>  r.   z3FileResponse._parse_range_header.<locals>.<genexpr>c                 s  s   | ]\}}||kV  qd S r$   r*   r7   r   r   r*   r*   r+   r     r.   z)Range header: start must be less than end)r   
ValueErrorr   r`   r6   _RANGE_PATTERNfindallr@   anyr   r   insertr   maxrA   )r   r   r   ZunitsZrange_resultr   r   pZp_startZp_endr*   r   r+   r     s@    
	
z FileResponse._parse_range_headerz typing.Sequence[tuple[int, int]]z.tuple[int, typing.Callable[[int, int], bytes]])r   r   r   rF   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)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

r5   )r2   )r   r   )r   rF   r   r*   r+   <lambda>  s    &z1FileResponse.generate_multipart.<locals>.<lambda>)r@   r?   sum)r)   r   r   r   rF   Zboundary_lenrE   r*   )r   rF   r   r   r+   r     s    zFileResponse.generate_multipart)r   NNNNNNr   )ro   rp   rq   r   r,   r   rn   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   Zsecretsr   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   rs   ru   rw   r   Unionr?   r0   r1   ZContentIterableZSyncContentStreamr   r   r   r   	Exceptionr   r   compiler   r   r*   r*   r*   r+   <module>   sJ    

@
