U
    nËj›  ã                   @  sf   d dl mZ d dlZd dlmZmZ d dlmZmZm	Z	 d dl
mZmZmZmZ dZG dd„ dƒZdS )	é    )ÚannotationsN)ÚURLÚHeaders)ÚPlainTextResponseÚRedirectResponseÚResponse)ÚASGIAppÚReceiveÚScopeÚSendz6Domain wildcard patterns must be like '*.example.com'.c                   @  s6   e Zd Zddddddœdd	„Zd
ddddœdd„ZdS )ÚTrustedHostMiddlewareNTr   ztyping.Sequence[str] | NoneÚboolÚNone)ÚappÚallowed_hostsÚwww_redirectÚreturnc                 C  sx   |d krdg}|D ]@}d|dd … ks.t tƒ‚| d¡r|dkr| d¡st tƒ‚q|| _t|ƒ| _d|k| _|| _d S )NÚ*é   z*.)ÚAssertionErrorÚENFORCE_DOMAIN_WILDCARDÚ
startswithr   Úlistr   Ú	allow_anyr   )Úselfr   r   r   Úpattern© r   úD/tmp/pip-unpacked-wheel-pzfrzqh9/starlette/middleware/trustedhost.pyÚ__init__   s    

zTrustedHostMiddleware.__init__r
   r	   r   )ÚscopeÚreceiveÚsendr   c                 Ã  s  | j s|d dkr*|  |||¡I d H  d S t|d�}| dd¡ d¡d }d}d}| jD ]B}||ks€| d	¡rŠ| |d
d … ¡rŠd} qœqXd| |krXd}qX|r¶|  |||¡I d H  nT|rì| jrìt	|d�}	|	j
d|	j d�}
tt|
ƒd�}ntddd�}||||ƒI d H  d S )NÚtype)ÚhttpZ	websocket)r   ÚhostÚ ú:r   Fr   r   Tzwww.)Únetloc)ÚurlzInvalid host headeri�  )Ústatus_code)r   r   r   ÚgetÚsplitr   r   Úendswithr   r   Úreplacer'   r   Ústrr   )r   r   r    r!   Úheadersr$   Zis_valid_hostZfound_www_redirectr   r(   Zredirect_urlÚresponser   r   r   Ú__call__   s*    

$

zTrustedHostMiddleware.__call__)NT)Ú__name__Ú
__module__Ú__qualname__r   r1   r   r   r   r   r      s     ür   )Ú
__future__r   ÚtypingZstarlette.datastructuresr   r   Zstarlette.responsesr   r   r   Zstarlette.typesr   r	   r
   r   r   r   r   r   r   r   Ú<module>   s   