
    |Igq6                        U d dl 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
 d dlmZmZmZmZmZmZmZmZmZmZmZ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!m"Z" ddl#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) ddl*m+Z+ dZ,erddl-m.Z. eee/ged   f      Z0 e1ejd                  jg                  d            Z4ee1   e5d<    e       Z6ee   e5d<    e
dD  ci c]  } | e6jn                  |     c}       Z8dZ9 e
dddddd      Z:e6jn                  jw                          e:jy                         D ]  \  Z=Z>e6j                  e=e>         G d de+      Z@yc c} w )    N)suppress)	MimeTypes)S_ISREG)MappingProxyType)IOTYPE_CHECKINGAny	AwaitableCallableFinalIteratorListOptionalTupleUnioncast   )hdrs)AbstractStreamWriter)ETAG_ANYETagmust_be_empty_body)LooseHeadersPathLike)HTTPForbiddenHTTPNotFoundHTTPNotModifiedHTTPPartialContentHTTPPreconditionFailedHTTPRequestRangeNotSatisfiable)StreamResponse)FileResponse)BaseRequestAIOHTTP_NOSENDFILE
NOSENDFILECONTENT_TYPES).br.gzzapplication/octet-streamr(   r'   z.bz2z.Zz.xz)zapplication/gzipzapplication/x-brotlizapplication/x-bzip2zapplication/x-compresszapplication/x-xzc                       e Zd ZdZ	 	 	 	 ddedededee   dee   ddf fd	Z	d
e
e   dededefdZded
e
e   dededef
dZddd
e
e   dededef
 fdZededeedf   dedefd       Zdddededee   f fdZdddee   f fdZdedeej4                  ej8                  ee   f   fdZdddee   f fdZ xZS )r"   z,A response object can be used to send files.Npath
chunk_sizestatusreasonheadersreturnc                 l    t         |   |||       t        j                  |      | _        || _        y )N)r,   r-   r.   )super__init__pathlibPath_path_chunk_size)selfr*   r+   r,   r-   r.   	__class__s         U/var/www/html/answerous/venv/lib/python3.12/site-packages/aiohttp/web_fileresponse.pyr2   zFileResponse.__init__N   s1     	vwG\\$'
%    fobjoffsetc                 F    |j                  |       |j                  |      S N)seekread)r7   r;   r<   r+   s       r9   _seek_and_readzFileResponse._seek_and_read[   s    		&yy$$r:   writercountc                   K   | j                   }t        j                         }|j                  d | j                  |||       d {   }|rV|j                  |       d {    ||z
  }|dk  rn2|j                  d |j                  t        ||             d {   }|rV|j                          d {    |S 7 v7 ]7 %7 wNr   )	r6   asyncioget_event_looprun_in_executorrA   writer@   mindrain)r7   rB   r;   r<   rC   r+   loopchunks           r9   _sendfile_fallbackzFileResponse._sendfile_fallback_   s      %%
