U
    Ê¼µbD  ã                   @   sF  d dl Z ddlmZmZmZ ddlT ddlT ddlmZm	Z	m
Z
mZ dgZe  e d¡¡Ze  d¡Zd	d
„ Zdd„ Ze  e	 d¡¡Zdd„ Ze  e
 d¡¡Zdd„ ZG dd„ dƒZe  e d¡¡ZG dd„ deƒZG dd„ deƒZdd„ Zeefeeefeee feee!feee"feee#feee!feee"feee#fee$eeedœi
Z%dS )é    Né   )ÚLocalProtocolErrorÚRemoteProtocolErrorÚvalidate)Ú*)Úheader_fieldÚrequest_lineÚstatus_lineÚchunk_headerÚREADERSÚasciis   [ \t]+c                 c   sˆ   t | ƒ}d }|D ]d}t |¡}|rb|d kr2tdƒ‚t|tƒsDt|ƒ}|d7 }||| ¡ d … 7 }q|d k	rp|V  |}q|d k	r„|V  d S )Nz%continuation line at start of headersó    )ÚiterÚobs_fold_reÚmatchr   Ú
isinstanceÚ	bytearrayÚend)ÚlinesÚitÚlastÚliner   © r   ú0/tmp/pip-unpacked-wheel-rko__zic/h11/_readers.pyÚ_obsolete_line_fold    s$    
ÿ
r   c                 c   s2   t | ƒD ]$}ttt|ƒƒ}|d |d fV  qd S )NÚ
field_nameZfield_value)r   r   Úheader_field_reÚbytes)r   r   Úmatchesr   r   r   Ú_decode_header_lines4   s    r   c                 C   sR   |   ¡ }|d krd S |s tdƒ‚tt|d ƒ}tf tt|dd … ƒƒddœ|—ŽS )Nzno request line receivedr   r   T©ÚheadersZ_parsed)Úmaybe_extract_linesr   r   Úrequest_line_reÚRequestÚlistr   )Úbufr   r   r   r   r   Úmaybe_read_from_IDLE_client?   s    ÿþr'   c                 C   sŠ   |   ¡ }|d krd S |s tdƒ‚tt|d ƒ}|d d krBd|d< t|d ƒ }|d< |dk rbtnt}|f tt|dd … ƒƒdd	œ|—ŽS )
Nzno response line receivedr   Úreasonó    Ústatus_codeéÈ   r   Tr    )	r"   r   r   Ústatus_line_reÚintZInformationalResponseÚResponser%   r   )r&   r   r   r*   Úclass_r   r   r   Ú$maybe_read_from_SEND_RESPONSE_serverL   s    ÿþr0   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚContentLengthReaderc                 C   s   || _ || _d S ©N)Ú_lengthÚ
_remaining)ÚselfÚlengthr   r   r   Ú__init__^   s    zContentLengthReader.__init__c                 C   sD   | j dkrtƒ S | | j ¡}|d kr(d S |  j t|ƒ8  _ t|d�S )Nr   ©Údata)r4   ÚEndOfMessageÚmaybe_extract_at_mostÚlenÚData©r5   r&   r9   r   r   r   Ú__call__b   s    
zContentLengthReader.__call__c                 C   s   t d | j| j | j¡ƒ‚d S )Nz]peer closed connection without sending complete message body (received {} bytes, expected {}))r   Úformatr3   r4   ©r5   r   r   r   Úread_eofk   s    
 þÿzContentLengthReader.read_eofN©Ú__name__Ú
__module__Ú__qualname__r7   r?   rB   r   r   r   r   r1   ]   s   	r1   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚChunkedReaderc                 C   s   d| _ d| _d| _d S )Nr   F)Ú_bytes_in_chunkÚ_bytes_to_discardÚ_reading_trailerrA   r   r   r   r7   u   s    zChunkedReader.__init__c                 C   sB  | j r,| ¡ }|d krd S ttt|ƒƒd�S | jdkrn| | j¡}|d krNd S |  jt|ƒ8  _| jdkrnd S | jdks|t‚| j	dkrÚ| 
d¡}|d krœd S tt|ƒ}tt|d ƒdd�| _	| j	dkrÔd| _ | |ƒS d}nd}| j	dksìt‚| | j	¡}|d k�rd S |  j	t|ƒ8  _	| j	dk�r0d	| _d}nd}t|||d
�S )N)r!   r   s   
Ú
chunk_sizeé   )ÚbaseTFé   )r9   Úchunk_startÚ	chunk_end)rJ   r"   r:   r%   r   rI   r;   r<   ÚAssertionErrorrH   Zmaybe_extract_until_nextr   Úchunk_header_rer-   r   r=   )r5   r&   r   r9   r
   r   rO   rP   r   r   r   r?   }   sD    






zChunkedReader.__call__c                 C   s   t dƒ‚d S )NzVpeer closed connection without sending complete message body (incomplete chunked read))r   rA   r   r   r   rB   ¨   s    ÿzChunkedReader.read_eofNrC   r   r   r   r   rG   t   s   +rG   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚHttp10Readerc                 C   s    |  d¡}|d krd S t|d�S )NiÿÉš;r8   )r;   r=   r>   r   r   r   r?   ¯   s    
zHttp10Reader.__call__c                 C   s   t ƒ S r2   )r:   rA   r   r   r   rB   µ   s    zHttp10Reader.read_eofN)rD   rE   rF   r?   rB   r   r   r   r   rS   ®   s   rS   c                 C   s   | rt dƒ‚d S )NzGot data when expecting EOF)r   )r&   r   r   r   Úexpect_nothing¸   s    rT   )Úchunkedzcontent-lengthzhttp/1.0)&ÚreZ_utilr   r   r   Ú_stateZ_eventsZ_abnfr   r   r	   r
   Ú__all__ÚcompileÚencoder   r   r   r   r#   r'   r,   r0   r1   rR   ÚobjectrG   rS   rT   ZCLIENTZIDLEZSERVERZSEND_RESPONSEZDONEZ
MUST_CLOSEZCLOSEDZ	SEND_BODYr   r   r   r   r   Ú<module>   sT   
	:
         ýô