U
    ho$                     @   sp   d Z ddlmZ dZdZG dd dZG dd deZG d	d
 d
eZdd ZG dd deZ	G dd dZ
dS )zBuffers
    BytesIOi   i    c                   @   sf   e Zd ZdZdddZdd Zdd Zd	d
 ZdddZdddZ	dd Z
dd Zdd Zdd ZdS )FileBasedBufferr   Nc                 C   sn   || _ |d k	rj| }| }|d |t}|s8qD|| q(t| | | _|| || d S Nr   )	filegetfiletellseekread
COPY_BYTESwriteintremain)selfr   from_buffer	from_fileread_posdata r   B/var/www/html/venv/lib/python3.8/site-packages/waitress/buffers.py__init__   s    


zFileBasedBuffer.__init__c                 C   s   | j S N)r   r   r   r   r   __len__+   s    zFileBasedBuffer.__len__c                 C   s   dS )NTr   r   r   r   r   __bool__.   s    zFileBasedBuffer.__bool__c                 C   sB   | j }| }|dd || || | jt| | _d S Nr      )r   r   r	   r   r   len)r   sr   r   r   r   r   append1   s    

zFileBasedBuffer.appendFc                 C   sT   | j }|s| }|dk r$| }n
||}|rF|  jt|8  _n
|| |S r   )r   r   r
   r   r   r	   r   numbytesskipr   r   resr   r   r   get9   s    


zFileBasedBuffer.getc                 C   s:   | j |k rtd|| j f | j|d | j | | _ d S )Nz)Can't skip %d bytes in buffer of %d bytes   )r   
ValueErrorr   r	   )r   r"   allow_pruner   r   r   r#   H   s    
zFileBasedBuffer.skipc                 C   s
   t  d S r   NotImplementedErrorr   r   r   r   newfileP   s    zFileBasedBuffer.newfilec                 C   sp   | j }| jdkrB| }|dd | }|| |dkrBd S |  }|t}|sZqf|| qJ|| _ d S r   )r   r   r   r	   r+   r
   r   r   )r   r   r   sznfr   r   r   r   pruneS   s    


zFileBasedBuffer.prunec                 C   s   | j S r   )r   r   r   r   r   r   e   s    zFileBasedBuffer.getfilec                 C   s    t | jdr| j  d| _d S )Ncloser   )hasattrr   r/   r   r   r   r   r   r/   h   s    
zFileBasedBuffer.close)N)r    F)r   )__name__
__module____qualname__r   r   r   r   r   r%   r#   r+   r.   r   r/   r   r   r   r   r      s   


r   c                   @   s   e Zd ZdddZdd ZdS )TempfileBasedBufferNc                 C   s   t | |  | d S r   )r   r   r+   r   r   r   r   r   r   o   s    zTempfileBasedBuffer.__init__c                 C   s   ddl m} |dS )Nr   )TemporaryFilezw+b)tempfiler6   )r   r6   r   r   r   r+   r   s    zTempfileBasedBuffer.newfile)Nr1   r2   r3   r   r+   r   r   r   r   r4   n   s   
r4   c                   @   s   e Zd ZdddZdd ZdS )BytesIOBasedBufferNc                 C   s&   |d k	rt | t | nt | _d S r   )r   r   r   r   r5   r   r   r   r   y   s    zBytesIOBasedBuffer.__init__c                 C   s   t  S r   r   r   r   r   r   r+      s    zBytesIOBasedBuffer.newfile)Nr8   r   r   r   r   r9   x   s   
r9   c                 C   s&   t | dr|  S t | do$t | dS )Nseekabler	   r   )r0   r:   )fpr   r   r   _is_seekable   s    
r<   c                   @   sF   e Zd ZdddZdddZdd	d
Zdd Zdd ZeZdd Z	dS )ReadOnlyFileBasedBuffer   c                 C   sD   || _ || _t| j r@t| j dr,| j j| _| j j| _| j j| _d S )Nr:   )r   
block_sizer<   r0   r:   r	   r   )r   r   r?   r   r   r   r      s    


