
    ַi                     J    d dl mZ  G d de          Z G d de          ZdS )    )FileResponsec                   B    e Zd ZdZdZd ed          dfdZd Zd ZdS )	RangedFileReaderz
    Wraps a file like object with an iterator that runs over part (or all) of
    the file defined by start and stop. Blocks of block_size will be returned
    from the starting position, up to, but not including the stop point.
    i    r   infNc                     || _         t          | j                                                   | _        |pt          j        | _        || _        || _        dS )a5  
        Args:
            file_like (File): A file-like object.
            start (int): Where to start reading the file.
            stop (Optional[int]:float): Where to end reading the file.
                Defaults to infinity.
            block_size (Optional[int]): The block_size to read with.
        N)flenreadsizer   
block_sizestartstop)self	file_liker   r   r   s        P/srv/django_bis/venv311/lib/python3.11/site-packages/ranged_response/__init__.py__init__zRangedFileReader.__init__   sF     &&	$C(8(C
			    c              #     K   | j                             | j                   | j        }|| j        k     rT| j                             t          | j        | j        |z
                      }|sdS |V  || j        z  }|| j        k     RdS dS )z+
        Reads the data in chunks.
        N)r   seekr   r   r
   minr   )r   positiondatas      r   __iter__zRangedFileReader.__iter__   s       	DJ:""6;;s4?DI4HIIJJD JJJ'H """"""r   c                 .   |rd|vrdS g }|                     dd          \  }}|                                                                }|dk    rdS |                     d          D ]}|                                }d|vr dS |                    d          r|t	          |          z   }|dk     rd}|}nG|                     dd          \  }}t	          |          }|rt	          |          dz   n|}||k    r dS |                    ||f           |S )a  
        Parses a range header into a list of two-tuples (start, stop) where
        `start` is the starting byte of the range (inclusive) and
        `stop` is the ending byte position of the range (exclusive).

        Args:
            header (str): The HTTP_RANGE request header.
            resource_size (int): The size of the file in bytes.

        Returns:
            None if the value of the header is not syntatically valid.
        =N   bytes,-r   )splitstriplower
startswithintappend)	r   headerresource_sizerangesunitsrange_valr   r   s	            r   parse_range_headerz#RangedFileReader.parse_range_header)   s?     	F**4S!,,v##%%G4<<$$ 	) 	)C))++C#~~tt~~c""   &C0199E$ "iiQ//tE

 )-?s4yy1}}-D==44MM5$-((((r   )	__name__
__module____qualname____doc__r   floatr   r   r,    r   r   r   r      sf         
 J()e    ( ( (0 0 0 0 0r   r   c                   (     e Zd ZdZ fdZd Z xZS )RangedFileResponsez
    This is a modified FileResponse that returns `Content-Range` headers with
    the response, so browsers that request the file, can stream the response
    properly.
    c                     t          |          | _         t          t          |           j        | j        g|R i | d|j        v r"|                     |j        d                    dS dS )a  
        RangedFileResponse constructor also requires a request, which
        checks whether range headers should be added to the response.

        Args:
            request(WGSIRequest): The Django request object.
            file (File): A file-like object.
        
HTTP_RANGEN)r   ranged_filesuperr4   r   METAadd_range_headers)r   requestfileargskwargs	__class__s        r   r   zRangedFileResponse.__init__c   s     ,D110 $''0	
#	
 	
 	
'-	
 	
 	
 7<''""7<#=>>>>> ('r   c                 f   d| d<   | j         j        }	 | j                             ||          }n# t          $ r d}Y nw xY w|lt	          |          dk    r[|d         \  }}||k    r	d| _        dS ||k    r|}|| j         _        || j         _        d||dz
  |fz  | d<   ||z
  | d	<   d
| _        dS dS dS )a  
        Adds several headers that are necessary for a streaming file
        response, in order for Safari to play audio files. Also
        sets the HTTP status_code to 206 (partial content).

        Args:
            range_header (str): Browser HTTP_RANGE request header.
        r   zAccept-RangesNr   r   i  zbytes %d-%d/%dzContent-RangezContent-Length   )r7   r   r,   
ValueErrorr	   status_coder   r   )r   range_headerr   r(   r   r   s         r   r:   z$RangedFileResponse.add_range_headerst   s     !(_$	%88tLLFF 	 	 	FFF	 #f++"2"2 )KE4}}#& t||%*D"$(D!$4tax7N$ND!%)E\D!""D "2"2s   / >>)r-   r.   r/   r0   r   r:   __classcell__)r?   s   @r   r4   r4   \   sQ         ? ? ? ? ?"# # # # # # #r   r4   N)django.http.responser   objectr   r4   r2   r   r   <module>rH      s~    - - - - - -U U U U Uv U U Up5# 5# 5# 5# 5# 5# 5# 5# 5# 5#r   