U
    e                     @   s~   d dl Z d dlZd dlmZmZ d dlZd dlmZ d dlm	Z	m
Z
 d dlmZ d dlmZmZmZmZmZ G dd dZdS )	    N)	b64decode	b64encode)BadSignature)MutableHeadersSecret)HTTPConnection)ASGIAppMessageReceiveScopeSendc                   @   s\   e Zd Zdeejeef eeje	 eej
d eeje dd	d	d
ZeeeddddZdS )SessionMiddlewaresession u /laxFN)r   strictnone)	app
secret_keysession_cookiemax_agepath	same_site
https_onlydomainreturnc	           	      C   sd   || _ tt|| _|| _|| _|| _d| | _|rD|  jd7  _|d k	r`|  jd| 7  _d S )Nzhttponly; samesite=z; securez	; domain=)	r   itsdangerousZTimestampSignerstrsignerr   r   r   security_flags)	selfr   r   r   r   r   r   r   r    r"   A/tmp/pip-unpacked-wheel-2mv5qoba/starlette/middleware/sessions.py__init__   s    
zSessionMiddleware.__init__)scopereceivesendr   c                    s   d dkr$ |I d H  d S t}d j|jkr|jj d}z,jj|jd}t	t
|d< d W q tk
r   i d< Y qX ni d< td d fd	d
} ||I d H  d S )Ntype)httpZ	websocketTutf-8)r   r   F)messager   c                    s   | d dkrd rt td d}j|}t| d}djj|	dj
jrjdj dnd	jd
}|d| n4 st| d}djjdj
djd}|d| | I d H  d S )Nr(   zhttp.response.startr   r*   )r%   z?{session_cookie}={data}; path={path}; {max_age}{security_flags}zMax-Age=z;  )r   datar   r   r    z
Set-Cookiez?{session_cookie}={data}; path={path}; {expires}{security_flags}nullz'expires=Thu, 01 Jan 1970 00:00:00 GMT; )r   r-   r   expiresr    )r   jsondumpsencoder   signr   formatr   decoder   r   r    append)r+   r-   headersheader_valueZinitial_session_was_emptyr%   r!   r'   r"   r#   send_wrapper7   s0    

z0SessionMiddleware.__call__.<locals>.send_wrapper)r   r   r   cookiesr2   r   Zunsignr   r0   loadsr   r   r	   )r!   r%   r&   r'   
connectionr-   r:   r"   r9   r#   __call__$   s     zSessionMiddleware.__call__)r   r   r   r   FN)__name__
__module____qualname__r   typingUnionr   r   OptionalintLiteralboolr$   r   r
   r   r>   r"   r"   r"   r#   r      s$         r   )r0   rB   base64r   r   r   Zitsdangerous.excr   Zstarlette.datastructuresr   r   Zstarlette.requestsr   Zstarlette.typesr   r	   r
   r   r   r   r"   r"   r"   r#   <module>   s   