%%'**$%%tVZ
 
 ,,u%%%J&Ez..tTYYJPU@VWWE  lln
 & XsN   ACB<C B>!9CC C"C5C6C>C CCrequestr#   c                   K   t         |   |       d {   }|J t        s| j                  r| j	                  ||||       d {   S |j
                  }|j                  }|J 	 |j                  ||||       d {    t         | %          d {    |S 7 7 W7  # t        $ r  | j	                  ||||       d {  7  cY S w xY w7 8wr>   )
r1   preparer%   compressionrN   _loop	transportsendfileNotImplementedError	write_eof)	r7   rO   r;   r<   rC   rB   rL   rT   r8   s	           r9   	_sendfilezFileResponse._sendfilet   s      ww//!!!))00vuMMM}}%%	$$$	N--	4??? g!!!! 0 N @" 	N00vuMMMM	N 	"so   CB1CB 	 C*B$ B"B$ CCC C"B$ $ CCC
CCC
etag_valueetags.weakc                z     t        |      dk(  r|d   j                  t        k(  ryt         fd|D              S )Nr   r   Tc              3   Z   K   | ]"  }s|j                   r|j                  k(   $ y wr>   )is_weakvalue).0etagrY   r[   s     r9   	<genexpr>z+FileResponse._etag_match.<locals>.<genexpr>   s'      
)-$dllDJJ*$
s   ++)lenr_   r   any)rY   rZ   r[   s   ` `r9   _etag_matchzFileResponse._etag_match   s:    u:?uQx~~9 
16
 
 	
r:   last_modifiedc                    K   | j                  t        j                         d| _        || _        || _        t        |   |       d {   S 7 w)NF)
set_statusr   status_code_length_checkra   rf   r1   rQ   )r7   rO   rY   rf   r8   s       r9   _not_modifiedzFileResponse._not_modified   sI      	334"	* W_W----s   AA
AAc                    K   | j                  t        j                         d| _        t        |   |       d {   S 7 wrE   )rh   r   ri   content_lengthr1   rQ   )r7   rO   r8   s     r9   _precondition_failedz!FileResponse._precondition_failed   s9      	.::;W_W----s   9AAAaccept_encodingc                 r   | j                   }t        j                         D ]v  \  }}||vr|j                  |j                  |z         }t        t              5  |j                         }t        |j                        r|||fcddd       c S 	 ddd       x ||j                         dfS # 1 sw Y   xY w)a  Return the file path, stat result, and encoding.

        If an uncompressed file is returned, the encoding is set to
        :py:data:`None`.

        This method should be called from a thread executor
        since it calls os.stat which may block.
        N)r5   ENCODING_EXTENSIONSitemswith_suffixsuffixr   OSErrorlstatr   st_modestat)r7   ro   	file_pathfile_extensionfile_encodingcompressed_pathsts          r9   _get_file_path_stat_encodingz)FileResponse._get_file_path_stat_encoding   s     JJ	-@-F-F-H 		>)NMO3'33I4D4D~4UVO'" >$**,2::&*B=	> > '> >		> )..*D00> >s   *B--B6	c                   K   t        j                         }|j                  j                  t        j
                  d      j                         }	 |j                  d | j                  |       d {   \  }}}t        |j                         s6| j                  t"        j                         t        | 9  |       d {   S |j$                  dd|j&                  d}|j(                  }|j*                  }	|	-| j-                  ||	d      s| j/                  |       d {   S |j0                  }
