o
    ђ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					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'    r1   L/var/www/html/govbot/env/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r0   r    r1   r1   r2   r,   2   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)lowerr9   ).0kvr1   r1   r2   
<listcomp>?   s   ( z)Response.init_headers.<locals>.<listcomp>c                 S  s   g | ]}|d  qS )r   r1   )r>   hr1   r1   r2   rA   @   s    s   content-lengths   content-typer-   r   )   i0  r<   ztext/zcharset=z
; charset=)itemsgetattrr!   strlenappendr9   r%   
startswithr=   r:   raw_headers)	r0   r#   rJ   populate_content_lengthpopulate_content_typekeysr-   content_lengthcontent_typer1   r1   r2   r.   9   s*   
zResponse.init_headersr   c                 C  s   t | dst| jd| _| jS )N_headers)raw)hasattrr   rJ   rP   )r0   r1   r1   r2   r#   U   s   
zResponse.headers /FlaxkeyrF   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usegmtrZ   r\   r]   r^   r`   )strictrU   nonez1samesite must be either 'strict', 'lax' or 'none'ra   )      z@Partitioned cookies are only supported in Python 3.14 and above.rc   rS   )headers
   set-cookier<   )httpcookiesSimpleCookier6   r   r	   r=   sysversion_info
ValueErroroutputstriprJ   rH   r9   )r0   rV   rW   rX   rZ   r\   r]   r^   r`   ra   rc   cookie
cookie_valr1   r1   r2   
set_cookie[   s6   


zResponse.set_cookiec              
   C  s   | j |dd|||||d d S )Nr   )rX   rZ   r\   r]   r^   r`   ra   )ru   )r0   rV   r\   r]   r^   r`   ra   r1   r1   r2   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.rS   http.response.startrz   statusr#   http.response.body)rz   r-   )r!   rJ   r-   r'   )r0   rw   rx   ry   prefixr1   r1   r2   __call__   s   

zResponse.__call__)Nr   NNNr    r   r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   )r    r   r)   r4   r+   )r#   r$   r)   r*   )r)   r   )	rS   NNrT   NFFrU   F)rV   rF   rW   rF   rX   rY   rZ   r[   r\   r&   r]   r&   r^   r_   r`   r_   ra   rb   rc   r_   r)   r*   )rT   NFFrU   )rV   rF   r\   rF   r]   r&   r^   r_   r`   r_   ra   rb   r)   r*   rw   r   rx   r   ry   r   r)   r*   )__name__
__module____qualname__r%   r:   r3   r,   r.   propertyr#   ru   rv   r   r1   r1   r1   r2   r      s<    
0r   c                   @     e Zd ZdZdS )HTMLResponsez	text/htmlNr   r   r   r%   r1   r1   r1   r2   r          r   c                   @  r   )PlainTextResponse
text/plainNr   r1   r1   r1   r2   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+   )superr3   r/   	__class__r1   r2   r3      s   zJSONResponse.__init__r7   c                 C  s   t j|ddd dddS )NF),:)ensure_ascii	allow_nanindent
separatorsr   )jsondumpsr9   r;   r1   r1   r2   r,      s   zJSONResponse.renderr   NNNr   )r    r   r)   r7   )r   r   r   r%   r3   r,   __classcell__r1   r1   r   r2   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 )Nr5   )r    r!   r#   r'   z:/%#?=@[]!$&'()*+,;)safelocation)r   r3   r   rF   r#   )r0   r   r!   r#   r'   r   r1   r2   r3      s   zRedirectResponse.__init__)r   NN)
r   r   r!   r"   r#   r$   r'   r(   r)   r*   )r   r   r   r3   r   r1   r1   r   r2   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+   )r6   r   r   r   r!   r%   r'   r.   r/   r1   r1   r2   r3      s   

zStreamingResponse.__init__rx   r   c                   s"   	 | I d H }|d dkrd S q)NTrz   zhttp.disconnectr1   )r0   rx   messager1   r1   r2   listen_for_disconnect   s   z'StreamingResponse.listen_for_disconnectry   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 )Nr|   r}   r   Trz   r-   	more_bodyr5   F)r!   rJ   r   r6   r7   r8   r9   r:   )r0   ry   chunkr1   r1   r2   stream_response   s   
z!StreamingResponse.stream_responserw   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_groupr1   r2   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'   )r0   rw   rx   ry   r   r   r1   r   r2   r     s&   $(

zStreamingResponse.__call__r   )r    r   r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   )rx   r   r)   r*   )ry   r   r)   r*   r   )r   r   r   __annotations__r3   r   r   r   r1   r1   r1   r2   r      s   
 

