U
    ‰d  ã                   @   sh   d dl Z d dlZd dlmZmZmZ G dd„ deƒZG dd„ deƒZG dd„ deƒZ	G d	d
„ d
eƒZ
dS )é    N)Ú
NoMoreDataÚChunkMissingTerminatorÚInvalidChunkSizec                   @   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    || _ |  |¡| _t ¡ | _d S ©N)ÚreqÚparse_chunkedÚparserÚioÚBytesIOÚbuf)Úselfr   Úunreader© r   ú6/tmp/pip-unpacked-wheel-1tw_qy24/gunicorn/http/body.pyÚ__init__   s    zChunkedReader.__init__c                 C   s¸   t |tƒstdƒ‚|dk r"tdƒ‚|dkr.dS | jrz| j ¡ |k rzz| j t| jƒ¡ W q4 t	k
rv   d | _Y qzY q4X q4| j 
¡ }|d |… ||d …  }}t ¡ | _| j |¡ |S ©Núsize must be an integral typer   úSize must be positive.ó    )Ú
isinstanceÚintÚ	TypeErrorÚ
ValueErrorr	   r   ÚtellÚwriteÚnextÚStopIterationÚgetvaluer
   r   ©r   ÚsizeÚdataÚretÚrestr   r   r   Úread   s$    


zChunkedReader.readc                 C   sÈ   t  ¡ }| |¡ | ¡  d¡}| ¡ d d… dk}|dk rp|sp|  ||¡ | ¡  d¡}| ¡ d d… dk}q4|rŽ| | ¡ dd … ¡ dS | j | ¡ d |… ¡| j_	| | ¡ |d d … ¡ d S )Ns   

é   ó   
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¼   |   |¡\}}|dkr¸|t|ƒkrH|t|ƒ8 }|V  | ¡ }|stƒ ‚q|d |… V  ||d … }t|ƒdk r||| ¡ 7 }qb|d d… dkrœt|d d… ƒ‚| j ||dd … d\}}qd S )Nr   r%   r&   )r!   )Úparse_chunk_sizeÚlenr$   r   r   )r   r   r    r#   r   r   r   r   9   s    zChunkedReader.parse_chunkedNc                 C   sì   t  ¡ }|d k	r| |¡ | ¡  d¡}|dk rL|  ||¡ | ¡  d¡}q(| ¡ }|d |… ||d d …  }}| dd¡d  ¡ }zt|dƒ}W n t	k
r°   t
|ƒ‚Y nX |dkräz|  ||¡ W n tk
rÞ   Y nX dS ||fS )Nr&   r   r%   ó   ;é   é   )r   N)r
   r   r   r   r(   r)   ÚsplitÚstripr   r   r   r.   r   )r   r   r!   r   r,   ÚlineZ
rest_chunkÚ
chunk_sizer   r   r   r/   K   s*    
zChunkedReader.parse_chunk_sizec                 C   s    |  ¡ }|stƒ ‚| |¡ d S r   )r$   r   r   )r   r   r   r!   r   r   r   r)   f   s    zChunkedReader.get_data)N)	Ú__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 r   )r   Úlength)r   r   r<   r   r   r   r   n   s    zLengthReader.__init__c                 C   s´   t |tƒstdƒ‚t| j|ƒ}|dk r.tdƒ‚|dkr:dS t ¡ }| j 	¡ }|rt| 
|¡ | ¡ |krhqt| j 	¡ }qL| ¡ }|d |… ||d …  }}| j |¡ |  j|8  _|S r   )r   r   r   Úminr<   r   r
   r   r   r$   r   r   r   r*   )r   r    r   r!   r"   r#   r   r   r   r$   r   s&    


zLengthReader.readN©r8   r9   r:   r   r$   r   r   r   r   r;   m   s   r;   c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú	EOFReaderc                 C   s   || _ t ¡ | _d| _d S )NF)r   r
   r   r   Úfinished)r   r   r   r   r   r   Œ   s    
zEOFReader.__init__c                 C   sð   t |tƒstdƒ‚|dk r"tdƒ‚|dkr.dS | jrr| j ¡ }|d |… ||d …  }}t ¡ | _| j 	|¡ |S | j
 ¡ }|r¨| j 	|¡ | j ¡ |krœq¨| j
 ¡ }q||s²d| _| j ¡ }|d |… ||d …  }}t ¡ | _| j 	|¡ |S )Nr   r   r   r   T)r   r   r   r   r@   r   r   r
   r   r   r   r$   r   r   r   r   r   r$   ‘   s2    





zEOFReader.readNr>   r   r   r   r   r?   ‹   s   r?   c                   @   sN   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 ¡ | _d S r   )Úreaderr
   r   r   )r   rB   r   r   r   r   ²   s    zBody.__init__c                 C   s   | S r   r   )r   r   r   r   Ú__iter__¶   s    zBody.__iter__c                 C   s   |   ¡ }|stƒ ‚|S r   )Úreadliner   )r   r"   r   r   r   Ú__next__¹   s    zBody.__next__c                 C   s4   |d krt jS t|tƒs"tdƒ‚n|dk r0t jS |S )Nr   r   )ÚsysÚmaxsizer   r   r   )r   r    r   r   r   ÚgetsizeÁ   s    

zBody.getsizeNc                 C   sÎ   |   |¡}|dkrdS || j ¡ k rb| j ¡ }|d |… ||d …  }}t ¡ | _| j |¡ |S || j ¡ kr| j d¡}|s‚q| j |¡ qb| j ¡ }|d |… ||d …  }}t ¡ | _| j |¡ |S )Nr   r   é   )	rH   r   r   r   r
   r   r   rB   r$   r   r   r   r   r$   Ê   s&    




z	Body.readc                 C   sÆ   |   |¡}|dkrdS | j ¡ }t ¡ | _g }| dd|¡}|dkrL|d nt|ƒ|kr\|nd}|rŒ| |d |… ¡ | j ||d … ¡ q¼| |¡ |t|ƒ8 }| j	 
td|ƒ¡}|s.q¼q.d |¡S )Nr   r   ó   
r2   rI   )rH   r   r   r
   r   r(   r0   Úappendr   rB   r$   r=   Újoin)r   r    r!   r"   r,   r   r   r   rD   â   s$    


$
zBody.readlinec                 C   sd   g }|   ¡ }|r`| d¡}|dk r2| |¡ d}q|d |d … ||d d …  }}| |¡ q|S )NrJ   r   r   r2   )r$   r(   rK   )r   r    r"   r!   Úposr6   r   r   r   Ú	readlinesû   s    

"zBody.readlines)N)N)N)r8   r9   r:   r   rC   rE   r   rH   r$   rD   rN   r   r   r   r   rA   ±   s   	

rA   )r
   rF   Zgunicorn.http.errorsr   r   r   Úobjectr   r;   r?   rA   r   r   r   r   Ú<module>   s   `&