o
    iiT                     @  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	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.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)MessageReceiveScopeSendc                   @  s   e Zd ZdZdZ					d;d<ddZd=ddZd>d?ddZed@ddZ										dAdBd-d.Z
					dCdDd/d0ZdEd3d4ZdFd9d:ZdS )G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   [/var/www/scraper.webshop2u.hu/html/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r0   r    r1   r1   r2   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)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.   7   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#   S   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usegmtr[   r]   r^   r_   ra   )strictrV   nonez1samesite must be either 'strict', 'lax' or 'none'rb   )      z@Partitioned cookies are only supported in Python 3.14 and above.rd   rT   )headers
   set-cookier<   )httpcookiesSimpleCookier6   r	   r
   r=   sysversion_info
ValueErroroutputstriprJ   rH   r9   )r0   rW   rX   rY   r[   r]   r^   r_   ra   rb   rd   cookie
cookie_valr1   r1   r2   
set_cookieY   s6   


zResponse.set_cookiec              
   C  s   | j |dd|||||d d S )Nr   )rY   r[   r]   r^   r_   ra   rb   )rv   )r0   rW   r]   r^   r_   ra   rb   r1   r1   r2   delete_cookie   s   	
zResponse.delete_cookiesendr   c                   s   d fdd}|S )Nmessager   r)   r*   c                   s8   | d }|dv ri | dd| i}  | I d H  d S )Ntype>   http.response.bodyhttp.response.startz
websocket.r1   )ry   message_typerx   r1   r2   wrapped   s
   z5Response._wrap_websocket_denial_send.<locals>.wrapped)ry   r   r)   r*   r1   )r0   rx   r   r1   r~   r2   _wrap_websocket_denial_send   s   z$Response._wrap_websocket_denial_sendscoper   receiver   c                   sh   |d dkr|  |}|d| j| jdI d H  |d| jdI d H  | jd ur2|  I d H  d S d S )Nrz   	websocketr|   rz   statusr#   r{   )rz   r-   )r   r!   rJ   r-   r'   )r0   r   r   rx   r1   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   )	rT   NNrU   NFFrV   F)rW   rF   rX   rF   rY   rZ   r[   r\   r]   r&   r^   r&   r_   r`   ra   r`   rb   rc   rd   r`   r)   r*   )rU   NFFrV   )rW   rF   r]   rF   r^   r&   r_   r`   ra   r`   rb   rc   r)   r*   )rx   r   r)   r   r   r   r   r   rx   r   r)   r*   )__name__
__module____qualname__r%   r:   r3   r,   r.   propertyr#   rv   rw   r   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__r   r   c                   s"   	 | I d H }|d dkrd S q)NTrz   zhttp.disconnectr1   )r0   r   ry   r1   r1   r2   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rz   r-   	more_bodyr5   F)r!   rJ   r   r6   r7   r8   r9   r:   )r0   rx   chunkr1   r1   r2   stream_response   s   z!StreamingResponse.stream_responser   r   c              
     sT  |d dkr"|  |}| |I d H  | jd ur |  I d H  d S ttt|di ddd}|dkrMz
| |I d H  W nW tyL   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 sw   Y  W d    n1 sw   Y  | jd ur|  I d H  d S d S )Nrz   r   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*   )r   r   r'   tuplemapr"   getsplitOSErrorr   r   anyiocreate_task_group
start_soonr   r   )r0   r   r   rx   r   r   r1   r   r2   r     s2   

$(

zStreamingResponse.__call__r   )r    r   r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   )r   r   r)   r*   )rx   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   c                   @  s   e Zd ZdZ							dAdBddZdCddZdDd!d"ZdEd&d'ZdFd+d,ZdGd/d0Z	dHd2d3Z
edId5d6ZedJd8d9ZdKd?d@ZdS )LFileResponsei   r   N
attachmentr]   str | os.PathLike[str]r!   r"   r#   r$   r%   r&   r'   r(   filenamestat_resultos.stat_result | Nonecontent_disposition_typerF   r)   r*   c	                 C  s   || _ || _|| _|d u rt|p|d pd}|| _|| _| | | jdd | jd urPt	| j}	|	| jkr@| d|	 }
n	| d| j d}
| jd|
 || _
