U
    nËjŽ!  ã                   @   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$   ÚitÚlastÚliner)   © r0   ú0/tmp/pip-unpacked-wheel-fpxc_c9c/h11/_readers.pyÚ_obsolete_line_fold+   s     

r2   c                 c   s2   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   ©Ú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   Úlistr6   )r8   r$   r5   r0   r0   r1   Ú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 rŽtnt}|tt	|dd … ƒƒd|||d�S )Nr9   zno response line receivedr   zillegal status line: {!r}Úhttp_versions   1.1Úreasonó    Ústatus_codeéÈ   r   T)r:   r;   rD   rB   rA   )
r<   r=   r   r!   Ústatus_line_reÚintr   r   r?   r6   )r8   r$   r5   rA   rB   rD   Úclass_r0   r0   r1   Ú$maybe_read_from_SEND_RESPONSE_server^   s*    ÿÿûrI   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)ÚselfrK   r0   r0   r1   Ú__init__{   s    zContentLengthReader.__init__r7   c                 C   sD   | j dkrtƒ S | | j ¡}|d kr(d S |  j t|ƒ8  _ t|d�S )Nr   ©Údata)rN   r   Úmaybe_extract_at_mostÚlenr   ©rO   r8   rR   r0   r0   r1   Ú__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   ÚformatrM   rN   ©rO   r0   r0   r1   Úread_eofˆ   s    
 þÿzContentLengthReader.read_eof)Ú__name__Ú
__module__Ú__qualname__rG   rP   r   r
   r   r   rV   r   rZ   r0   r0   r0   r1   rJ   z   s   	rJ   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 )
ÚChunkedReaderNrW   c                 C   s   d| _ d| _d| _d S )Nr   rC   F)Ú_bytes_in_chunkÚ_bytes_to_discardÚ_reading_trailerrY   r0   r0   r1   rP   •   s    zChunkedReader.__init__r7   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ršd S | jdks¨t	‚| j
dk�r| ¡ }|d krÈd 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)r:   zmalformed chunk footer: z (expected ú)rC   r   zillegal chunk header: {!r}Ú
chunk_sizeé   )ÚbaseTFs   
)rR   Úchunk_startÚ	chunk_end)ra   r<   r   r?   r6   r`   rS   rT   r   ÚAssertionErrorr_   Zmaybe_extract_next_liner!   Úchunk_header_rerG   r   )rO   r8   r$   rR   r   r5   rf   rg   r0   r0   r1   rV   œ   sV    ÿü
zChunkedReader.__call__c                 C   s   t dƒ‚d S )NzVpeer closed connection without sending complete message body (incomplete chunked read))r   rY   r0   r0   r1   rZ   Î   s    ÿzChunkedReader.read_eof)r[   r\   r]   rP   r   r
   r   r   rV   r   rZ   r0   r0   r0   r1   r^   ”   s   2r^   c                   @   s.   e Zd Zeee dœdd„Zedœdd„ZdS )ÚHttp10Readerr7   c                 C   s    |  d¡}|d krd S t|d�S )NiÿÉš;rQ   )rS   r   rU   r0   r0   r1   rV   Ö   s    
zHttp10Reader.__call__rW   c                 C   s   t ƒ S rL   )r   rY   r0   r0   r1   rZ   Ü   s    zHttp10Reader.read_eofN)	r[   r\   r]   r   r   r   rV   r   rZ   r0   r0   r0   r1   rj   Õ   s   rj   c                 C   s   | rt dƒ‚d S )NzGot data when expecting EOF)r   )r8   r0   r0   r1   Úexpect_nothingà   s    rk   .)Ú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@   rF   rI   rJ   ri   r^   rj   rk   ÚstrZReadersTyper"   Ú__annotations__r0   r0   r0   r1   Ú<module>   sl    ,(

þþA"ÿÿ         ýö