U
    nËjî  ã                   @  sŠ   d dl mZ 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 )
é    )ÚannotationsN)Ú	b64decodeÚ	b64encode)ÚBadSignature)ÚMutableHeadersÚSecret)ÚHTTPConnection)ÚASGIAppÚMessageÚReceiveÚScopeÚSendc                   @  s@   e Zd Zdddd	d
d	dddddœ	dd„Zdddddœdd„ZdS )ÚSessionMiddlewareÚsessioné u ú/ÚlaxFNr	   zstr | SecretÚstrz
int | Nonez)typing.Literal[('lax', 'strict', 'none')]Úboolz
str | NoneÚ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TimestampSignerr   Úsignerr   r   r   Úsecurity_flags)	Úselfr   r   r   r   r   r   r   r   © r#   úA/tmp/pip-unpacked-wheel-pzfrzqh9/starlette/middleware/sessions.pyÚ__init__   s    
zSessionMiddleware.__init__r   r   r   )Ú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 q¢X ni ˆd< dd	d
œ‡ ‡‡‡fdd„}ˆ  ˆ||¡I d H  d S )NÚtype)ÚhttpZ	websocketTúutf-8)r   r   Fr
   r   )Úmessager   c                 “  sÊ   | d dkr¸ˆd r„t t ˆd ¡ d¡ƒ}ˆj |¡}t| d�}djˆj| 	d¡ˆj
ˆjrjdˆj› d�nd	ˆjd
�}| d|¡ n4ˆ s¸t| 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_wrapper9   s0    
û
ûz0SessionMiddleware.__call__.<locals>.send_wrapper)r   r   r   Úcookiesr3   r    Zunsignr   r1   Úloadsr   r   )r"   r&   r'   r(   Ú
connectionr.   r;   r#   r:   r$   Ú__call__&   s     zSessionMiddleware.__call__)r   r   r   r   FN)Ú__name__Ú
__module__Ú__qualname__r%   r?   r#   r#   r#   r$   r      s         ÷ r   )Ú
__future__r   r1   ÚtypingÚ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   