o
    q>e%                     @  sN   d dl mZ G dd dZG dd dZdd ZG dd	 d	Zd
dlmZ dS )    )annotationsc                   @  s2   e Zd ZdZdddZdd Zdd Zd	d
 ZdS )IfRangezVery simple object that represents the `If-Range` header in parsed
    form.  It will either have neither a etag or date or one of either but
    never both.

    .. versionadded:: 0.7
    Nc                 C  s   || _ || _d S N)etagdate)selfr   r    r   ^/var/www/bmteknikk.ddns.net/venv/lib/python3.10/site-packages/werkzeug/datastructures/range.py__init__   s   
zIfRange.__init__c                 C  s0   | j durt| j S | jdurt| jS dS )-Converts the object back into an HTTP header.N )r   http	http_dater   
quote_etagr   r   r   r	   	to_header   s
   

zIfRange.to_headerc                 C     |   S r   r   r   r   r   r	   __str__      zIfRange.__str__c                 C     dt | j dt| dS N< >type__name__strr   r   r   r	   __repr__      zIfRange.__repr__NN)r   
__module____qualname____doc__r
   r   r   r   r   r   r   r	   r      s    
r   c                   @  sH   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dS )RangeaX  Represents a ``Range`` header. All methods only support only
    bytes as the unit. Stores a list of ranges if given, but the methods
    only work if only one range is provided.

    :raise ValueError: If the ranges provided are invalid.

    .. versionchanged:: 0.15
        The ranges passed in are validated.

    .. versionadded:: 0.7
    c                 C  sP   || _ || _|D ]\}}|d u s|d ur%|dk s||kr%t||f dqd S )Nr   z is not a valid range.)unitsranges
ValueError)r   r&   r'   startendr   r   r	   r
   /   s    zRange.__init__c                 C  sn   | j dks|du st| jdkrdS | jd \}}|du r'|}|dk r'||7 }t|||r5|t||fS dS )zIf the range is for bytes, the length is not None and there is
        exactly one range and it is satisfiable it returns a ``(start, stop)``
        tuple, otherwise `None`.
        bytesN   r   )r&   lenr'   r   is_byte_range_validmin)r   lengthr)   r*   r   r   r	   range_for_length:   s    zRange.range_for_lengthc                 C  s.   |  |}|durt| j|d |d |S dS )zCreates a :class:`~werkzeug.datastructures.ContentRange` object
        from the current range and given content length.
        Nr   r,   )r1   ContentRanger&   )r   r0   rngr   r   r	   make_content_rangeJ   s   
zRange.make_content_rangec                 C  sl   g }| j D ]%\}}|du r||dkr| dnt| q|| d|d   q| j dd| S )r   Nr   -r,   =,)r'   appendr   r&   join)r   r'   beginr*   r   r   r	   r   S   s   "zRange.to_headerc                 C  s>   |  |}|dur| j d|d  d|d d  d| S dS )z\Converts the object into `Content-Range` HTTP header,
        based on given length
        Nr   r   r5   r,   /)r1   r&   )r   r0   ranger   r   r	   to_content_range_header]   s   
(zRange.to_content_range_headerc                 C  r   r   r   r   r   r   r	   r   f   r   zRange.__str__c                 C  r   r   r   r   r   r   r	   r   i   r    zRange.__repr__N)r   r"   r#   r$   r
   r1   r4   r   r=   r   r   r   r   r   r	   r%   "   s    	
	r%   c                   s"    fdd} fdd}t ||S )Nc                   s
   t |  S r   )getattrr   namer   r	   fgetn      
z _callback_property.<locals>.fgetc                   s(   t |  | | jd ur| |  d S d S r   )setattr	on_update)r   valuer?   r   r	   fsetq   s   
z _callback_property.<locals>.fset)property)r@   rA   rF   r   r?   r	   _callback_propertym   s   
rH   c                   @  sl   e Zd ZdZdddZedZedZedZedZ	dd
dZ
dd Zdd Zdd Zdd Zdd ZdS )r2   zDRepresents the content range header.

    .. versionadded:: 0.7
    Nc                 C  s0   t |||sJ d|| _| |||| d S )NBad range provided)r   r.   rD   set)r   r&   r)   stopr0   rD   r   r   r	   r
      s   zContentRange.__init___units_start_stop_lengthr+   c                 C  sJ   t |||sJ d|| _|| _|| _|| _| jdur#| |  dS dS )z#Simple method to update the ranges.rI   N)r   r.   rL   rM   rN   rO   rD   )r   r)   rK   r0   r&   r   r   r	   rJ      s   
zContentRange.setc                 C  s   | j dddd dS )zcSets the units to `None` which indicates that the header should
        no longer be used.
        Nr&   )rJ   r   r   r   r	   unset   s   zContentRange.unsetc                 C  sb   | j d u rdS | jd u rd}n| j}| jd u r| j  d| S | j  d| j d| jd  d| S )Nr   *z */r   r5   r,   r;   )r&   r0   r)   rK   )r   r0   r   r   r	   r      s   


$zContentRange.to_headerc                 C  s
   | j d uS r   rP   r   r   r   r	   __bool__   rB   zContentRange.__bool__c                 C  r   r   r   r   r   r   r	   r      r   zContentRange.__str__c                 C  r   r   r   r   r   r   r	   r      r    zContentRange.__repr__r!   )Nr+   )r   r"   r#   r$   r
   rH   r&   r)   rK   r0   rJ   rQ   r   rS   r   r   r   r   r   r	   r2   y   s    


r2      )r   N)
__future__r   r   r%   rH   r2   r   r   r   r   r   r	   <module>   s    K;