r   c                   @  s   e Zd Zd	d
ddZdS )MalformedRangeHeaderMalformed range header.r    rF   r)   r*   c                 C  
   || _ d S r+   )r    r;   r1   r1   r2   r3        
zMalformedRangeHeader.__init__N)r   )r    rF   r)   r*   r   r   r   r3   r1   r1   r1   r2   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   )r0   r   r1   r1   r2   r3   "  r   zRangeNotSatisfiable.__init__N)r   r"   r)   r*   r   r1   r1   r1   r2   r   !  s    r   z(\d*)-(\d*)c                   @  s   e Zd ZdZ								d?d@ddZdAddZdBd"d#ZdCd'd(ZdDd,d-ZdEd0d1Z	dFd3d4Z
edGd6d7ZdHd=d>ZdS )I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_typerF   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-rangesr7   z; filename*=utf-8''z; filename=""zcontent-disposition)r\   r!   r   warningswarnDeprecationWarningr   r%   r'   r.   r#   
setdefaultr   r   set_stat_headers)r0   r\   r!   r#   r%   r'   r   r   r   r   content_disposition_filenamecontent_dispositionr1   r1   r2   r3   ,  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 )
NTrd   -r   F)usedforsecuritycontent-lengthlast-modifiedetag)
rF   st_sizer
   st_mtimehashlibmd5r9   	hexdigestr#   r   )r0   r   rN   last_modified	etag_baser   r1   r1   r2   r   Q  s   
zFileResponse.set_stat_headersrw   r   rx   r   ry   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.)rw   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   rG   _handle_single_range_handle_multiple_rangesr'   )r0   rw   rx   ry   send_header_onlysend_pathsendr   moder#   
http_rangehttp_if_rangerangesexcresponsestartendr1   r1   r2   r   [  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   r5   Fr   r   )rz   r\   rbr   T)	r!   rJ   rF   r\   r   	open_fileread
chunk_sizerG   )r0   ry   r   r   filer   r   r1   r1   r2   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   rT   content-ranger   r|      r}   r   r5   Fr   r  r  T)r#   rF   rJ   r   r  r\   seekr  minr  rG   )	r0   ry   r   r  r  r   r  r   r   r1   r1   r2   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   r5   Fr   r  r  T   
z
--z--
r<   )r   generate_multipartr#   rF   rJ   r   r  r\   r  r  r  r  rG   r9   )r0   ry   r   r  r   boundaryrN   header_generatorr  r   r  r   r1   r1   r2   r     s6    .z$FileResponse._handle_multiple_rangesr   c                 C  s   || j d kp|| j d kS )Nr   r   )r#   )r0   r   r1   r1   r2   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   r7   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 ))rS   rS   r   r   )r"   )r>   _r  r1   r2   rA     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   Nr1   )r>   r   r  r  r1   r2   	<genexpr>  s   , z3FileResponse._parse_range_header.<locals>.<genexpr>c                 s  s    | ]	\}}||kV  qd S r+   r1   r>   r   r  r1   r1   r2   r    s    z)Range header: start must be less than end)r   rp   r   rr   r=   _RANGE_PATTERNfindallrG   anyr   r   insertr  maxrH   )r   r  r   unitsrange_resultr   r  pp_startp_endr1   r  r2   r     sD   
	z FileResponse._parse_range_headerSequence[tuple[int, int]]r  r   rO   '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)rG   rF   r  )static_header_part_lenr1   r2   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   rT   z

r<   )r9   )r   r  )r  rO   r   r1   r2   <lambda>!  s   &z1FileResponse.generate_multipart.<locals>.<lambda>)rG   rF   sum)r0   r   r  r   rO   boundary_lenrN   r1   )r  rO   r   r&  r2   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   rF   r)   r*   )r   r   r)   r*   r   )ry   r   r   r_   r   r_   r)   r*   )ry   r   r   r"   r  r"   r  r"   r   r_   r)   r*   )
ry   r   r   r  r  r"   r   r_   r)   r*   )r   rF   r)   r_   )r   rF   r  r"   r)   r  )
r   r#  r  rF   r   r"   rO   rF   r)   r$  )r   r   r   r  r3   r   r   r   r   r   r   staticmethodr   r  r1   r1   r1   r2   r   )  s(    
%


)


#3r   )G
__future__r   r   http.cookiesrk   r   r   rer   rn   r   collections.abcr   r   r   r   r   r   email.utilsr	   r
   	functoolsr   	mimetypesr   secretsr   typingr   r   r   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   rF   r7   r8   ContentSyncContentStreamr   r   r   	Exceptionr   r   compiler  r   r1   r1   r1   r2   <module>   sP     @
