B
    indW5                 @   s   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
mZmZ d dlmZmZmZmZmZmZmZmZmZmZmZ d dlmZ ddlmZmZ ddlmZm Z  dd	l!m"Z"m#Z#m$Z$ d
Z%ee&df Z'G dd deZ(G dd deZ)dS )    N)defaultdict)
BaseCookieMorselSimpleCookie)DefaultDictDictIterableIteratorListMappingOptionalSetTupleUnioncast)URL   )AbstractCookieJarClearCookiePredicate)is_ip_addressnext_whole_second)LooseCookiesPathLikeStrOrURL)	CookieJarDummyCookieJarzMorsel[str]c                   s  e Zd ZdZedZedZedZedej	Z
edZejjjejjdZejdZd	d
dddeeeeee df eej dd fddZeddddZeddddZd6ee ddddZ e!ddddZ"ddddZ#e$ddd Z%ddd!d"Z&eje!e!e!dd#d$d%Z'e( fe)e(dd&d'd(Z*e( fe(ed) d*d+d,Z+e,e!e!ed-d.d/Z-e,e!e!ed0d1d2Z.e/e!eej d3d4d5Z0  Z1S )7r   z/Implements cookie storage adhering to RFC 6265.z][\x09\x20-\x2F\x3B-\x40\x5B-\x60\x7B-\x7E]*(?P<token>[\x00-\x08\x0A-\x1F\d:a-zA-Z\x7F-\xFF]+)z(\d{1,2}):(\d{1,2}):(\d{1,2})z	(\d{1,2})zG(jan)|(feb)|(mar)|(apr)|(may)|(jun)|(jul)|(aug)|(sep)|(oct)|(nov)|(dec)z	(\d{2,4}))tzinfoiFTN)unsafequote_cookietreat_as_secure_originloop)r   r   r   r    returnc               s   t  j|d tt| _t | _|| _|| _|d kr:g }n>t	|t
rP| g}n(t	|trjt
| g}ndd |D }|| _t | _i | _| j| _y| j  W n tk
r   | j| _Y nX d S )N)r    c             S   s*   g | ]"}t |trt| n| qS  )
isinstancestrr   origin).0urlr"   r"   5/tmp/pip-unpacked-wheel-fdo6ttx3/aiohttp/cookiejar.py
<listcomp>R   s   z&CookieJar.__init__.<locals>.<listcomp>)super__init__r   r   _cookiesset_host_only_cookies_unsafe_quote_cookier#   r   r%   r$   _treat_as_secure_originr   _next_expiration_expirationsMAX_TIME	_max_time	timestampOverflowErrorMAX_32BIT_TIME)selfr   r   r   r    )	__class__r"   r(   r+   ;   s,    

zCookieJar.__init__)	file_pathr!   c          	   C   s8   t |}|jdd}t| j|tj W d Q R X d S )Nwb)mode)pathlibPathopenpickledumpr,   HIGHEST_PROTOCOL)r9   r;   fr"   r"   r(   save_   s    
zCookieJar.savec          	   C   s2   t |}|jdd}t|| _W d Q R X d S )Nrb)r=   )r>   r?   r@   rA   loadr,   )r9   r;   rD   r"   r"   r(   rG   d   s    
zCookieJar.load)	predicater!   c             C   s^  |d kr2t  | _| j  | j  | j  d S g }tjtjj	}xd| j
 D ]V\\}}}xH|
 D ]<\}}|||f}	|	| jkr| j|	 |ks||rh||	 qhW qRW xZ|D ]R\}}}| j||f |||f}	|	| jkr| j|||f= | j||f |d  qW t| j | jd}
