U
    Ê¼µbr  ã                   @   sö   d dl Z ddlmZ ddlmZmZ ddlmZmZm	Z	m
Z
mZ dgZde j  kr\dk rjn n
d	d
„ Zndd
„ Zdd„ Zdd„ Zdd„ ZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZee	feee	feee
feeeeedœiZdS )é    Né   ©ÚLocalProtocolError)ÚDataÚEndOfMessage)ÚCLIENTÚSERVERÚIDLEÚSEND_RESPONSEÚ	SEND_BODYÚWRITERS)é   r   )r   é   c                 C   sL   g }|D ]*}t |tƒr(| | d¡¡ q| |¡ q|  d¡t|ƒ  d¡S )NÚascii)Ú
isinstanceÚbytesÚappendÚdecodeÚtupleÚencode)ÚbstrÚvaluesZdecoded_valuesÚvalue© r   ú0/tmp/pip-unpacked-wheel-rko__zic/h11/_writers.pyÚbytesmod   s    
r   c                 C   s   | | S ©Nr   )r   r   r   r   r   r      s    c                 C   s\   | D ]"\}}|dkr|t d||fƒƒ q| D ]"\}}|dkr,|t d||fƒƒ q,|dƒ d S )Ns   hosts   %s: %s
ó   
)r   )ÚheadersÚwriteÚnamer   r   r   r   Úwrite_headers    s    r!   c                 C   s8   | j dkrtdƒ‚|td| j| jfƒƒ t| j|ƒ d S )Nó   1.1úI only send HTTP/1.1s   %s %s HTTP/1.1
)Úhttp_versionr   r   ÚmethodÚtargetr!   r   )Úrequestr   r   r   r   Úwrite_request,   s    
r(   c                 C   sF   | j dkrtdƒ‚t| jƒ d¡}|td|| jfƒƒ t| j|ƒ d S )Nr"   r#   r   s   HTTP/1.1 %s %s
)	r$   r   ÚstrÚstatus_coder   r   Úreasonr!   r   )Úresponser   Zstatus_bytesr   r   r   Úwrite_any_response3   s
    
	r-   c                   @   s   e Zd Zdd„ ZdS )Ú
BodyWriterc                 C   sD   t |ƒtkr|  |j|¡ n$t |ƒtkr8|  |j|¡ nds@t‚d S )NF)Útyper   Ú	send_dataÚdatar   Úsend_eomr   ÚAssertionError)ÚselfÚeventr   r   r   r   Ú__call__C   s
    zBodyWriter.__call__N)Ú__name__Ú
__module__Ú__qualname__r6   r   r   r   r   r.   B   s   r.   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚContentLengthWriterc                 C   s
   || _ d S r   )Ú_length)r4   Úlengthr   r   r   Ú__init__R   s    zContentLengthWriter.__init__c                 C   s0   |  j t|ƒ8  _ | j dk r$tdƒ‚||ƒ d S )Nr   z)Too much data for declared Content-Length)r;   Úlenr   ©r4   r1   r   r   r   r   r0   U   s    
ÿzContentLengthWriter.send_datac                 C   s"   | j dkrtdƒ‚|rtdƒ‚d S )Nr   z+Too little data for declared Content-Lengthz%Content-Length and trailers don't mix)r;   r   ©r4   r   r   r   r   r   r2   \   s    
ÿzContentLengthWriter.send_eomN)r7   r8   r9   r=   r0   r2   r   r   r   r   r:   Q   s   r:   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚChunkedWriterc                 C   s0   |sd S |t dt|ƒfƒƒ ||ƒ |dƒ d S )Ns   %x
r   )r   r>   r?   r   r   r   r0   d   s
    zChunkedWriter.send_datac                 C   s   |dƒ t ||ƒ d S )Ns   0
)r!   r@   r   r   r   r2   m   s    zChunkedWriter.send_eomN©r7   r8   r9   r0   r2   r   r   r   r   rA   c   s   	rA   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚHttp10Writerc                 C   s   ||ƒ d S r   r   r?   r   r   r   r0   r   s    zHttp10Writer.send_datac                 C   s   |rt dƒ‚d S )Nz&can't send trailers to HTTP/1.0 clientr   r@   r   r   r   r2   u   s    ÿzHttp10Writer.send_eomNrB   r   r   r   r   rC   q   s   rC   )Úchunkedzcontent-lengthzhttp/1.0)ÚsysZ_utilr   Z_eventsr   r   Ú_stater   r   r	   r
   r   Ú__all__Úversion_infor   r!   r(   r-   Úobjectr.   r:   rA   rC   r   r   r   r   r   Ú<module>
   s4   
	   ýü