
    +Jf&                       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dS )    )annotationsN)
formatdate)	parsedate)
HTTPStatus)BufferedIOBase)mktime)quote)Headersc                      e Zd ZdZd ZdS )Responsestatusheadersfilec                0    || _         || _        || _        d S Nr   )selfr   r   r   s       X/home/alex/cs2snipeproduction/venv/lib/python3.11/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d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                X    |                     |           || _        ||z
  dz   | _        d S N   )seekfileobj	remaining)r   r'   startends       r   r   zSlicedFile.__init__2   s.    Uuqr   c                    | j         dk    rdS |dk     r| j         }nt          || j                   }| j                            |          }| xj         t	          |          z  c_         |S )Nr   r   )r(   minr'   readlen)r   sizedatas      r   r.   zSlicedFile.read7   sg    >Q3!88>DDtT^,,D|  &&#d))#r   c                8    | j                                          d S r   )r'   close)r   s    r   r3   zSlicedFile.closeB   s    r   N)r+   )r   r   r   __doc__r   r.   r3   r   r   r   r"   r"   +   sP         ) ) )
	 	 	 	    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dS )
StaticFileNc                   |                      |||          }|                     ||          }t          |d                   | _        |d         | _        |                     |          | _        |                     ||          | _        d S )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   s    ##D)Z@@""7E22&w'?@@FO	%)%C%CG%L%L" 11'5AAr   c                f   |dvrt           S |                     |          r| j        S |                     |          \  }}|dk    rt	          |d          }nd }|                    d          }|r(	 |                     |||          S # t          $ r Y nw xY wt          t          j
        ||          S )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0 	.--11/BBgVtT**KKK&**<88 	..|WkRRR    	
 
w<<<s   1B 
BBc           	        g }|D ]9}|d         dk    rt          |d                   }$|                    |           :|                     ||          \  }}||k    r|                     ||          S |t	          |||          }|                    dd| d| d| f           |                    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   itemr0   r)   r*   s	            r   rO   zStaticFile.get_range_responsed   s     	% 	%DAw***47||t$$$$((t<<
sC<<::;MMM"$[%==K)F%)F)F#)F)F)F)FGHHH(#cEkAo*>*>?@@@
2G[IIIr   c                    |                      |          \  }}|dk     rt          ||z   d          }||dz
  }nt          ||dz
            }||fS )Nr   r%   )parse_byte_rangemaxr-   )r   rU   r0   r)   r*   s        r   r^   zStaticFile.get_byte_ranget   sb    **<88
s199a((E;(CCc4!8$$Cczr   c                l   |                                                      d          \  }}}|dk    rt                      |                                                     d          \  }}}|st                      |st          |           }d }n"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3==cBBq*G,, #-"2"2"4"4">">s"C"C	3 	,, 	4\\MECC	NNE")3#g,,,tCczr   c                p    | |                                   t          t          j        dd| fgd           S )NrY   zbytes */)r3   r   r   REQUESTED_RANGE_NOT_SATISFIABLE)rT   r0   s     r   r_   z-StaticFile.get_range_not_satisfiable_response   sI    "60$0012
 
 	
r   c                    d t          | |          i}|r>|                                D ])\  }}	 t          ||          ||<   # t          $ r Y &w xY w|S r   )	FileEntryitemsMissingFileError)rA   rB   rC   rD   encodingalt_paths         r   r9   zStaticFile.get_file_stats   s}     yz223 	&/oo&7&7  "(&/*&E&EE(OO'   Hs   A
AAc                :   t          |          }|d          }t          |          dk    rd|d<   d|vr|j        }|rt          |d          |d<   d|vrFt	          |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   r0   )r   headers_listrD   r   	main_filer~   r;   	timestamps           r   r:   zStaticFile.get_headers   s    ,''$K	u::>>/GFO'))OE  J+5eD+I+I+I(  %go&>??M H} 5 566	"Gi"G"G"GIN"G"G"G"Gr   c                    g }t           D ]#}|| v r|                    || |         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   sb    !' 	A 	ACg~~$++S'#,,?@@@*4Ht
 
 
 	
r   c                   g }t          |                                d           }|D ]\  }}t          |                                           }t          |j                  |d<   |r||d<   t          j        d|z            }nt          j        d          }|                    ||j        |                                f           |S )Nc                    | d         j         S r$   )r0   )is    r   <lambda>z-StaticFile.get_alternatives.<locals>.<lambda>   s    AaDI r   )r   rX   zContent-Encodingz\b%s\b )	sortedrv   r
   r`   r0   recompiler]   rA   )rb   rD   r@   files_by_sizerx   
file_entryr   encoding_res           r   r?   zStaticFile.get_alternatives   s     u{{}}2E2EFFF$1 	Q 	Q Hjl002233G(+JO(<(<G$% -.6*+ jX)=>> jnnjow}} OPPPPr   c                    |                     d          }||| j        k    S | j        dS 	 |d         }n# t          $ r Y dS w xY wt	          |          }||| j        k    S dS )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A$ DI--%5	,-EFNN 	 	 	55	%n55($(:::us   6 
AAc                    |                     dd          }|dk    rd}| j        D ]!\  }}}|                    |          r||fc S "d S )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Ic!! O*.*; 	% 	%&Kw!!/2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 B B B= = =*J J J      \" 
 
 \
 	 	 \	  $ 
 
 \
   \  % % % % %r   r6   c                      e Zd ZddZd ZdS )RedirectNc                    |r!t          |                                          ng }|                    dt          |                    d                    f           t          t          j        |d           | _        d S )NLocationutf8)	listrv   r]   r	   encoder   r   FOUNDresponse)r   locationr   s      r   r   zRedirect.__init__   sf    +2:$w}}'''
E(//&*A*A$B$BCDDD !17DA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 B B B
    r   r   c                      e Zd ZdS )NotARegularFileErrorNr   r   r   r   r   r   r   r              Dr   r   c                      e Zd ZdS )rw   Nr   r   r   r   rw   rw      r   r   rw   c                      e Zd ZdS )IsDirectoryErrorNr   r   r   r   r   r      r   r   r   c                  0    e Zd ZdZddZed             ZdS )ru   )rA   r0   r~   Nc                    || _         |t          j        n|j        }|                     ||          }|j        | _        |j        | _        d S r   )	rA   osstat__getitem__stat_regular_filest_sizer0   st_mtimer~   )r   rA   rC   stat_functionr   s        r   r   zFileEntry.__init__  sG    	#-#5:;Q%%dM::L	]


r   c                ~   	  ||           }nY# t           $ r t          |           t          $ r4}|j        t          j        t          j        fv rt          |            d}~ww xY wt          j        |j                  s=t          j	        |j                  rt          d|            t          d|            |S )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    	'---KK 	) 	) 	)"4((( 	 	 	w5<);<<<&t,,,		
 |K/00 	J|K/00 J&'Et'E'EFFF*+H$+H+HIIIs    "A$/AA$r   )r   r   r   r   r   r   r   r   r   r   ru   ru     sH        )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      sF   " " " " " "  				 				  " " " " " " ! ! ! ! ! !                         # # # # # #         x(#$	           6b% b% b% b% b% b% b% b%J       	 	 	 	 	9 	 	 		 	 	 	 	+ 	 	 		 	 	 	 	' 	 	 	         r   