a
    !f%                     @  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/html/python-backend/venv/lib/python3.9/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   httpZ	http_dater   Z
quote_etagr   r   r   r	   	to_header   s
    

zIfRange.to_headerc                 C  s   |   S r   r   r   r   r   r	   __str__   s    zIfRange.__str__c                 C  s   dt | j dt| dS N< >type__name__strr   r   r   r	   __repr__   s    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 s8|d ur|dk s8||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 rN|}|dk rN||7 }t|||rj|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%   )r*   ContentRanger   )r   r)   rngr   r   r	   make_content_rangeJ   s    
zRange.make_content_rangec                 C  sl   g }| j D ]J\}}|du r<||dkr0| 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   r.   r%   /)r*   r   )r   r)   ranger   r   r	   to_content_range_header]   s    
(zRange.to_content_range_headerc                 C  s   |   S r   r   r   r   r   r	   r   f   s    zRange.__str__c                 C  s   dt | j dt| dS r   r   r   r   r   r	   r   i   s    zRange.__repr__N)r   r   r   r   r
   r*   r-   r   r6   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   s    z _callback_property.<locals>.fgetc                   s$   t |  | | jd ur | |  d S r   )setattr	on_update)r   valuer8   r   r	   fsetq   s    
z _callback_property.<locals>.fset)property)r9   r:   r>   r   r8   r	   _callback_propertym   s    r@   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 )r+   zDRepresents the content range header.

    .. versionadded:: 0.7
    Nc                 C  s0   t |||sJ d|| _| |||| d S )NBad range provided)r   r'   r<   set)r   r   r"   stopr)   r<   r   r   r	   r
      s    zContentRange.__init___units_start_stop_lengthr$   c                 C  sF   t |||sJ d|| _|| _|| _|| _| jdurB| |  dS )z#Simple method to update the ranges.rA   N)r   r'   rD   rE   rF   rG   r<   )r   r"   rC   r)   r   r   r   r	   rB      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   )rB   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   r.   r%   r4   )r   r)   r"   rC   )r   r)   r   r   r	   r      s    


zContentRange.to_headerc                 C  s
   | j d uS r   rH   r   r   r   r	   __bool__   s    zContentRange.__bool__c                 C  s   |   S r   r   r   r   r   r	   r      s    zContentRange.__str__c                 C  s   dt | j dt| dS r   r   r   r   r   r	   r      s    zContentRange.__repr__)NN)Nr$   )r   r   r   r   r
   r@   r   r"   rC   r)   rB   rI   r   rK   r   r   r   r   r   r	   r+   y   s   


r+      )r   N)
__future__r   r   r   r@   r+   r   r   r   r   r   r	   <module>   s
   K;