U
    nËj®  ã                   @   sv   d dl Z d dlZd dlZd dlmZmZ d dlmZmZm	Z	m
Z
mZ G dd„ dƒZG dd„ dƒZeejdœd	d
„ZdS )é    N)ÚHeadersÚMutableHeaders)ÚASGIAppÚMessageÚReceiveÚScopeÚSendc                   @   s6   e Zd Zd
eeeddœdd„Zeeeddœdd	„Z	dS )ÚGZipMiddlewareéô  é	   N©ÚappÚminimum_sizeÚcompresslevelÚreturnc                 C   s   || _ || _|| _d S ©N)r   r   r   ©Úselfr   r   r   © r   ú=/tmp/pip-unpacked-wheel-pzfrzqh9/starlette/middleware/gzip.pyÚ__init__
   s    zGZipMiddleware.__init__©ÚscopeÚreceiveÚsendr   c                 Ã   sh   |d dkrPt |d�}d| dd¡krPt| j| j| jd�}||||ƒI d H  d S |  |||¡I d H  d S )NÚtypeÚhttp)r   ÚgzipúAccept-EncodingÚ )r   )r   ÚgetÚGZipResponderr   r   r   )r   r   r   r   ÚheadersZ	responderr   r   r   Ú__call__   s    
zGZipMiddleware.__call__)r
   r   )
Ú__name__Ú
__module__Ú__qualname__r   Úintr   r   r   r   r#   r   r   r   r   r	   	   s   r	   c                   @   sF   e Zd Zdeeeddœdd„Zeeeddœdd„Z	e
dd	œd
d„ZdS )r!   r   Nr   c                 C   sF   || _ || _t| _i | _d| _d| _t ¡ | _	t
jd| j	|d�| _d S )NFÚwb)ÚmodeÚfileobjr   )r   r   Úunattached_sendr   Úinitial_messageÚstartedÚcontent_encoding_setÚioÚBytesIOÚgzip_bufferr   ÚGzipFileÚ	gzip_filer   r   r   r   r      s    
zGZipResponder.__init__r   c              
   Ã   sD   || _ | j�. | j� |  ||| j¡I d H  W 5 Q R X W 5 Q R X d S r   )r   r1   r3   r   Úsend_with_gzip)r   r   r   r   r   r   r   r#   $   s    zGZipResponder.__call__©Úmessager   c                 Ã   sP  |d }|dkr4|| _ t| j d d�}d|k| _�n|dkrt| jrt| js`d| _|  | j ¡I d H  |  |¡I d H  �nØ|dk�rÚ| j�sÚd| _| dd	¡}| d
d¡}t|ƒ| jk rÚ|sÚ|  | j ¡I d H  |  |¡I d H  nþ|�s^| j 	|¡ | j 
¡  | j ¡ }t| j d d�}d|d< tt|ƒƒ|d< | d¡ ||d< |  | j ¡I d H  |  |¡I d H  nzt| j d d�}d|d< | d¡ |d= | j 	|¡ | j ¡ |d< | j d¡ | j ¡  |  | j ¡I d H  |  |¡I d H  nr|dk�rL| dd	¡}| d
d¡}| j 	|¡ |�s| j 
¡  | j ¡ |d< | j d¡ | j ¡  |  |¡I d H  d S )Nr   zhttp.response.startr"   )Úrawzcontent-encodingzhttp.response.bodyTÚbodyó    Ú	more_bodyFr   zContent-EncodingzContent-Lengthr   r   )r,   r   r.   r-   r   r    Úlenr   r3   ÚwriteÚcloser1   Úgetvaluer   ÚstrZadd_vary_headerÚseekÚtruncate)r   r6   Zmessage_typer"   r8   r:   r   r   r   r4   )   s`    







zGZipResponder.send_with_gzip)r   )r$   r%   r&   r   r'   r   r   r   r   r#   r   r4   r   r   r   r   r!      s   
r!   r5   c                 Ã   s   t dƒ‚d S )Nzsend awaitable not set)ÚRuntimeError)r6   r   r   r   r+   k   s    r+   )r   r/   ÚtypingZstarlette.datastructuresr   r   Zstarlette.typesr   r   r   r   r   r	   r!   ÚNoReturnr+   r   r   r   r   Ú<module>   s   R