|
8|	6|j(                  |
j3                         kD  r| j/                  |       d {   S |j4                  }|/| j-                  ||d      r| j7                  |||       d {   S |j8                  }|:|8|j(                  |j3                         k  r| j7                  |||       d {   S | j:                  }|j&                  }|}d }|j<                  }||j(                  |j3                         k  r	 |j>                  }|j@                  }|jB                  }|||dk  r|||z  }|dk  rd}||z
  }ntK        ||n||      |z
  }||k\  rVd| | j                  t        jF                  <   | j                  tH        j                         t        | 9  |       d {   S tL        j                  }| j                  |       t        jN                  | j                  vr/tP        jS                  | jT                        d   xs tV        | _,        |rO|| j                  t        jZ                  <   t        j
                  | j                  t        j\                  <   d| _/        || _0        |j(                  | _1        || _2        d	| j                  t        jf                  <   ti        tj        |      }|tL        j                  k(  r4d
jm                  |||z   dz
  |      | j                  t        jF                  <   |dk(  s to        |jp                  | jr                        rt        | 9  |       d {   S 	 |j                  d |jt                  d       d {   }|r|}nd}	 | jy                  ||||       d {   t        jz                  |j                  d |j|                               d {    S 7 # t        $ r: | j                  t        j                         t        | 9  |       d {  7  cY S w xY w7 7  7 7 7 ^# tD        $ rZ d| | j                  t        jF                  <   | j                  tH        j                         t        | 9  |       d {  7  cY S w xY w7 7 G7 $# tv        $ r: | j                  t"        j                         t        | 9  |       d {  7  cY S w xY w7 I7 # t        jz                  |j                  d |j|                               d {  7   w xY ww)N x-F)r[   Tzbytes */r   byteszbytes {}-{}/{}r   rb)?rF   get_running_loopr.   getr   ACCEPT_ENCODINGlowerrH   r~   ru   rh   r   ri   r1   rQ   r   rw   r   st_mtime_nsst_sizest_mtimeif_matchre   rn   if_unmodified_since	timestampif_none_matchrk   if_modified_since_statusif_range
http_rangestartstop
ValueErrorCONTENT_RANGEr    rJ   r   CONTENT_TYPEr&   
guess_typer5   FALLBACK_CONTENT_TYPEcontent_typeCONTENT_ENCODINGVARY_compressionra   rf   rm   ACCEPT_RANGESr   intformatr   methodr,   openPermissionErrorrX   shieldclose)r7   rO   rL   ro   ry   r}   r{   rY   rf   ifmatch
unmodsinceifnonematchmodsincer,   	file_sizerC   r   ifrangerngend
real_startr;   r<   r8   s                          r9   rQ   zFileResponse.prepare   s    '') "//--d.B.BBGMMO	2151E1Ed772 ,(Ir= rzz"OOM556111q)2::a.9
 ""t'7'7e (8 (
 227;;;00
"j2244227;;; ++"t'7'7$ (8 (
 ++GZOOO,, #x1133++GZOOOJJ	""?bkkW->->-@@6((		hh"  CO19Y&Eqy !"%-E 3?C	9MPUU  I% :B)7MDLL!3!34OO$B$N$NO!&!999+77 '
 DLL0((4Q7P;P  2?DLL../&*&:&:DLL# !&D	[[#+2T''(#u%
'333/?/F/FJ.2I0DLL++,
 A:+GNNDKKH111	2--dINNDIID
 FF	IvuEE..!5!5dDJJ!GHHHQ,  	2 OOL4451111		2 2 < < P P*  6 6>i[3IT//0 > J JK"W_W55556` :L 2 J 	2OOM5561111	2 FH'..!5!5dDJJ!GHHHs|  AY S; 1S82S; :AY UA#Y$U%AY*U+<Y'U
(AY/U0AY<$U  BY&V6'FY2V93Y8 V? V<V? Y%X <X=X  2Y2X3Y8S; ;:T>5T86T>;Y=T>>YYY
YYAV3*V-+V30Y2V33Y9Y<V? ?:X9W<:X?YXYX Y3Y>Y?YY)i      NN) __name__
__module____qualname____doc__r   r   r   strr   r2   r   r	   r   rA   r   rN   rX   staticmethodr   r   boolre   floatrk   rn   r3   r4   osstat_resultr~   rQ   __classcell__)r8   s   @r9   r"   r"   K   s   6
 % $*.&& & 	&
 & ,'& 
&%2c7 %C %S %U %*24S'CFOR	*$,.sG=@IL	* 
 
E$),< 
t 
PT 
 
	.$	.25	.FK	.	&	'	..$.	&	'.1"1	w||R^^Xc]:	;14nI] nIx@T7U nI nIr:   r"   )ArF   r   r3   
contextlibr   	mimetypesr   rx   r   typesr   typingr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   abcr   helpersr   r   r   typedefsr   r   web_exceptionsr   r   r   r   r   r    web_responser!   __all__web_requestr#   r   _T_OnChunkSentr   environr   r%   __annotations__r&   encodings_maprq   r   ADDITIONAL_CONTENT_TYPESclearrr   r   	extensionadd_typer"   )exts   0r9   <module>r      sT    	     "     % 7 7 ,  )
( (E7IdO#;<= rzz~~.BCD
E$K D"++uY - '6DEsS-
%
%c
**E  3  ,! %%"&!     ! ! #7==? 4L)<34`I> `I/ Fs   E
