
    ?wg&                    \   d dl m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 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  G d
 d      Z ee
j(                  dgd      ZdZ G d de      Z G d d      Z G d d      Z G d de      Z G d de      Z G d de      Z G d d      Zy)    )annotationsN)
formatdate)	parsedate)
HTTPStatus)BufferedIOBase)mktime)quote)Headersc                      e Zd ZdZd Zy)Responsestatusheadersfilec                .    || _         || _        || _        y Nr   )selfr   r   r   s       L/var/www/horilla/myenv/lib/python3.12/site-packages/whitenoise/responders.py__init__zResponse.__init__   s    	    N)__name__
__module____qualname__	__slots__r    r   r   r   r      s    -Ir   r   )Allowz	GET, HEADr   )zCache-ControlzContent-LocationDateETagExpiresVaryc                  0     e Zd ZdZd ZddZ fdZ xZS )
SlicedFilez
    A file like wrapper to handle seeking to the start byte of a range request
    and to return no further output once the end byte of a range request has
    been reached.
    c                N    |j                  |       || _        ||z
  dz   | _        y N   )seekfileobj	remaining)r   r'   startends       r   r   zSlicedFile.__init__2   s$    Uuqr   c                    | j                   dk  ry|dk  r| j                   }nt        || j                         }| j                  j                  |      }| xj                   t	        |      z  c_         |S )Nr   r   )r(   minr'   readlen)r   sizedatas      r   r-   zSlicedFile.read7   s\    >>Q!8>>DtT^^,D||  &#d)#r   c                V    t         |           | j                  j                          y r   )supercloser'   )r   	__class__s    r   r3   zSlicedFile.closeB   s    r   ))r   r   r   __doc__r   r-   r3   __classcell__)r4   s   @r   r"   r"   +   s    )
	 r   r"   c                      e Zd ZddZd Zd Zd Zed        Zed        Z	ed        Z
d	 Zed
        Zed        Zd Zd Zy)
StaticFileNc                    | j                  |||      }| j                  ||      }t        |d         | _        |d   | _        | j                  |      | _        | j                  ||      | _        y )NLast-Modifiedr   )	get_file_statsget_headersr   last_modifiedetagget_not_modified_responsenot_modified_responseget_alternativesalternatives)r   pathr   	encodings
stat_cachefiless         r   r   zStaticFile.__init__H   sm    ##D)Z@""7E2&w'?@FO	%)%C%CG%L" 11'5Ar   c                B   |dvrt         S | j                  |      r| j                  S | j                  |      \  }}|dk7  rt	        |d      }nd }|j                  d      }|r	 | j                  |||      S t        t        j                  ||      S # t        $ r Y &w xY w)N)GETHEADrJ   rb
HTTP_RANGE)NOT_ALLOWED_RESPONSEis_not_modifiedrA   get_path_and_headersopengetget_range_response
ValueErrorr   r   OK)r   methodrequest_headersrD   r   file_handlerange_headers          r   get_responsezStaticFile.get_responseP   s    (''0---11/BgVtT*KK&**<8..|WkRR 
w<<   	s   $B 	BBc           	        g }|D ]*  }|d   dk(  rt        |d         }|j                  |       , | j                  |      \  }}||k\  r| j                  ||      S |t	        |||      }|j                  dd| d| d| f       |j                  dt        ||z
  dz         f       t        t        j                  ||      S )Nr   Content-Lengthr%   Content-Rangezbytes -/)	intappendget_byte_range"get_range_not_satisfiable_responser"   strr   r   PARTIAL_CONTENT)	r   rX   base_headersrW   r   itemr/   r)   r*   s	            r   rR   zStaticFile.get_range_responsee   s      	%DAw**47|t$		%
 ((t<
sC<::;MM"$[%=K6%#av)FGH(#cEkAo*>?@
22G[IIr   c                    | j                  |      \  }}|dk  rt        ||z   d      }|	|dz
  }||fS t        ||dz
        }||fS )Nr   r%   )parse_byte_rangemaxr,   )r   rX   r/   r)   r*   s        r   ra   zStaticFile.get_byte_rangeu   sc    **<8
s19a(E;(C cz c4!8$Cczr   c                (   | j                         j                  d      \  }}}|dk7  r
t               |j                         j                  d      \  }}}|s
t               |st        |       }d }||fS t        |      }|rt        |      nd }||fS )N=bytesr]   )strip	partitionrS   r_   )	rX   units_
range_spec	start_strsepend_strr)   r*   s	            r   rh   zStaticFile.parse_byte_range   s    +113==cBq*G, #-"2"2"4">">s"C	3,\MEC cz 	NE")#g,tCczr   c                h    | | j                          t        t        j                  dd| fgd       S )Nr\   zbytes */)r3   r   r   REQUESTED_RANGE_NOT_SATISFIABLE)rW   r/   s     r   rb   z-StaticFile.get_range_not_satisfiable_response   s?    "66$012
 	
r   c                    d t        | |      i}|r(|j                         D ]  \  }}	 t        ||      ||<    |S # t        $ r Y %w xY wr   )	FileEntryitemsMissingFileError)rD   rE   rF   rG   encodingalt_paths         r   r<   zStaticFile.get_file_stats   sc     yz23&/oo&7 "(&/*&EE(O
  ( s   ;	AAc                   t        |      }|d    }t        |      dkD  rd|d<   d|vr|j                  }|rt        |d      |d<   d|vr<t	        |d         }|r,t        t        |            }d|d	d
