
    f&                    \   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       P/var/www/cs2snipe.com/venv/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                  $    e Zd ZdZd ZddZd Zy)
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                8    | j                   j                          y r   )r'   close)r   s    r   r2   zSlicedFile.closeB   s    r   N))r   r   r   __doc__r   r-   r2   r   r   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__G   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HEADrG   rb
HTTP_RANGE)NOT_ALLOWED_RESPONSEis_not_modifiedr>   get_path_and_headersopengetget_range_response
ValueErrorr   r   OK)r   methodrequest_headersrA   r   file_handlerange_headers          r   get_responsezStaticFile.get_responseO   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   rU   base_headersrT   r   itemr/   r)   r*   s	            r   rO   zStaticFile.get_range_responsed   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   rU   r/   r)   r*   s        r   r^   zStaticFile.get_byte_ranget   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=bytesrZ   )strip	partitionrP   r\   )	rU   units_
range_spec	start_strsepend_strr)   r*   s	            r   re   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 )NrY   zbytes */)r2   r   r   REQUESTED_RANGE_NOT_SATISFIABLE)rT   r/   s     r   r_   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)rA   rB   rC   rD   encodingalt_paths         r   r9   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    r8   T)usegmtr   "xrZ   )r
   r.   mtimer   r   r\   r   r/   )r   headers_listrD   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   rX   zContent-Encodingz\b%s\b )	sortedrv   r
   r`   r/   recompiler]   rA   )rb   rD   r@   files_by_sizerx   
file_entryr   encoding_res           r   r?   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)rN   r<   r;   KeyErrorr   )r   rS   previous_etaglast_requestedlast_requested_tss        r   rK   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   *)rN   r@   search)r   rS   accept_encodingr   rA   r   s         r   rL   zStaticFile.get_path_and_headers   sV    )--.DbIc! O*.*;*; 	%&Kw!!/2W}$	%r   )NN)r   r   r   r   rV   rO   r^   staticmethodre   r_   r9   r:   r=   r?   rK   rL   r   r   r   r6   r6   F   s    B=*J   " 
 
 	 	$ 
 
  %r   r6   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)	listrv   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   rR   rS   s      r   rV   zRedirect.get_response   s    }}r   r   )r   r   r   r   rV   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)rw   Nr   r   r   r   rw   rw      r   r   rw   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)ru   )rA   r/   r~   Nc                    || _         |t        j                  n|j                  }| j	                  ||      }|j
                  | _        |j                  | _        y r   )	rA   osstat__getitem__stat_regular_filest_sizer/   st_mtimer~   )r   rA   rC   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   rw   OSErrorerrnoENOENTENAMETOOLONGr   S_ISREGst_modeS_ISDIRr   r   )rA   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   ru   ru     s     )I#  r   ru   )
__future__r   r   r   r   r   email.utilsr   r   httpr   ior   timer   urllib.parser	   wsgiref.headersr
   r   METHOD_NOT_ALLOWEDrJ   r   r"   r6   r   	Exceptionr   rw   r   ru   r   r   r   <module>r      s    "  	 	  " !     #   ((#$	   6b% b%J 	9 		+ 		' 	 r   