U
    Rh!                     @   sR  U d dl Z d dlmZmZmZmZmZmZmZm	Z	m
Z
 ddlmZmZmZmZ ddlmZmZmZmZmZ ddlmZ ddlmZmZmZmZmZmZmZm Z  ddl!m"Z"m#Z#m$Z$m%Z% d	gZ&e 'e(d
Z)e 'dZ*ee+ ee+ dddZ,ee+ eee+e+f  dddZ-e 'e(d
Z.eee dddZ/e 'e(d
Z0ee
eedf dddZ1G dd dZ2e 'e(d
Z3G dd dZ4G dd dZ5eddddZ6ee
e	e$ ee	e$ e	e$ f f e
edef ee7edef f f f Z8eefe/e efe1e efe1eefe6eefe6eefe6e efe6e efe6e efe6ee4e2e5di
Z9e8e:d	< dS )     N)	AnyCallableDictIterableNoReturnOptionalTupleTypeUnion   )chunk_headerheader_fieldrequest_linestatus_line)DataEndOfMessageInformationalResponseRequestResponse)ReceiveBuffer)CLIENTCLOSEDDONEIDLE
MUST_CLOSE	SEND_BODYSEND_RESPONSESERVER)LocalProtocolErrorRemoteProtocolErrorSentinelvalidateREADERSasciis   [ \t]+)linesreturnc                 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)r$   itZlastliner)    r/   2./venv/lib/python3.8/site-packages/h11/_readers.py_obsolete_line_fold+   s     

r1   c                 c   s2   t | D ]$}tt|d|}|d |d fV  qd S )Nzillegal header line: {!r}Z
field_nameZfield_value)r1   r!   header_field_re)r$   r.   matchesr/   r/   r0   _decode_header_lines@   s    r4   bufr%   c                 C   sj   |   }|d kr$|  r tdd S |s0tdtt|d d|d }tf tt|dd  dd|S )Nillegal request linezno request line receivedr   zillegal request line: {!r}r   T)headers_parsed)maybe_extract_lines+is_next_line_obviously_invalid_request_liner   r!   request_line_rer   listr4   )r6   r$   r3   r/   r/   r0   maybe_read_from_IDLE_clientK   s&        r>   c                 C   s   |   }|d kr$|  r tdd S |s0tdtt|d d|d }|d d krVdn|d }|d d krndn|d }t|d	 }|d
k rtnt}|tt	|dd  d|||dS )Nr7   zno response line receivedr   zillegal status line: {!r}http_versions   1.1reason    status_code   r   T)r8   r9   rB   r@   r?   )
r:   r;   r   r!   status_line_reintr   r   r=   r4   )r6   r$   r3   r?   r@   rB   class_r/   r/   r0   $maybe_read_from_SEND_RESPONSE_server^   s*    rG   c                   @   sD   e Zd ZeddddZeeeedf dddZ	e
dd	d
ZdS )ContentLengthReaderN)lengthr%   c                 C   s   || _ || _d S N)_length
_remaining)selfrI   r/   r/   r0   __init__{   s    zContentLengthReader.__init__r5   c                 C   sD   | j dkrt S || j }|d kr(d S |  j t|8  _ t|dS )Nr   data)rL   r   maybe_extract_at_mostlenr   rM   r6   rP   r/   r/   r0   __call__   s    
zContentLengthReader.__call__r%   c                 C   s   t d| j| j | jd S )Nz]peer closed connection without sending complete message body (received {} bytes, expected {}))r   formatrK   rL   rM   r/   r/   r0   read_eof   s    
 zContentLengthReader.read_eof)__name__
__module____qualname__rE   rN   r   r
   r   r   rT   r   rX   r/   r/   r/   r0   rH   z   s   	rH   c                   @   sB   e Zd ZddddZeeeedf dddZe	ddd	Z
dS )
ChunkedReaderNrU   c                 C   s   d| _ d| _d| _d S )Nr   rA   F)_bytes_in_chunk_bytes_to_discard_reading_trailerrW   r/   r/   r0   rN      s    zChunkedReader.__init__r5   c                 C   sr  | j r,| }|d krd S ttt|dS | jr|t| j}|d krNd S || jd t| kr|td|d| jd| jt|d  | _| jrd S | jdkst	| j
dkr| }|d krd S tt|d|}t|d d	d
| _
| j
dkrd| _ | |S d}nd}| j
dkst	|| j
}|d kr6d S |  j
t|8  _
| j
dkr`d| _d}nd}t|||dS )N)r8   zmalformed chunk footer: z (expected )rA   r   zillegal chunk header: {!r}Z
chunk_size   )baseTFs   
)rP   chunk_start	chunk_end)r_   r:   r   r=   r4   r^   rQ   rR   r   AssertionErrorr]   Zmaybe_extract_next_liner!   chunk_header_rerE   r   )rM   r6   r$   rP   r   r3   rc   rd   r/   r/   r0   rT      sV    
zChunkedReader.__call__c                 C   s   t dd S )NzVpeer closed connection without sending complete message body (incomplete chunked read))r   rW   r/   r/   r0   rX      s    zChunkedReader.read_eof)rY   rZ   r[   rN   r   r
   r   r   rT   r   rX   r/   r/   r/   r0   r\      s   2r\   c                   @   s.   e Zd Zeee dddZedddZdS )Http10Readerr5   c                 C   s    | d}|d krd S t|dS )Niɚ;rO   )rQ   r   rS   r/   r/   r0   rT      s    
zHttp10Reader.__call__rU   c                 C   s   t  S rJ   )r   rW   r/   r/   r0   rX      s    zHttp10Reader.read_eofN)	rY   rZ   r[   r   r   r   rT   r   rX   r/   r/   r/   r0   rg      s   rg   c                 C   s   | rt dd S )NzGot data when expecting EOF)r   )r6   r/   r/   r0   expect_nothing   s    rh   .)Zchunkedzcontent-lengthzhttp/1.0);retypingr   r   r   r   r   r   r   r	   r
   Z_abnfr   r   r   r   Z_eventsr   r   r   r   r   Z_receivebufferr   _stater   r   r   r   r   r   r   r   Z_utilr   r   r    r!   __all__compileencoder2   r(   bytesr1   r4   r<   r>   rD   rG   rH   rf   r\   rg   rh   strZReadersTyper"   __annotations__r/   r/   r/   r0   <module>   sl    ,(

A"         