y|
jddtjdd | _W n tk
rX   | j| _Y nX d S )N)defaultr   )microsecondr   )seconds)r   r2   r,   clearr.   r3   datetimenowtimezoneutcitemsappenddiscardpopminvaluesr5   replace	timedeltar7   )r9   rH   Zto_delrN   domainpathcookienamemorselkeyZnext_expirationr"   r"   r(   rL   i   s6    





zCookieJar.clear)rY   r!   c                s     fdd d S )Nc                s     | d S )NrY   )_is_domain_match)x)rY   r9   r"   r(   <lambda>       z(CookieJar.clear_domain.<locals>.<lambda>)rL   )r9   rY   r"   )rY   r9   r(   clear_domain   s    zCookieJar.clear_domainzIterator[Morsel[str]])r!   c             c   s.   |    x | j D ]}| E d H  qW d S )N)_do_expirationr,   rV   )r9   valr"   r"   r(   __iter__   s    zCookieJar.__iter__c             C   s   t dd | D S )Nc             s   s   | ]
}d V  qdS )r   Nr"   )r&   ir"   r"   r(   	<genexpr>   s    z$CookieJar.__len__.<locals>.<genexpr>)sum)r9   r"   r"   r(   __len__   s    zCookieJar.__len__c             C   s   |  dd  d S )Nc             S   s   dS )NFr"   )r`   r"   r"   r(   ra      rb   z*CookieJar._do_expiration.<locals>.<lambda>)rL   )r9   r"   r"   r(   rd      s    zCookieJar._do_expiration)whenrY   rZ   r\   r!   c             C   s"   t | j|| _|| j|||f< d S )N)rU   r2   r3   )r9   rk   rY   rZ   r\   r"   r"   r(   _expire_cookie   s    zCookieJar._expire_cookie)cookiesresponse_urlr!   c          	   C   s   |j }| jst|rdS t|tr*| }x|D ]\}}t|ts\t }|||< || }|d }|drxd}|d= |s|dk	r| j	
||f | }|d< |dr|dd }||d< |r| ||sq2|d }|r|ds|j}|dsd}nd|d|d  }||d< |d }	|	ryZt|	}
y tjtjjtj|
d	 }W n tk
rp   | j}Y nX | |||| W n tk
r   d|d< Y nX n8|d
 }|r| |}|r| |||| nd|d
< || j||f |< q2W |   dS )zUpdate cookies.NrY   . r   rZ   /zmax-age)rK   expires)raw_hostr/   r   r#   r   rQ   r   r   endswithr.   add
startswithr_   rZ   rfindintrM   rN   rO   rP   rX   r7   r5   rl   
ValueError_parse_dater,   rd   )r9   rm   rn   hostnamer\   r[   tmprY   rZ   Zmax_ageZdelta_secondsZmax_age_expirationrr   expire_timer"   r"   r(   update_cookies   sd    





zCookieJar.update_cookies)zBaseCookie[str]zSimpleCookie[str])request_urlr!   c       
   	   C   s   |    t|}| jrt nt }|jp*d}t }tt |	 }W dQ R X |j
dkob|| jk}x| D ]}|j}|d }|s|j||< qj| jst|rqj||f| jkr||krqjn| ||sqj| |j|d sqj|r|d rqjtd||jt }	|	|j|j|j |	||< qjW |S )z8Returns this jar's cookies filtered by their attributes.rp   N)httpswssrY   rZ   securezMorsel[str])rd   r   r0   r   r   rs   
contextlibsuppressry   r%   schemer1   r^   valuer/   r   r.   r_   _is_path_matchrZ   r   getr   r-   coded_value)
r9   r   filteredr{   Zrequest_originZis_not_securer[   r\   rY   Zmrsl_valr"   r"   r(   filter_cookies   s<    




zCookieJar.filter_cookies)rY   r{   r!   c             C   sD   || krdS | | sdS |dt|   }| ds:dS t| S )z0Implements domain matching adhering to RFC 6265.TFNro   )rt   lenr   )rY   r{   non_matchingr"   r"   r(   r_     s    

zCookieJar._is_domain_match)req_pathcookie_pathr!   c             C   sP   |  dsd} | |krdS |  |s(dS |dr6dS | t|d }| dS )z.Implements path matching adhering to RFC 6265.rq   TFN)rv   rt   r   )r   r   r   r"   r"   r(   r   .  s    


zCookieJar._is_path_match)date_strr!   c          	   C   s  |sdS d}d}d}d}d } }}d}	d}
d}x| j |D ]}|d}|s~| j|}|r~d}dd | D \}}}q>|s| j|}|rd}t| }	q>|s| j|}|rd}|j	dk	st
|j	}
q>|s>| j|}|r>d}t| }q>W d|  krd	kr n n
|d
7 }n$d|  kr8dkrDn n|d7 }d||||fkrZdS d|	  krrdksxn dS |dk s|dks|dks|dkrdS tj||
|	|||tjjdS )z4Implements date string parsing adhering to RFC 6265.NFr   tokenTc             s   s   | ]}t |V  qd S )N)rx   )r&   sr"   r"   r(   rh   Y  s    z(CookieJar._parse_date.<locals>.<genexpr>F   c   il  E   i  r      iA     ;   )r   )DATE_TOKENS_REfinditergroupDATE_HMS_TIME_REmatchgroupsDATE_DAY_OF_MONTH_RErx   DATE_MONTH_RE	lastindexAssertionErrorDATE_YEAR_RErM   rO   rP   )clsr   Z
found_timeZ	found_dayZfound_monthZ
found_yearhourminuteseconddaymonthyearZtoken_matchr   Z
time_matchZ	day_matchZmonth_matchZ
year_matchr"   r"   r(   rz   A  s`    