|j                  d	d|d<   |S )Nr%   zAccept-Encodingr    r;   T)usegmtr   "xr]   )r
   r.   mtimer   r   r_   r   r/   )r   headers_listrG   r   	main_filer   r>   	timestamps           r   r=   zStaticFile.get_headers   s    ,'$K	u:>/GFO')OOE +5eD+I( %go&>?M} 56	$%i]!INN13EQ"Gr   c                    g }t         D ]  }|| v s|j                  || |   f        t        t        j                  |d       S )Nr   )NOT_MODIFIED_HEADERSr`   r   r   NOT_MODIFIED)r   not_modified_headerskeys      r   r@   z$StaticFile.get_not_modified_response   sT    !' 	ACg~$++S'#,,?@	A **4Ht
 	
r   c                z   g }t        |j                         d       }|D ]  \  }}t        | j                               }t        |j                        |d<   |r||d<   t        j                  d|z        }nt        j                  d      }|j                  ||j                  |j                         f        |S )Nc                     | d   j                   S r$   )r/   )is    r   <lambda>z-StaticFile.get_alternatives.<locals>.<lambda>   s    AaDII r   )r   r[   zContent-Encodingz\b%s\b )	sortedry   r
   rc   r/   recompiler`   rD   )re   rG   rC   files_by_sizer{   
file_entryr   encoding_res           r   rB   zStaticFile.get_alternatives   s     u{{}2EF$1 	Q Hjl0023G(+JOO(<G$%.6*+ jjX)=> jjnjoow}} OP	Q r   c                    |j                  d      }||| j                  k(  S | j                  y	 |d   }t	        |      }||| j                  k\  S y# t        $ r Y yw xY w)NHTTP_IF_NONE_MATCHFHTTP_IF_MODIFIED_SINCE)rQ   r?   r>   KeyErrorr   )r   rV   previous_etaglast_requestedlast_requested_tss        r   rN   zStaticFile.is_not_modified   s    '++,@A$ DII--%	,-EFN &n5($(:(:::  		s   A 	AAc                    |j                  dd      }|dk(  rd}| j                  D ]  \  }}}|j                  |      s||fc S  y )NHTTP_ACCEPT_ENCODINGr   *)rQ   rC   search)r   rV   accept_encodingr   rD   r   s         r   rO   zStaticFile.get_path_and_headers   sV    )--.DbIc! O*.*;*; 	%&Kw!!/2W}$	%r   )NN)r   r   r   r   rY   rR   ra   staticmethodrh   rb   r<   r=   r@   rB   rN   rO   r   r   r   r9   r9   G   s    B=*J   " 
 
 	 	$ 
 
  %r   r9   c                      e Zd ZddZd Zy)RedirectNc                    |rt        |j                               ng }|j                  dt        |j	                  d            f       t        t        j                  |d       | _        y )NLocationutf8)	listry   r`   r	   encoder   r   FOUNDresponse)r   locationr   s      r   r   zRedirect.__init__   sK    +2$w}}'
E(//&*A$BCD !1!17DAr   c                    | j                   S r   )r   )r   rU   rV   s      r   rY   zRedirect.get_response   s    }}r   r   )r   r   r   r   rY   r   r   r   r   r      s    B
r   r   c                      e Zd Zy)NotARegularFileErrorNr   r   r   r   r   r   r   r          r   r   c                      e Zd Zy)rz   Nr   r   r   r   rz   rz      r   r   rz   c                      e Zd Zy)IsDirectoryErrorNr   r   r   r   r   r      r   r   r   c                  (    e Zd ZdZddZed        Zy)rx   )rD   r/   r   Nc                    || _         |t        j                  n|j                  }| j	                  ||      }|j
                  | _        |j                  | _        y r   )	rD   osstat__getitem__stat_regular_filest_sizer/   st_mtimer   )r   rD   rF   stat_functionr   s        r   r   zFileEntry.__init__  sG    	#-#5:;Q;Q%%dM:LL	]]
r   c                   	  ||       }t        j                  |j                        s;t        j                  |j                        rt        d|        t        d|        |S # t         $ r t        |       t        $ r=}|j                  t        j                  t        j
                  fv rt        |        d}~ww xY w)zj
        Wrap `stat_function` to raise appropriate errors if `path` is not a
        regular file
        NzPath is a directory: zNot a regular file: )r   rz   OSErrorerrnoENOENTENAMETOOLONGr   S_ISREGst_modeS_ISDIRr   r   )rD   r   stat_resultes       r   r   zFileEntry.stat_regular_file  s    	'-K ||K//0||K//0&)>tf'EFF*-A$+HII  	)"4(( 	ww5<<););<<&t,,		s   A& &B?8B::B?r   )r   r   r   r   r   r   r   r   r   r   rx   rx     s     )I#  r   rx   )
__future__r   r   r   r   r   email.utilsr   r   httpr   ior   timer   urllib.parser	   wsgiref.headersr
   r   METHOD_NOT_ALLOWEDrM   r   r"   r9   r   	Exceptionr   rz   r   rx   r   r   r   <module>r      s    "  	 	  " !     #   ((#$	   8b% b%J 	9 		+ 		' 	 r   