U
    ‰¾úg„  ã                   @   sJ   d dl Z d dlZd dlmZmZmZ dgZe  de j¡Z	G dd„ dƒZ
dS )é    N)ÚListÚOptionalÚUnionÚReceiveBuffers   
?
c                   @   s¶   e Zd Zddœdd„Zeeef d dœdd„Zedœdd	„Z	e
dœd
d„Zedœdd„Ze
edœdd„Ze
ee dœdd„Zee dœdd„Zeee  dœdd„Zedœdd„ZdS )r   N)Úreturnc                 C   s   t ƒ | _d| _d| _d S ©Nr   )Ú	bytearrayÚ_dataÚ_next_line_searchÚ_multiple_lines_search©Úself© r   ú6/tmp/pip-unpacked-wheel-ib4s2i_e/h11/_receivebuffer.pyÚ__init__0   s    zReceiveBuffer.__init__)Ú	bytesliker   c                 C   s   |  j |7  _ | S ©N)r	   )r   r   r   r   r   Ú__iadd__5   s    zReceiveBuffer.__iadd__c                 C   s   t t| ƒƒS r   )ÚboolÚlenr   r   r   r   Ú__bool__9   s    zReceiveBuffer.__bool__c                 C   s
   t | jƒS r   )r   r	   r   r   r   r   Ú__len__<   s    zReceiveBuffer.__len__c                 C   s
   t | jƒS r   )Úbytesr	   r   r   r   r   Ú	__bytes__@   s    zReceiveBuffer.__bytes__)Úcountr   c                 C   s*   | j d |… }| j d |…= d| _d| _|S r   )r	   r
   r   ©r   r   Úoutr   r   r   Ú_extractC   s
    zReceiveBuffer._extractc                 C   s    | j d|… }|sdS |  |¡S )zB
        Extract a fixed number of bytes from the buffer.
        N)r	   r   r   r   r   r   Úmaybe_extract_at_mostM   s    z#ReceiveBuffer.maybe_extract_at_mostc                 C   sH   t d| jd ƒ}| j d|¡}|dkr6t| jƒ| _dS |d }|  |¡S )zK
        Extract the first line, if it is completed in the buffer.
        r   é   ó   
éÿÿÿÿNé   )Úmaxr
   r	   Úfindr   r   )r   Zsearch_start_indexZpartial_idxÚidxr   r   r   Úmaybe_extract_next_lineW   s    z%ReceiveBuffer.maybe_extract_next_linec                 C   sÞ   | j dd… dkr |  d¡ g S | j dd… dkr@|  d¡ g S t | j | j¡}|dkrrtdt| j ƒd ƒ| _dS | d¡d }|  |¡}| d¡}|D ]}| 	d¡r˜|d= q˜|d	 |d   krÊd
ksÐn t
‚|d	d…= |S )z\
        Extract everything up to the first blank line, and return a list of lines.
        Nr   ó   
r"   r    r   r!   ó   éþÿÿÿó    )r	   r   Úblank_line_regexÚsearchr   r#   r   ÚspanÚsplitÚendswithÚAssertionError)r   Úmatchr%   r   ÚlinesÚliner   r   r   Úmaybe_extract_linesh   s&    




"
z!ReceiveBuffer.maybe_extract_linesc                 C   s,   z| j d dk W S  tk
r&   Y dS X d S )Nr   é!   F)r	   Ú
IndexErrorr   r   r   r   Ú+is_next_line_obviously_invalid_request_line“   s    z9ReceiveBuffer.is_next_line_obviously_invalid_request_line)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   Úintr   r   r   r   r   r&   r   r4   r7   r   r   r   r   r   /   s   

+)ÚreÚsysÚtypingr   r   r   Ú__all__ÚcompileÚ	MULTILINEr+   r   r   r   r   r   Ú<module>   s
   '