(zCookieJar._parse_date)N)2__name__
__module____qualname____doc__recompiler   r   r   Ir   r   rM   maxrW   rO   rP   r4   utcfromtimestampr8   boolr   r   r
   r   asyncioAbstractEventLoopr+   r   rE   rG   r   rL   r$   rc   rf   rx   rj   rd   rl   r   r   r~   r   staticmethodr_   r   classmethodrz   __classcell__r"   r"   )r:   r(   r   $   sD   


"!
N1r   c                   s   e Zd ZdZddeej dd fddZddd	d
Ze	dddZ
dee ddddZeddddZe feeddddZeddddZ  ZS )r   zxImplements a dummy cookie storage.

    It can be used with the ClientSession when no cookie processing is needed.

    N)r    )r    r!   c               s   t  j|d d S )N)r    )r*   r+   )r9   r    )r:   r"   r(   r+     s    zDummyCookieJar.__init__zIterator[Morsel[str]])r!   c             c   s   d S )Nr"   )r9   r"   r"   r(   rf     s    zDummyCookieJar.__iter__c             C   s   dS )Nr   r"   )r9   r"   r"   r(   rj     s    zDummyCookieJar.__len__)rH   r!   c             C   s   d S )Nr"   )r9   rH   r"   r"   r(   rL     s    zDummyCookieJar.clear)rY   r!   c             C   s   d S )Nr"   )r9   rY   r"   r"   r(   rc     s    zDummyCookieJar.clear_domain)rm   rn   r!   c             C   s   d S )Nr"   )r9   rm   rn   r"   r"   r(   r~     s    zDummyCookieJar.update_cookieszBaseCookie[str])r   r!   c             C   s   t  S )N)r   )r9   r   r"   r"   r(   r     s    zDummyCookieJar.filter_cookies)N)r   r   r   r   r   r   r   r+   rf   rx   rj   r   rL   r$   rc   r   r   r~   r   r   r"   r"   )r:   r(   r     s    r   )*r   r   rM   osr>   rA   r   collectionsr   http.cookiesr   r   r   typingr   r   r   r	   r
   r   r   r   r   r   r   Zyarlr   abcr   r   Zhelpersr   r   Ztypedefsr   r   r   __all__r$   Z
CookieItemr   r   r"   r"   r"   r(   <module>   s&   4  b