o
    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   F/app/.heroku/python/lib/python3.10/site-packages/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r@| j |k r@z| jt| j W n t	y8   d | _Y nw | j |k s!| 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 r=|s=| || | d}| d d dk}|dk r=|r |rL|| 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rl|t|kr*|t|8 }|V  | }|s$t |t|ks|d | V  ||d  }t|dk rI|| 7 }t|dk s=|d d dkrYt|d d | j ||dd  d\}}|dksd S 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 ur|| | d}|dk r)| || | d}|dk s| }|d | ||d d  }}|ddd  }zt|d}W n t	yX   t
|w |dkrqz	| || W dS  typ   Y dS w ||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   s2   
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_datar   )	__name__
__module____qualname__r   r$   r.   r   r/   r)   r   r   r   r   r      s    
r   c                   @      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	 }|r;|
| | |kr4n| j	 }|s(| }|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                   @   r;   )	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r9| j }|d | ||d  }}t | _| j	| |S | j
 }|rU| j	| | j |krNn| j
 }|s@|sZd| _| j }|d | ||d  }}t | _| j	| |S )Nr   r   r   r   T)r   r   r   r   rA   r   r   r
   r   r   r   r$   r   r   r   r   r   r$      s4   






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   rC   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   s2   |d u rt jS t|tstd|dk rt 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 r1| j }|d | ||d  }}t | _| j| |S || j krN| jd}|sAn| j| || j ks8| j }|d | ||d  }}t | _| j| |S )Nr   r      )	rI   r   r   r   r
   r   r   rC   r$   r   r   r   r   r$      s(   




z	Body.readc                 C   s   |  |}|dkrdS | j }t | _g }	 |dd|}|dkr'|d n	t||kr/|nd}|rG||d |  | j||d   n|| |t|8 }| j	
td|}|s^nqd|S )Nr   r   r2      
rJ   )rI   r   r   r
   r   r(   r0   appendr   rC   r$   r>   join)r   r    r!   r"   r,   r   r   r   rE      s(   


$

zBody.readlinec                 C   sf   g }|   }|r1|d}|dk r|| d}n|d |d  ||d d  }}|| |s|S )NrK   r   r   r2   )r$   r(   rL   )r   r    r"   r!   posr6   r   r   r   	readlines   s   

"
zBody.readlinesr   )r8   r9   r:   r   rD   rF   r   rI   r$   rE   rO   r   r   r   r   rB      s    
	
rB   )r
   rG   Zgunicorn.http.errorsr   r   r   objectr   r<   r@   rB   r   r   r   r   <module>   s   `&