o
    h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					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)   g/var/www/html/construction_image-detection-poc/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$   0   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)lowerr1   ).0kvr)   r)   r*   
<listcomp>=   s   ( z)Response.init_headers.<locals>.<listcomp>c                 S  s   g | ]}|d  qS )r   r)   )r6   hr)   r)   r*   r9   >   s    s   content-lengths   content-typer%   r   )   i0  r4   ztext/zcharset=z
; charset=)itemsgetattrr   strlenappendr1   r   
startswithr5   r2   raw_headers)	r(   r   rB   populate_content_lengthpopulate_content_typekeysr%   content_lengthcontent_typer)   r)   r*   r&   7   s*   
zResponse.init_headersr   c                 C  s   t | dst| jd| _| jS )N_headers)raw)hasattrr   rB   rH   )r(   r)   r)   r*   r   S   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usegmtrR   rT   rU   rV   rX   )strictrM   nonez1samesite must be either 'strict', 'lax' or 'none'rY   rK   )headers
   set-cookier4   )httpcookiesSimpleCookier.   r   r   r5   outputstriprB   r@   r1   )r(   rN   rO   rP   rR   rT   rU   rV   rX   rY   cookie
cookie_valr)   r)   r*   
set_cookieY   s.   

zResponse.set_cookiec              
   C  s   | j |dd|||||d d S )Nr   )rP   rR   rT   rU   rV   rX   rY   )rg   )r(   rN   rT   rU   rV   rX   rY   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.rK   http.response.startrl   statusr   http.response.body)rl   r%   )r   rB   r%   r   )r(   ri   rj   rk   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   )rK   NNrL   NFFrM   )rN   r>   rO   r>   rP   rQ   rR   rS   rT   r   rU   r   rV   rW   rX   rW   rY   rZ   r!   r"   )rL   NFFrM   )rN   r>   rT   r>   rU   r   rV   rW   rX   rW   rY   rZ   r!   r"   ri   r   rj   r   rk   r   r!   r"   )__name__
__module____qualname__r   r2   r+   r$   r&   propertyr   rg   rh   rs   r)   r)   r)   r*   r      s:    
*r   c                   @     e Zd ZdZdS )HTMLResponsez	text/htmlNrv   rw   rx   r   r)   r)   r)   r*   r{          r{   c                   @  rz   )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dumpsr1   r3   r)   r)   r*   r$      s   zJSONResponse.renderr   NNNrt   )r   r   r!   r/   )rv   rw   rx   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"   )rv   rw   rx   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__rj   r   c                   s"   	 | I d H }|d dkrd S q)NTrl   zhttp.disconnectr)   )r(   rj   messager)   r)   r*   listen_for_disconnect   s   z'StreamingResponse.listen_for_disconnectrk   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 )Nrn   ro   rq   Trl   r%   	more_bodyr-   F)r   rB   r   r.   r/   r0   r1   r2   )r(   rk   chunkr)   r)   r*   stream_response   s   
z!StreamingResponse.stream_responseri   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+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   r
   anyiocreate_task_group
start_soonr   r   r   )r(   ri   rj   rk   r   r   r)   r   r*   rs      s&   $(

zStreamingResponse.__call__r   )r   r   r   r   r   r   r   r   r   r    r!   r"   )rj   r   r!   r"   )rk   r   r!   r"   ru   )rv   rw   rx   __annotations__r+   r   r   rs   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   r3   r)   r)   r*   r+        
zMalformedRangeHeader.__init__N)r   )r   r>   r!   r"   rv   rw   rx   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
attachmentrT   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)rT   r   r   warningswarnDeprecationWarningr   r   r   r&   r   
setdefaultr	   r   set_stat_headers)r(   rT   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 )
NTr[   -r   F)usedforsecuritycontent-lengthlast-modifiedetag)
r>   st_sizer   st_mtimehashlibmd5r1   	hexdigestr   r   )r(   r   rF   last_modified	etag_baser   r)   r)   r*   r   I  s   
zFileResponse.set_stat_headersri   r   rj   r   rk   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.)ri   rangezif-rangei  )r   i  zContent-Rangez*/)r   r      r   )upperr   r   	to_threadrun_syncosstatrT   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(   ri   rj   rk   send_header_onlyr   moder   
http_rangehttp_if_rangerangesexcresponsestartendr)   r)   r*   rs   S  sH   




(
zFileResponse.__call__r   rW   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 )
Nrn   ro   rq   r-   Fr   rbr   T)r   rB   r   	open_filerT   read
chunk_sizer?   )r(   rk   r   filer   r   r)   r)   r*   r   z  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   rL   content-ranger   rn      ro   rq   r-   Fr   r   r   T)r   r>   rB   r   r   rT   seekr   minr   r?   )	r(   rk   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   rn   r   ro   rq   r-   Fr   r   r   T   
z
--z--
r4   )r   generate_multipartr   r>   rB   r   r   rT   r   r   r   r   r?   r1   )r(   rk   r   r   r   boundaryrF   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 ))rK   rK   r   r   )r   )r6   _r   r)   r*   r9     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)   )r6   r   r  r  r)   r*   	<genexpr>  s   , z3FileResponse._parse_range_header.<locals>.<genexpr>c                 s  s    | ]	\}}||kV  qd S r#   r)   r6   r   r   r)   r)   r*   r    s    z)Range header: start must be less than end)r   
ValueErrorr   rd   r5   _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   rG   .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   rL   z

r4   )r1   )r   r   )r  rG   r   r)   r*   <lambda>  s   &z1FileResponse.generate_multipart.<locals>.<lambda>)r?   r>   sum)r(   r   r  r   rG   boundary_lenrF   r)   )r  rG   r   r  r*   r    s   zFileResponse.generate_multipart)r   NNNNNNr   )rT   r   r   r   r   r   r   r   r   r    r   r   r   r   r   r   r   r>   r!   r"   )r   r   r!   r"   ru   )rk   r   r   rW   r!   r"   )rk   r   r   r   r   r   r   r   r   rW   r!   r"   )
rk   r   r   r   r   r   r   rW   r!   r"   )r   r>   r!   rW   )r   r>   r   r   r!   r   )
r   r  r  r>   r   r   rG   r>   r!   r  )rv   rw   rx   r   r+   r   rs   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._utilsr
   starlette.backgroundr   starlette.concurrencyr   starlette.datastructuresr   r   r   starlette.requestsr   starlette.typesr   r   r   r   r{   r~   r   r   Unionr>   r/   r0   ContentIterableSyncContentStreamr   r   r   r   	Exceptionr   r   compiler
  r   r)   r)   r)   r*   <module>   sL     

@
