
y X                 @   s   d  d l  m Z m Z m Z d  d l m Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z	 Gd	 d
   d
 e  Z
 d S)    )
NoMoreDataChunkMissingTerminatorInvalidChunkSize)sixc               @   s[   e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 d
 d  Z d d   Z d	 S)ChunkedReaderc             C   s.   | |  _  |  j |  |  _ t j   |  _ d  S)N)reqparse_chunkedparserr   BytesIObuf)selfr   unreader r   B/home/ubuntu/projects/ifolica/build/gunicorn/gunicorn/http/body.py__init__   s    	zChunkedReader.__init__c             C   s  t  | t j  s! t d   n  | d k  r< t d   n  | d k rL d S|  j r x[ |  j j   | k  r y  |  j j t j	 |  j   WqX t
 k
 r d  |  _ PYqX XqX Wn  |  j j   } | d  |  | | d   } } t j   |  _ |  j j |  | S)Nzsize must be an integral typer   zSize must be positive.    )
isinstancer   integer_types	TypeError
ValueErrorr	   r   tellwritenextStopIterationgetvaluer
   )r   sizedataretrestr   r   r   read   s$    	 	!zChunkedReader.readc             C   s  t  j   } | j |  | j   j d  } | j   d  d  d k } xX | d k  r | r |  j | |  | j   j d  } | j   d  d  d k } qM W| r | j | j   d d    d S|  j j | j   d  |   |  j _	 | j | j   | d d    d  S)Ns   

   s   
r   r      )
r   r
   r   r   findget_dataunreadr   parse_headersZtrailers)r   r   r   r   idxdoner   r   r   parse_trailers'   s     (zChunkedReader.parse_trailersc             c   s  |  j  |  \ } } x | d k rxI | t |  k ro | t |  8} | V| j   } | s' t    q' q' W| d  |  V| | d   } x& t |  d k  r | | j   7} q W| d  d  d k r t | d  d    n  |  j  | d | d d   \ } } q Wd  S)Nr   r    s   
r   )parse_chunk_sizelenr   r   r   )r   r   r   r   r   r   r   r   7   s    zChunkedReader.parse_chunkedNc             C   s9  t  j   } | d  k	 r( | j |  n  | j   j d  } x5 | d k  rt |  j | |  | j   j d  } q@ W| j   } | d  |  | | d d   } } | j d d  d j   } y t | d  } Wn t	 k
 r t
 |   Yn X| d k r/y |  j | |  Wn t k
 r*Yn Xd S| | f S)Ns   
r   r       ;      )r   N)r   r
   r   r   r"   r#   splitstripintr   r   r(   r   )r   r   r   r   r&   lineZ
rest_chunk
chunk_sizer   r   r   r)   I   s*    %zChunkedReader.parse_chunk_sizec             C   s/   | j    } | s t    n  | j |  d  S)N)r   r   r   )r   r   r   r   r   r   r   r#   d   s    zChunkedReader.get_data)	__name__
__module____qualname__r   r   r(   r   r)   r#   r   r   r   r   r      s   r   c               @   s(   e  Z d  Z d d   Z d d   Z d S)LengthReaderc             C   s   | |  _  | |  _ d  S)N)r   length)r   r   r7   r   r   r   r   l   s    	zLengthReader.__init__c             C   s  t  | t j  s! t d   n  t |  j |  } | d k  rN t d   n  | d k r^ d St j   } |  j j	   } x< | r | j
 |  | j   | k r Pn  |  j j	   } q| W| j   } | d  |  | | d   } } |  j j |  |  j | 8_ | S)Nzsize must be an integral typer   zSize must be positive.r   )r   r   r   r   minr7   r   r
   r   r   r   r   r   r$   )r   r   r   r   r   r   r   r   r   r   p   s&    	!zLengthReader.readN)r3   r4   r5   r   r   r   r   r   r   r6   k   s   r6   c               @   s(   e  Z d  Z d d   Z d d   Z d S)	EOFReaderc             C   s%   | |  _  t j   |  _ d |  _ d  S)NF)r   r   r
   r   finished)r   r   r   r   r   r      s    	zEOFReader.__init__c             C   sa  t  | t j  s! t d   n  | d k  r< t d   n  | d k rL d S|  j r |  j j   } | d  |  | | d   } } t j   |  _ |  j j	 |  | S|  j
 j   } xB | r |  j j	 |  |  j j   | k r Pn  |  j
 j   } q W| sd |  _ n  |  j j   } | d  |  | | d   } } t j   |  _ |  j j	 |  | S)Nzsize must be an integral typer   zSize must be positive.r   T)r   r   r   r   r   r:   r   r   r
   r   r   r   r   )r   r   r   r   r   r   r   r   r      s2    	!	!zEOFReader.readN)r3   r4   r5   r   r   r   r   r   r   r9      s   r9   c               @   ss   e  Z d  Z d d   Z d d   Z d d   Z e Z d d   Z d	 d
 d  Z d	 d d  Z	 d	 d d  Z
 d	 S)Bodyc             C   s   | |  _  t j   |  _ d  S)N)readerr   r
   r   )r   r<   r   r   r   r      s    	zBody.__init__c             C   s   |  S)Nr   )r   r   r   r   __iter__   s    zBody.__iter__c             C   s"   |  j    } | s t    n  | S)N)readliner   )r   r   r   r   r   __next__   s    zBody.__next__c             C   sK   | d  k r t  j St | t  j  s4 t d   n | d k  rG t  j S| S)Nzsize must be an integral typer   )r   MAXSIZEr   r   r   )r   r   r   r   r   getsize   s    zBody.getsizeNc             C   s(  |  j  |  } | d k r d S| |  j j   k  r |  j j   } | d  |  | | d   } } t j   |  _ |  j j |  | SxK | |  j j   k r |  j j d  } t	 |  s Pn  |  j j |  q W|  j j   } | d  |  | | d   } } t j   |  _ |  j j |  | S)Nr   r   i   )
rA   r   r   r   r   r
   r   r<   r   r*   )r   r   r   r   r   r   r   r   r      s&    !!z	Body.readc             C   s  |  j  |  } | d k r d S|  j j   } t j   |  _ g  } x | j d d |  } | d k rq | d n t |  | k r | n d } | r | j | d  |   |  j j | | d    Pn  | j |  | t |  8} |  j	 j
 t d |   } | sF PqF qF Wd j |  S)Nr   r   s   
r,   i   )rA   r   r   r   r
   r"   r*   appendr   r<   r   r8   join)r   r   r   r   r&   r   r   r   r>      s&    4zBody.readlinec             C   s   g  } |  j    } xw t |  r | j d  } | d k  rR | j |  d } q | d  | d  | | d d   } } | j |  q W| S)Ns   
r   r   r,   )r   r*   r"   rB   )r   r   r   r   posr1   r   r   r   	readlines   s    	)zBody.readlines)r3   r4   r5   r   r=   r?   r   rA   r   r>   rE   r   r   r   r   r;      s   	r;   N)Zgunicorn.http.errorsr   r   r   Zgunicornr   objectr   r6   r9   r;   r   r   r   r   <module>   s
   `&