B
    `                 @   sX   d dl Z ddgZe jde jdZe dZG dd deZG dd deZdd
dZ	dS )    NRangeContentRangezbytes *= *(\d*) *- *(\d*))flagsz'bytes (?:(\d+)-(\d+)|[*])/(?:(\d+)|[*])c               @   sL   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	e
dd ZdS )r   z*
        Represents the Range header.
    c             C   s,   |d ks|dkst d| || _|| _d S )Nr   zBad range end: %r)AssertionErrorstartend)selfr   r    r	   W/home/kop/projects/devel/pgwui/test_venv/lib/python3.7/site-packages/webob/byterange.py__init__   s    zRange.__init__c             C   s\   |dkrdS | j | j }}|dkr6|}|dk r6||7 }t|||rTt||}||fS dS dS )z
            *If* there is only one range, and *if* it is satisfiable by
            the given length, then return a (start, end) non-inclusive range
            of bytes to serve.  Otherwise return None
        Nr   )r   r   _is_content_range_validmin)r   lengthr   r   stopr	   r	   r
   range_for_length   s    
zRange.range_for_lengthc             C   s*   |  |}|dkrdS t|d |d |S )a%  
            Works like range_for_length; returns None or a ContentRange object

            You can use it like::

                response.content_range = req.range.content_range(response.content_length)

            Though it's still up to you to actually serve that content range!
        Nr      )r   r   )r   r   ranger	   r	   r
   content_range$   s    

zRange.content_rangec             C   sB   | j | j }}|d kr2d| }|dkr.|d7 }|S d||d f S )Nzbytes=%sr   -zbytes=%s-%sr   )r   r   )r   serr	   r	   r
   __str__3   s    zRange.__str__c             C   s   d| j j| j| jf S )Nz<%s bytes %r-%r>)	__class____name__r   r   )r   r	   r	   r
   __repr__<   s    zRange.__repr__c             C   s   t | j| jfS )N)iterr   r   )r   r	   r	   r
   __iter__A   s    zRange.__iter__c             C   sn   t |p
d}|sdS | \}}|s6| t| dS t|}|sL| |dS t|d }||krddS | ||S )zL
            Parse the header; may return None if header is invalid
         Nr   )	_rx_rangematchgroupsint)clsheadermr   r   r	   r	   r
   parseD   s    
zRange.parseN)r   
__module____qualname____doc__r   r   r   r   r   r   classmethodr&   r	   r	   r	   r
   r      s   	c               @   s<   e Zd ZdZdd Zdd Zdd Zdd	 Zed
d Z	dS )r   z
    Represents the Content-Range header

    This header is ``start-stop/length``, where start-stop and length
    can be ``*`` (represented as None in the attributes).
    c             C   s4   t |||std|||f || _|| _|| _d S )NzBad start:stop/length: %r-%r/%r)r   
ValueErrorr   r   r   )r   r   r   r   r	   r	   r
   r   a   s    zContentRange.__init__c             C   s   d| j j| f S )Nz<%s %s>)r   r   )r   r	   r	   r
   r   i   s    zContentRange.__repr__c             C   sP   | j d krd}n| j }| jd kr6| jd ks.td| S | jd }d| j||f S )N*z
bytes */%sr   zbytes %s-%s/%s)r   r   r   r   )r   r   r   r	   r	   r
   r   l   s    


zContentRange.__str__c             C   s   t | j| j| jgS )zs
            Mostly so you can unpack this, like:

                start, stop, length = res.content_range
        )r   r   r   r   )r   r	   r	   r
   r   w   s    zContentRange.__iter__c             C   sh   t |p
d}|sdS | \}}}|r<t|}t|d }|oFt|}t|||dds\dS | |||S )zL
            Parse the header.  May return None if it cannot parse.
        r   Nr   T)response)_rx_content_ranger    r!   r"   r   )r#   valuer%   r   r   lr	   r	   r
   r&      s    zContentRange.parseN)
r   r'   r(   r)   r   r   r   r   r*   r&   r	   r	   r	   r
   r   X   s   Fc             C   s   | d k|d kkrdS | d kr,|d kp*|dkS |d krLd|   koF|k S   S | |krXdS |rh||krhdS d|   koz|k S   S d S )NFr   r	   )r   r   r   r-   r	   r	   r
   r      s    r   )F)
re__all__compileIr   r.   objectr   r   r   r	   r	   r	   r
   <module>   s   
Q9