|d ur^| | d S d S )	Nr   r   zaccept-rangesr7   z; filename*=utf-8''z; filename=""zcontent-disposition)r]   r!   r   r   r%   r'   r.   r#   
setdefaultr   r   set_stat_headers)r0   r]   r!   r#   r%   r'   r   r   r   content_disposition_filenamecontent_dispositionr1   r1   r2   r3   ,  s&   



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 )
NTre   -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   K  s   
zFileResponse.set_stat_headersr   r   r   r   rx   r   c              
     s$  |d }|dko|d   dk}|dkod|di v }|dkr&| |}| jd u raztjtj| j	I d H }| 
| W n tyN   td| j	 d	w |j}t|s`td| j	 d
n| j}t|d}	|	d}
|	d}|
d u s|d ur| |s| |||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 )Nrz   rl   methodHEADhttp.response.pathsend
extensionsr   zFile at path z does not exist.z is not a file.)r   rangezif-rangei  )r!   i  zContent-Rangezbytes */)r!   r#      r   )upperr   r   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   r   r   rx   
scope_typesend_header_onlysend_pathsendr   moder#   
http_rangehttp_if_rangerangesexcresponsestartendr1   r1   r2   r   U  sP   





(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   rx   r   r   filer   r   r1   r1   r2   r     s    .zFileResponse._handle_simpler  r  	file_sizec           
   	     s6  t t| jd}d| d|d  d| |d< t|| |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 D}||I d H  d}|r|	t
| j|| I d H }	|t|	7 }t|	| jkou||k }|d|	|dI d H  |sWW d   I d H  d S 1 I d H sw   Y  d S )NrQ   zbytes r   r   rU   zcontent-ranger   r|      r   r{   r5   Fr   r  r  T)r   listrJ   rF   rR   r   r  r]   seekr  minr  rG   )
r0   rx   r  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 \}}tt| jd}d| |d< t||d< |dd|jdI d H  |rB|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 sr|d	dddI d H  qT|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-typerQ   zmultipart/byteranges; boundary=r   r|   r  r   r{   r5   Fr   r  r  Ts   
--r<   )r   generate_multipartr#   r   r  rJ   rF   rR   r   r  r]   r  r  r  r  rG   r9   )r0   rx   r   r
  r   boundaryrN   header_generatorr#   r	  r  r  r   r1   r1   r2   r     s8    .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| | }t|dkr5tdt fdd|D rDt td	d |D rQtd
t|dkrY|S |	  |d g}|dd  D ]\}}|d \}	}
||
kr|	t
|
|f|d< qh|||f qh|S )N=r   r7   zOnly support bytes ranger   z%Range header: range must be requestedc                 3  s.    | ]\}}d |  ko k n   V  qdS )r   Nr1   )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   rq   r   rs   r=   _parse_rangesrG   anyr   sortmaxrH   )clsr   r
  r   unitsrange_resultr  r  
last_startlast_endr1   r  r2   r     s4   
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   rs   r"   rH   rq   )	r  r!  r
  r   part	start_strend_strr  r  r1   r1   r2   r    s$   $zFileResponse._parse_ranges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}\r\n
        Content-Type: {content_type}\r\n
        Content-Range: bytes {start}-{end-1}/{max_size}\r\n
        \r\n
        ..........content...........\r\n
        --{boundary}\r\n
        Content-Type: {content_type}\r\n
        Content-Range: bytes {start}-{end-1}/{max_size}\r\n
        \r\n
        ..........content...........\r\n
        --{boundary}--
        ```
        1   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>r   c                   s.   d  d d|  d|d  d d dS )	Nr  z
Content-Type: z
Content-Range: bytes r   r   rU   z

r<   )r9   )r  r  )r  rO   r   r1   r2   <lambda>0  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   NNNNNr   )r]   r   r!   r"   r#   r$   r%   r&   r'   r(   r   r&   r   r   r   rF   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   rF   r)   r`   )r   rF   r
  r"   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   classmethodr   r  r  r1   r1   r1   r2   r   )  s*    



,


$&r   )C
__future__r   r   http.cookiesrl   r   r   r   ro   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   r   rF   r7   r8   ContentSyncContentStreamr   r   r   	Exceptionr   r   r   r1   r1   r1   r2   <module>   sJ      A