o
    [h!                     @   s\  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*dee+ dee+ fddZ,dee+ deee+e+f  fddZ-e 'e(d
Z.dedee fddZ/e 'e(d
Z0dede
eedf fddZ1G dd dZ2e 'e(d
Z3G dd dZ4G dd dZ5deddf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 ]2}t|}|r2|d u rtdt|ts#t|}|d7 }||| d  7 }q	|d ur9|V  |}q	|d urE|V  d S d S )Nz%continuation line at start of headers    )iterobs_fold_rematchr   
isinstance	bytearrayend)r$   itlastliner)    r0   s/home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/h11/_readers.py_obsolete_line_fold+   s$   


r2   c                 c   s4    t | D ]}tt|d|}|d |d fV  qd S )Nzillegal header line: {!r}
field_nameZfield_value)r2   r!   header_field_re)r$   r/   matchesr0   r0   r1   _decode_header_lines@   s
   r6   bufc                 C   sj   |   }|d u r|  rtdd S |stdtt|d d|d }tdtt|dd  dd|S )	Nillegal request linezno request line receivedr   zillegal request line: {!r}r   T)headers_parsedr0   )maybe_extract_lines+is_next_line_obviously_invalid_request_liner   r!   request_line_rer   listr6   )r7   r$   r5   r0   r0   r1   maybe_read_from_IDLE_clientK   s   r?   c                 C   s   |   }|d u r|  rtdd S |stdtt|d d|d }|d d u r+dn|d }|d d u r7dn|d }t|d	 }|d
k rGtnt}|tt	|dd  d|||dS )Nr8   zno response line receivedr   zillegal status line: {!r}http_versions   1.1reason    status_code   r   T)r9   r:   rC   rA   r@   )
r;   r<   r   r!   status_line_reintr   r   r>   r6   )r7   r$   r5   r@   rA   rC   class_r0   r0   r1   $maybe_read_from_SEND_RESPONSE_server^   s*   rH   c                   @   sH   e Zd ZdeddfddZdedeeedf fddZ	de
fd	d
ZdS )ContentLengthReaderlengthr%   Nc                 C   s   || _ || _d S N)_length
_remaining)selfrJ   r0   r0   r1   __init__{   s   
zContentLengthReader.__init__r7   c                 C   sD   | j dkrt S || j }|d u rd S |  j t|8  _ t|dS )Nr   data)rM   r   maybe_extract_at_mostlenr   rN   r7   rQ   r0   r0   r1   __call__   s   

zContentLengthReader.__call__c                 C   s   t d| j| j | j)Nz]peer closed connection without sending complete message body (received {} bytes, expected {}))r   formatrL   rM   rN   r0   r0   r1   read_eof   s   zContentLengthReader.read_eof)__name__
__module____qualname__rF   rO   r   r
   r   r   rU   r   rX   r0   r0   r0   r1   rI   z   s    	rI   c                   @   s@   e Zd Zd
ddZdedeeedf fddZde	fdd	Z
dS )ChunkedReaderr%   Nc                 C   s   d| _ d| _d| _d S )Nr   rB   F)_bytes_in_chunk_bytes_to_discard_reading_trailerrW   r0   r0   r1   rO      s   
zChunkedReader.__init__r7   c                 C   sh  | j r| }|d u rd S ttt|dS | jrM|t| j}|d u r'd S || jd t| kr>td|d| jd| jt|d  | _| jrMd S | jdksTJ | j	dkr|
 }|d u rcd S tt|d|}t|d d	d
| _	| j	dkrd| _ | |S d}nd}| j	dksJ || j	}|d u rd S |  j	t|8  _	| j	dkrd| _d}nd}t|||dS )N)r9   zmalformed chunk footer: z (expected )rB   r   zillegal chunk header: {!r}
chunk_size   )baseTFs   
)rQ   chunk_start	chunk_end)r_   r;   r   r>   r6   r^   rR   rS   r   r]   Zmaybe_extract_next_liner!   chunk_header_rerF   r   )rN   r7   r$   rQ   r   r5   rd   re   r0   r0   r1   rU      sV   


zChunkedReader.__call__c                 C   s   t d)NzVpeer closed connection without sending complete message body (incomplete chunked read))r   rW   r0   r0   r1   rX      s   zChunkedReader.read_eof)r%   N)rY   rZ   r[   rO   r   r
   r   r   rU   r   rX   r0   r0   r0   r1   r\      s    
2r\   c                   @   s0   e Zd Zdedee fddZdefddZdS )Http10Readerr7   r%   c                 C   s    | d}|d u rd S t|dS )Niɚ;rP   )rR   r   rT   r0   r0   r1   rU      s   

zHttp10Reader.__call__c                 C   s   t  S rK   )r   rW   r0   r0   r1   rX      s   zHttp10Reader.read_eofN)	rY   rZ   r[   r   r   r   rU   r   rX   r0   r0   r0   r1   rg      s    rg   c                 C   s   | rt dd S )NzGot data when expecting EOF)r   )r7   r0   r0   r1   expect_nothing   s   rh   .)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encoder4   r(   bytesr2   r6   r=   r?   rE   rH   rI   rf   r\   rg   rh   strZReadersTyper"   __annotations__r0   r0   r0   r1   <module>   sb   
,(



A"