z ReadOnlyFileBasedBuffer.__init__Nc                 C   sb   t | jr\| j }| jdd | j }| j| || }|d krP|| _nt||| _| jS r   )r<   r   r   r	   r   min)r   size	start_posend_posfsizer   r   r   prepare   s    


zReadOnlyFileBasedBuffer.preparer    Fc                 C   sZ   |dks|| j kr| j }| j}|s*| }||}|rL|  j t|8  _ n
|| |S )Nr    )r   r   r   r
   r   r	   r!   r   r   r   r%      s    

zReadOnlyFileBasedBuffer.getc                 C   s   | S r   r   r   r   r   r   __iter__   s    z ReadOnlyFileBasedBuffer.__iter__c                 C   s   | j | j}|st|S r   )r   r
   r?   StopIteration)r   valr   r   r   next   s    zReadOnlyFileBasedBuffer.nextc                 C   s   t d S r   r)   )r   r   r   r   r   r      s    zReadOnlyFileBasedBuffer.append)r>   )N)r    F)
r1   r2   r3   r   rE   r%   rF   rI   __next__r   r   r   r   r   r=      s   


r=   c                   @   s   e Zd ZdZd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ddZdddZdd Zdd Zdd ZdS ) OverflowableBufferz
    This buffer implementation has four stages:
    - No data
    - Bytes-based buffer
    - BytesIO-based buffer
    - Temporary file storage
    The first two stages are fastest for simple transfers.
    FN    c                 C   s
   || _ d S r   )overflow)r   rM   r   r   r   r      s    zOverflowableBuffer.__init__c                 C   s$   | j }|d k	r| S | j S d S r   )bufr   strbufr   rN   r   r   r   r      s    zOverflowableBuffer.__len__c                 C   s   |   dkS r   )r   r   r   r   r   r      s    zOverflowableBuffer.__bool__c                 C   sF   | j }t|| jkr|   n|   | j}|rB|| j  d| _ |S NrL   )rO   r   rM   _set_large_buffer_set_small_bufferrN   r   )r   rO   rN   r   r   r   _create_buffer   s    
z!OverflowableBuffer._create_bufferc                 C   s,   | j }t|| _ t|dr"|  d| _d S )Nr/   F)rN   r9   r0   r/   
overflowedr   Zoldbufr   r   r   rS      s
    

z$OverflowableBuffer._set_small_bufferc                 C   s,   | j }t|| _ t|dr"|  d| _d S )Nr/   T)rN   r4   r0   r/   rU   rV   r   r   r   rR      s
    

z$OverflowableBuffer._set_large_bufferc                 C   sl   | j }|d kr>| j}t|t| tk r6|| | _d S |  }|| | }| jsh|| jkrh| 	  d S r   )
rN   rO   r   STRBUF_LIMITrT   r   r   rU   rM   rR   )r   r   rN   rO   r,   r   r   r   r     s    


zOverflowableBuffer.appendr    c                 C   s0   | j }|d kr$| j}|s|S |  }|||S r   )rN   rO   rT   r%   )r   r"   r#   rN   rO   r   r   r   r%     s    zOverflowableBuffer.getc                 C   sB   | j }|d kr2|r*|t| jkr*d| _d S |  }||| d S rQ   )rN   r   rO   rT   r#   )r   r"   r(   rN   r   r   r   r#     s    zOverflowableBuffer.skipc                 C   sD   | j }|dkrd| _dS |  | jr@| }|| jk r@|   dS )zt
        A potentially expensive operation that removes all data
        already retrieved from the buffer.
        NrL   )rN   rO   r.   rU   r   rM   rS   )r   rN   r,   r   r   r   r.   *  s    
zOverflowableBuffer.prunec                 C   s   | j }|d kr|  }| S r   )rN   rT   r   rP   r   r   r   r   <  s    zOverflowableBuffer.getfilec                 C   s   | j }|d k	r|  d S r   )rN   r/   rP   r   r   r   r/   B  s    zOverflowableBuffer.close)r    F)F)r1   r2   r3   __doc__rU   rN   rO   r   r   r   rT   rS   rR   r   r%   r#   r.   r   r/   r   r   r   r   rK      s    		


	
rK   N)rX   ior   r   rW   r   r4   r9   r<   r=   rK   r   r   r   r   <module>   s   U
;