o
    çûõj~›  ã                   @   sî  U 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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mZ d dlmZmZm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$ dd
l%m&Z&m'Z' ddl(m)Z) ddl*m+Z+ ddl,m-Z-m.Z.m/Z/ dZ0ee1df Z2e3e1e1f Z4e3e1e1e1f Z5e3de6e5f Z7dZ8e5e9d< dj:Z;dj:Z<dZ=eƒ Z>dZ?dZ@dZAdZBdZCdZDeEdƒZFeGdƒZHG dd„ de
jIƒZJG dd„ de&ƒZKG d d!„ d!eKƒZLG d"d#„ d#e&ƒZMdS )$é    N)Údefaultdict)ÚIterableÚIteratorÚMappingÚSequence)Ú
BaseCookieÚMorselÚSimpleCookie©ÚMappingProxyType)ÚUnionÚcast)ÚURLé   )Ú_COOKIE_CTL_REÚ_encoded_lengthÚparse_set_cookie_headersÚ preserve_morsel_with_coded_value)ÚAbstractCookieJarÚClearCookiePredicate)Úis_ip_address)Úinternal_logger)ÚLooseCookiesÚPathLikeÚStrOrURL)Ú	CookieJarÚDummyCookieJarúMorsel[str])Ú r   r   Ú_UNLIMITED_COOKIE_KEYz{}/{}z{1}.{0}éd   é´   é–   iä  é¸  iþ  s   Cookie: )úmax-ageÚexpiresc                       sP   e Zd ZU dZeh d£ƒZeeeef  ed< dedede	f‡ fdd„Z
‡  ZS )	Ú_RestrictedCookieUnpicklera@  A restricted unpickler that only allows cookie-related types.

    This prevents arbitrary code execution when loading pickled cookie data
    from untrusted sources. Only types that are expected in a serialized
    CookieJar are permitted.

    Subclasses :class:`pickle._Unpickler` (the pure-Python implementation)
    rather than :class:`pickle.Unpickler` because the accelerated unpickler
    on some implementations (notably PyPy) does not dispatch through
    :meth:`find_class` overrides.

    See: https://docs.python.org/3/library/pickle.html#restricting-globals
    >   ©ÚbuiltinsÚset©r(   Údict©r(   Útuple©r(   Ú	frozenset©Úcollectionsr   ©úhttp.cookiesr   ©r3   r	   Ú_ALLOWED_CLASSESÚmoduleÚnameÚreturnc                    s4   ||f| j vrt d|› d|› d�¡‚tƒ  ||¡S )NzForbidden class: Ú.z‡. CookieJar.load() only allows cookie-related types for security. See https://docs.python.org/3/library/pickle.html#restricting-globals)r5   ÚpickleÚUnpicklingErrorÚsuperÚ
find_class)Úselfr6   r7   ©Ú	__class__© úD/opt/steambot/venv/lib/python3.10/site-packages/aiohttp/cookiejar.pyr=   b   s
   ÿz%_RestrictedCookieUnpickler.find_class)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r/   r5   r-   ÚstrÚ__annotations__Útyper=   Ú__classcell__rA   rA   r?   rB   r&   D   s   
 ÿ"r&   c                       s¸  e Zd ZdZdZe d¡Ze d¡Ze d¡Z	e dej
¡Ze d¡Zeejjjejjd� ¡ ƒd	 Zz
e e e¡¡ W n eyK   e d
¡ZY n eyU   dZY nw ed	 Zdddddœdededeee B dB dej dB ddf
‡ fdd„Z!e"defdd„ƒZ#e"defdd„ƒZ$e"de%e& fdd„ƒZ'e"de(e)e*e*f e+f fdd„ƒZ,e"de%e)e*e*e*f  fdd„ƒZ-d e.ddfd!d"„Z/d e.ddfd#d$„Z0dld%d&„Z1dmd(d)„Z2d*e3e*e3e*e3e*e*eB e4B f f f ddfd+d,„Z5dnd-e6dB ddfd.d/„Z7d0e*ddfd1d2„Z8dod4d5„Z9defd6d7„Z:dpd8d9„Z;d:e<e= ddfd;d<„Z>d0e*d=edefd>d?„Z?dpd@dA„Z@dBe4d0e*dCe*dDe*ddf
dEdF„ZAe&ƒ fdGeBdHe&ddfdIdJ„ZCdKeDe* dHe&ddfdLdM„ZEdddNœdGeBdHe&dOedPe4dB dQeddfdRdS„ZFe&ƒ fdTe&ddUfdVdW„ZGdXe3e*eHf dYe*ddUfdZd[„ZIeJd\eKe* defd]d^„ƒZLd_eMdDe*d\eKe* deHfd`da„ZNdbeDe= ddfdcdd„ZOd\eKe* deKe* fdedf„ZPeJd0e*dYe*defdgdh„ƒZQeRdie*dedB fdjdk„ƒZS‡  ZTS )qr   z/Implements cookie storage adhering to RFC 6265.Tz][\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}))Útzinfor   )	r#   é   é   é   é;   rO   éÿÿÿÿrP   rP   iÿÿÿFN©ÚunsafeÚquote_cookieÚtreat_as_secure_originÚlooprR   rS   rT   rU   r8   c                   sÀ   t ƒ j|d� ttƒ| _ttƒ| _tƒ | _|| _	|| _
|d u r$tƒ | _n(t|tƒr2t| ¡ hƒ| _nt|tƒrBtt|ƒ ¡ hƒ| _n
tdd„ |D ƒƒ| _g | _i | _i | _d| _i | _d| _d S )N©rU   c                 S   s*   h | ]}t |tƒrt|ƒ ¡ n| ¡ ’qS rA   )Ú
isinstancerG   r   Úorigin)Ú.0ÚurlrA   rA   rB   Ú	<setcomp>­   s    ÿÿz%CookieJar.__init__.<locals>.<setcomp>r   )r<   Ú__init__r   r	   Ú_cookiesr+   Ú_morsel_cacher)   Ú_host_only_cookiesÚ_unsafeÚ_quote_cookier/   Ú_treat_as_secure_originrW   r   rX   rG   Ú_expire_heapÚ_expirationsÚ_access_generationsÚ_next_access_generationÚ_domain_countsÚ_cookie_count)r>   rR   rS   rT   rU   r?   rA   rB   r\   ’   s6   
ÿ


ÿþÿ
zCookieJar.__init__c                 C   ó   | j S ©N)r`   ©r>   rA   rA   rB   rR   ¹   ó   zCookieJar.unsafec                 C   ri   rj   )ra   rk   rA   rA   rB   rS   ½   rl   zCookieJar.quote_cookiec                 C   ri   )zAReturn origins considered secure even over cleartext connections.)rb   rk   rA   rA   rB   rT   Á   ó   z CookieJar.treat_as_secure_originc                 C   ó
   t | jƒS )z&Return the cookies stored in this jar.)r   r]   rk   rA   rA   rB   ÚcookiesÆ   ó   
zCookieJar.cookiesc                 C   rn   )z0Return the host-only cookies stored in this jar.)r/   r_   rk   rA   rA   rB   Úhost_only_cookiesË   rp   zCookieJar.host_only_cookiesÚ	file_pathc                 C   s  t  |¡}i }| j ¡ D ][\\}}}|› d|› �}i ||< | ¡ D ]E\}}|j|j|jdœ}	|jD ]}
|
tv r8q1||
 }|rB||	|
< q1|||f| j	v rOd|	d< | j
 |||f¡ }dur`||	d< |	|| |< q!qt|ddd	d
„ d��}tj||dd� W d  ƒ dS 1 s†w   Y  dS )z¸Save cookies to a file using JSON format.

        :param file_path: Path to file where cookies will be serialized,
            :class:`str` or :class:`pathlib.Path` instance.
        ú|©ÚkeyÚvalueÚcoded_valueTÚ	host_onlyNÚexpires_timestampÚwúutf-8c                 S   s   t  | |d¡S )Ni€  )ÚosÚopen)ÚpathÚflagsrA   rA   rB   Ú<lambda>ö   s    z CookieJar.save.<locals>.<lambda>)ÚmodeÚencodingÚopeneré   )Úindent)ÚpathlibÚPathr]   Úitemsru   rv   rw   Ú	_reservedÚ_RELATIVE_EXPIRY_ATTRSr_   rd   Úgetr}   ÚjsonÚdump)r>   rr   ÚdataÚdomainr~   Úcookieru   r7   ÚmorselÚmorsel_dataÚattrÚattr_valÚexpÚfrA   rA   rB   ÚsaveÐ   s@   
ý
€îü"úzCookieJar.savec              
   C   s  t  |¡}z|jddd��}t |¡}W d  ƒ n1 sw   Y  W n tjttfy0   Y nw |  |¡ dS |jdd��}t	|ƒ ¡ }W d  ƒ n1 sOw   Y  |  
¡ }| ¡ D ]%\\}}}|rktjd|d�ntƒ }	| ¡ D ]\}
}|j|
|i|	d	d
� qrq\|  |¡ dS )a)  Load cookies from a file.

        Tries to load JSON format first. Falls back to loading legacy
        pickle format (using a restricted unpickler) for backward
        compatibility with existing cookie files.

        Replaces the current jar contents; loaded cookies pass through the
        same acceptance rules as :meth:`update_cookies`. A malformed file
        raises and leaves the jar unchanged.

        :param file_path: Path to file from where cookies will be
            imported, :class:`str` or :class:`pathlib.Path` instance.
        Úrr{   )r�   r‚   NÚrb)r�   Úhttps©ÚschemeÚhostF©Úcopy_morsels)r†   r‡   r}   rŒ   ÚloadÚJSONDecodeErrorÚUnicodeDecodeErrorÚ
ValueErrorÚ_load_json_datar&   Ú_new_loading_jarrˆ   r   ÚbuildÚ_update_cookiesÚ_replace_contents)r>   rr   r–   rŽ   ÚpickledÚloadedr�   Ú_ro   Úresponse_urlr7   r‘   rA   rA   rB   r    ú   s*   
ÿ€ÿ
ÿÿzCookieJar.loadc                 C   s   t | j| j| j| jd�S )NrQ   )r   r`   ra   rb   Ú_looprk   rA   rA   rB   r¥     s   üzCookieJar._new_loading_jarrª   c                 C   s2   | j }| ¡  | |j ¡ | j |j¡ || _ d S rj   )r]   ÚclearÚupdateÚ__dict__)r>   rª   ro   rA   rA   rB   r¨   $  s
   
zCookieJar._replace_contentsrŽ   c                 C   sB  |   ¡ }| ¡ D ]‘\}}| dd¡\}}| ¡ D ]€\}}d}	| d¡ }
durRzt|
ƒ}	t |	¡s5t|	ƒ‚W n tt	tfyQ } ztd|›d|›d�ƒ|‚d}~ww t
ƒ }| |d |d	 |d
 dœ¡ |jD ]}||v rw|dvrw|| ||< qg| d¡r�d|d< |rŠtjd|d�ntƒ }|j||i|d|	d� qq|  |¡ dS )z<Replace contents, routing cookies through _update_cookies().rs   r   Nry   zCookie z in z.: expiration timestamp must be a finite numberru   rv   rw   rt   rx   r   r�   rš   r›   F)rŸ   Ú
expiration)r¥   rˆ   Úsplitr‹   ÚfloatÚmathÚisfiniter£   ÚOverflowErrorÚ	TypeErrorr   Ú__setstate__r‰   r   r¦   r§   r¨   )r>   rŽ   rª   Úcompound_keyÚcookie_datar�   r~   r7   r’   r±   Úraw_expirationÚexcr‘   r“   r¬   rA   rA   rB   r¤   ,  sT   
ÿÿý€ÿýÿ
€
ÿüÜ*zCookieJar._load_json_dataÚ	predicatec                    s”   ˆd u r,ˆj  ¡  ˆj ¡  ˆj ¡  ˆj ¡  ˆj ¡  ˆj ¡  ˆj ¡  dˆ_d S t	 	¡ ‰‡ ‡‡‡fdd„ˆj 
¡ D ƒ}|rHˆ |¡ d S d S )Nr   c                    sT   g | ]&\\}}}|  ¡ D ]\}}|||f ‰ ˆjv r!ˆjˆ  ˆks%ˆ|ƒrˆ ‘qqS rA   )rˆ   rd   )rY   r�   r~   r�   r7   r‘   ©ru   Únowr½   r>   rA   rB   Ú
<listcomp>n  s    
ýþûz#CookieJar.clear.<locals>.<listcomp>)rc   r®   r]   r^   r_   rd   re   rg   rh   Útimerˆ   Ú_delete_cookies)r>   r½   Úto_delrA   r¾   rB   r®   a  s"   






þ
ÿzCookieJar.clearr�   c                    s   ˆ  ‡ ‡fdd„¡ d S )Nc                    s   ˆ  ˆ | d ¡S )Nr�   )Ú_is_domain_match)Úx©r�   r>   rA   rB   r€   |  s    z(CookieJar.clear_domain.<locals>.<lambda>)r®   ©r>   r�   rA   rÆ   rB   Úclear_domain{  s   zCookieJar.clear_domainúIterator[Morsel[str]]c                 c   s,   � |   ¡  | j ¡ D ]	}| ¡ E d H  q
d S rj   )Ú_do_expirationr]   Úvalues)r>   ÚvalrA   rA   rB   Ú__iter__~  s
   €ÿzCookieJar.__iter__c                 C   ri   )zReturn number of cookies.

        This function does not iterate self to avoid unnecessary expiration
        checks.
        )rh   rk   rA   rA   rB   Ú__len__ƒ  s   zCookieJar.__len__c                    sº   t ˆ jƒ }s	dS |tkr'|t ˆ jƒd kr'‡ fdd„ˆ jD ƒˆ _t ˆ j¡ t ¡ }g }ˆ jrRˆ jd \}}||kr<nt ˆ j¡ ˆ j |¡|krO| 	|¡ ˆ js0|r[ˆ  
|¡ dS dS )zRemove expired cookies.Nr„   c                    s(   g | ]}ˆ j  |d  ¡|d kr|‘qS )r   r   )rd   r‹   ©rY   Úentryrk   rA   rB   rÀ   �  s
    þz,CookieJar._do_expiration.<locals>.<listcomp>r   )Úlenrc   Ú _MIN_SCHEDULED_COOKIE_EXPIRATIONrd   ÚheapqÚheapifyrÁ   Úheappopr‹   ÚappendrÂ   )r>   Úexpire_heap_lenr¿   rÃ   ÚwhenÚ
cookie_keyrA   rk   rB   rÊ   ‹  s*   
þ
öÿzCookieJar._do_expirationrÃ   c           
      C   sÞ   |D ]j\}}}|||f}||f}| j  |¡ | j |¡ }d urH| |d ¡d urB|  jd8  _| j| d  }r>|| j|< n| j|= |sH| j|= | j |¡ }	d ur^|	 |d ¡ |	s^| j|= | j |d ¡ | j	 |d ¡ qd S )Nr   )
r_   Údiscardr]   r‹   Úpoprh   rg   r^   rd   re   )
r>   rÃ   r�   r~   r7   rÙ   Újar_keyro   Údomain_countÚmorselsrA   rA   rB   rÂ   ¶  s&   
îzCookieJar._delete_cookiesÚsecurec                 C   s  | j  |d¡tkr‡|  ¡  | j  |d¡}|t d  }dkr dS g }g }| j ¡ D ]-\\}}}	||kr4q)|	 ¡ D ]\}
}|||
f}| j |d¡|f}|d rP|n| |¡ q8q)| }sg|tk radS |sedS |}| 	¡  |d|… }|  
dd„ |D ƒ¡ t d	t|ƒ|t¡ dS |  ¡  dS )
a  Evict for a new cookie like Firefox; False drops the new cookie.

        Mirrors AddCookie and FindStaleCookies: expired, then non-secure,
        cookies go first, least recently used first; secure cookies are only
        evicted for another secure cookie.
        r   r   Trß   FNc                 S   s   g | ]\}}|‘qS rA   rA   )rY   r«   ru   rA   rA   rB   rÀ   é  ó    z(CookieJar._make_room.<locals>.<listcomp>z;Evicted %d cookie(s) for %s over the %d-cookie domain limit)rg   r‹   Ú_MAX_COOKIES_PER_DOMAINrÊ   Ú_COOKIE_QUOTA_PER_DOMAINr]   rˆ   re   rÖ   ÚsortrÂ   r   ÚdebugrÑ   Ú_purge_cookies)r>   r�   rß   ÚcountÚexcessÚ
non_secureÚsecure_keysÚcookie_domainr~   ro   r7   r�   rÙ   rÐ   Ú
candidatesÚevictedrA   rA   rB   Ú
_make_roomË  sB   
ýüÿzCookieJar._make_roomc                 C   sR   |   ¡  | jt  }dkrdS | j}|  t||jd�d|… ¡ t d|t	¡ dS )zCEvict expired, then least recently used, cookies down to the total.r   N)ru   z3Evicted %d cookie(s) over the %d-cookie total limit)
rÊ   rh   Ú_COOKIE_QUOTA_TOTALre   rÂ   ÚsortedÚ__getitem__r   rä   Ú_MAX_COOKIES_TOTAL)r>   rç   ÚgenerationsrA   rA   rB   rå   ô  s   ýzCookieJar._purge_cookiesrØ   r~   r7   c                 C   s>   |||f}| j  |¡|krd S t | j||f¡ || j |< d S rj   )rd   r‹   rÓ   Úheappushrc   )r>   rØ   r�   r~   r7   rÙ   rA   rA   rB   Ú_expire_cookie  s
   
zCookieJar._expire_cookiero   r¬   c                 C   s   | j ||dd� dS )zUpdate cookies.Trž   N)r§   ©r>   ro   r¬   rA   rA   rB   Úupdate_cookies	  s   zCookieJar.update_cookiesÚheadersc                 C   sF   |j }| jst|ƒrdS |rt|ƒ }r!| j||ddd� dS dS dS )z+Update cookies from raw Set-Cookie headers.NF)rŸ   Úcheck_sendable)Úraw_hostr`   r   r   r§   )r>   r÷   r¬   ÚhostnameÚcookies_to_updaterA   rA   rB   Úupdate_cookies_from_headers  s   
üüz%CookieJar.update_cookies_from_headers)r±   rø   rŸ   r±   rø   c             	   C   s’  |j }| jst|ƒrd S t|tƒr| ¡ }|D �]ª\}}t|tƒs-tƒ }	||	|< |	| }n	|r6td| 	¡ ƒ}|d }
|
rG|
d dkrGd}
|d= |
rY|
d dkrY|
dd … }
|
|d< |
rd|rd|  
|
|¡sdq|d }|rp|d d	krŠ|j}| d	¡s{d	}nd	|d| d	¡…  }||d< | d	¡}|
sš|d uršd
}|}
nd}d }|d ur¥|}nE|d  }rÖzt|ƒ}|dkr·d}nt|| jƒ}tt ¡ | | jƒ}W n! tyÕ   d|d< Y nw |d  }rê|  |¡ }ræ|}nd|d< |rü| jrü|  |¡süt d||
¡ q|
|f}|
||f}| j |¡}|d u �rd n| |¡}|d u �rO| j�rO| j |
d¡tk�s0| jtk�rO|d u �s<|t ¡ k�rO|  |
t |d ƒ¡�sOt d||
¡ q|�r]| j! "|¡ |
|d< n| j! #|¡ |d u�rq|  $||
||¡ n| j%�r|| j% &|d ¡ ||k�r±|d u �r™|  jd7  _| j |
d¡d | j|
< || j| |< | j' |¡ }d u�r±| &|d ¡ | j�rÂ|  j(d7  _(| j(| j)|< q|  *¡  d S )Nr   r�   rP   r9   r   r   r   r~   ú/TFr$   g        r%   z=Dropped cookie %r for %s: it can't be sent in a Cookie headerrß   z>Dropped cookie %r for %s: its domain is full of Secure cookies)+rù   r`   r   rW   r   rˆ   r   r	   r   ÚcopyrÄ   r~   Ú
startswithÚrfindÚrstripÚintÚminÚMAX_TIMErÁ   r£   Ú_parse_dateÚ_limits_enabledÚ	_can_sendr   rä   r]   r‹   rg   rá   rh   rñ   rí   Úboolr_   ÚaddrÚ   rô   rd   rÛ   r^   rf   re   rÊ   )r>   ro   r¬   rŸ   r±   rø   rú   r7   r�   Útmpr�   r~   rx   ÚdeadlineÚmax_ageÚdelta_secondsr%   Úexpire_timeru   rÙ   ÚbucketÚstoredrÞ   rA   rA   rB   r§      sÀ   	




€ÿý

ÿÿý



€zCookieJar._update_cookiesÚrequest_urlúBaseCookie[str]c                 C   sÎ  t ƒ }| js|S |  ¡  | js|S t|ƒtur(tjdt|ƒ› �tdd� t|ƒ}|jp,d}|j	dv}|rX| j
rXtƒ }t t¡� | ¡ }W d  ƒ n1 sNw   Y  || j
v}i }d}|| jv r‘| j| }| j|  ¡ D ]#\}	}
|rx|
d rxqm| |	¡ }du rŒ|  ||	|
¡ }||	< |||	< qmt|ƒs¡t t| d	¡ƒt¡}n	| jr¨|f}nd
}t |j d¡t¡}t ||¡}t|jƒ}|D ]]}|dksÌ|| jvrÍqÁ| j| }| j|  ¡ D ]D\}	}
|
d }||krî||	f | jv rîqÙt|
d ƒ|kr÷qÙ|rþ|
d rþqÙ| |	¡ }du �r|  ||	|
¡ }||	< | |	d¡ |||	< qÙqÁ| j �rXt!d dt|ƒ  }|t"dd„ | #¡ D ƒƒ7 }t|ƒt$k�sF|t%k�rL|  &||¡S |  'dd„ | #¡ D ƒ¡ t( )|dd„ | ¡ D ƒ¡ |S )z8Returns this jar's cookies filtered by their attributes.zQfilter_cookies expects yarl.URL instances only,and will stop working in 4.x, got r„   )Ú
stacklevelr   )rš   ÚwssN)r   r   rß   r9   rA   rý   r�   r~   c                 s   s   � | ]}|d  V  qdS )r   NrA   rÏ   rA   rA   rB   Ú	<genexpr>  ó   € z+CookieJar.filter_cookies.<locals>.<genexpr>c                 S   s   g | ]}|d  ‘qS ©r„   rA   rÏ   rA   rA   rB   rÀ     rà   z,CookieJar.filter_cookies.<locals>.<listcomp>c                 S   s   i | ]	\}}||d  “qS )r   rA   )rY   r7   rÐ   rA   rA   rB   Ú
<dictcomp>  s    z,CookieJar.filter_cookies.<locals>.<dictcomp>)*r   r]   rÊ   rI   r   ÚwarningsÚwarnÚDeprecationWarningrù   rœ   rb   Ú
contextlibÚsuppressr£   rX   r^   rˆ   r‹   Ú_morsel_entryr   Ú	itertoolsÚ
accumulateÚreversedr²   Ú_FORMAT_DOMAIN_REVERSEDr`   r~   Ú_FORMAT_PATHÚproductrÑ   r_   rÛ   r  Ú_COOKIE_HEADER_PREFIX_LENGTHÚsumrË   Ú_MAX_COOKIES_PER_REQUESTÚ_MAX_COOKIE_HEADER_LENGTHÚ_filter_cookies_within_limitsÚ_touch_cookiesr+   r¯   )r>   r  Úfilteredrú   Úis_not_secureÚrequest_originÚselectedru   rÞ   r7   r�   rÐ   ÚdomainsÚpathsÚpairsÚpath_lenÚpr�   Úheader_lengthrA   rA   rB   Úfilter_cookies¯  sŠ   ÿü



ÿ



ÿ


î
zCookieJar.filter_cookiesr.  rú   c                 C   sÆ   t d }g }t| ¡ ƒD ]&\}}t|ƒtkr n|d |d  tkr#q|d|d  7 }| ||f¡ qtƒ }t|ƒD ]\}}t 	|||d ¡ q:|  
dd„ |D ƒ¡ t dt|ƒt|ƒ |tt¡ |S )zBAdmit the most specific cookies first so a host's own cookies win.r„   r   r   c                 S   s   g | ]\}}|d  ‘qS r  rA   )rY   r«   rÐ   rA   rA   rB   rÀ   #  s    z;CookieJar._filter_cookies_within_limits.<locals>.<listcomp>zNOmitted %d cookie(s) for %s over the %d-cookie or %d-octet Cookie header limit)r%  r!  rˆ   rÑ   r'  r(  rÖ   r   r+   Ú__setitem__r*  r   rä   )r>   r.  rú   r4  Úadmittedr7   rÐ   r+  rA   rA   rB   r)    s*   úz'CookieJar._filter_cookies_within_limitsr�   c                 C   s2   | j › d| j› | j› �}t |¡du ot|ƒduS )z<Return whether the cookie can be written to a Cookie header.ú=N)ru   rv   rw   r   Úsearchr   )r�   ÚtextrA   rA   rB   r  .  s   zCookieJar._can_sendrÜ   c                 C   s<   |   |¡}t|j› d|j› �ƒ}|dusJ ‚||||f fS )z>Build the morsel to send with its length in the Cookie header.r8  N)Ú_build_morselr   ru   rw   )r>   rÜ   r7   r�   r‘   ÚlengthrA   rA   rB   r  6  s   
zCookieJar._morsel_entryÚcookie_keysc                 C   s0   |  j d7  _ | j }| j}|D ]}|||< qdS )zERecord one access generation for cookies used together, like Firefox.r   N)rf   re   )r>   r=  Ú
generationrò   rÙ   rA   rA   rB   r*  ?  s   
ÿzCookieJar._touch_cookiesc                 C   sb   | j r|jr|jd dkrt|ƒS tƒ }| j r t |j¡\}}n|j }}| |j||dœ¡ |S )z<Build a morsel for sending, respecting quote_cookie setting.r   ú"rt   )	ra   rw   r   r   Ú_SIMPLE_COOKIEÚvalue_encoderv   r¸   ru   )r>   r�   r‘   rv   rw   rA   rA   rB   r;  G  s   
zCookieJar._build_morselc                 C   sD   || krdS |  | ¡sdS |dt| ƒ … }|  d¡sdS t|ƒ S )z0Implements domain matching adhering to RFC 6265.TFNr9   )ÚendswithrÑ   r   )r�   rú   Únon_matchingrA   rA   rB   rÄ   W  s   


zCookieJar._is_domain_matchÚdate_strc                 C   s¨  |sdS d}d}d}d}d } }}d}	d}
d}| j  |¡D ]\}| d¡}|s>| j |¡}|r>d}dd„ | ¡ D ƒ\}}}q|sQ| j |¡}|rQd}t| ¡ ƒ}	q|sh| j |¡}|rhd}|j	dusdJ ‚|j	}
q|sz| j
 |¡}|rzd}t| ¡ ƒ}qd|  kr…d	krŒn n|d
7 }nd|  kr–dkrœn n|d7 }d||||fv r¦dS d|	  kr±dks´dS  dS |dk sÄ|dksÄ|dksÄ|dkrÆdS t ||
|	|||dddf	¡S )z4Implements date string parsing adhering to RFC 6265.NFr   ÚtokenTc                 s   s   � | ]}t |ƒV  qd S rj   )r  )rY   ÚsrA   rA   rB   r  ~  r  z(CookieJar._parse_date.<locals>.<genexpr>éF   éc   il  éE   iÐ  r   rM   iA  rN   rO   rP   )ÚDATE_TOKENS_REÚfinditerÚgroupÚDATE_HMS_TIME_REÚmatchÚgroupsÚDATE_DAY_OF_MONTH_REr  ÚDATE_MONTH_REÚ	lastindexÚDATE_YEAR_REÚcalendarÚtimegm)ÚclsrD  Ú
found_timeÚ	found_dayÚfound_monthÚ
found_yearÚhourÚminuteÚsecondÚdayÚmonthÚyearÚtoken_matchrE  Ú
time_matchÚ	day_matchÚmonth_matchÚ
year_matchrA   rA   rB   r  g  sd   
€
ÿ zCookieJar._parse_date)r8   r   )rª   r   r8   Nrj   ©r8   rÉ   )r8   N)UrC   rD   rE   rF   r  ÚreÚcompilerJ  rM  rP  ÚIrQ  rS  r  ÚdatetimeÚmaxÚreplaceÚtimezoneÚutcÚ	timestampr  rT  rU  rÁ   ÚgmtimeÚOSErrorr¶   ÚSUB_MAX_TIMEr  r   r   ÚasyncioÚAbstractEventLoopr\   ÚpropertyrR   rS   r/   r   rT   r   r-   rG   r	   ro   rq   r   r—   r    r¥   r¨   r+   r³   r¤   r   r®   rÈ   rÍ   rÎ   rÊ   ÚlistÚ
_CookieKeyrÂ   rí   rå   rô   r   rö   r   rü   r§   r5  Ú_MorselEntryr)  Ústaticmethodr   r  Ú_JarKeyr  r*  r;  rÄ   Úclassmethodr  rJ   rA   rA   r?   rB   r   l   sæ    ÿ

þ
ÿþúýüûúù' *
"
"ÿ
þ5

+
)ÿÿ
þùþýûúù
ø c
ÿÿ
þÿÿÿ
þ	 r   c                   @   s2   e Zd ZdZdZdededee defdd„Z	d	S )
Ú_UnlimitedCookieJarzAJar for per-request cookies, which the jar limits don't apply to.FrÜ   r7   r�   r8   c                 C   s   |   |¡dtfS ©Nr   )r;  r   )r>   rÜ   r7   r�   rA   rA   rB   r  ¬  s   z!_UnlimitedCookieJar._morsel_entryN)
rC   rD   rE   rF   r  rz  rG   r   rx  r  rA   rA   rA   rB   r|  §  s    ÿÿÿþr|  c                       s&  e Zd ZdZddœdejdB ddf‡ fdd„Zd&d	d
„Zdefdd„Z	e
defdd„ƒZe
defdd„ƒZe
deeeef ef fdd„ƒZe
deeeeef  fdd„ƒZd'dedB ddfdd„Zdeddfdd„Zeƒ fdededdfdd„Zdee deddfd d!„Zd"edd#fd$d%„Z‡  ZS )(r   zxImplements a dummy cookie storage.

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

    NrV   rU   r8   c                   s   t ƒ j|d� d S )NrV   )r<   r\   )r>   rU   r?   rA   rB   r\   »  s   zDummyCookieJar.__init__rÉ   c                 c   s   � d S rj   rA   rk   rA   rA   rB   rÍ   ¾  s   €zDummyCookieJar.__iter__c                 C   ó   dS r}  rA   rk   rA   rA   rB   rÎ   Â  ó   zDummyCookieJar.__len__c                 C   r~  )NFrA   rk   rA   rA   rB   rR   Å  ó   zDummyCookieJar.unsafec                 C   r~  )NTrA   rk   rA   rA   rB   rS   É  r€  zDummyCookieJar.quote_cookiec                 C   s   t i ƒS )zReturn an empty mapping.r
   rk   rA   rA   rB   ro   Í  s   zDummyCookieJar.cookiesc                 C   ó   t ƒ S )zReturn an empty frozenset.)r/   rk   rA   rA   rB   rq   Ò  rm   z DummyCookieJar.host_only_cookiesr½   c                 C   ó   d S rj   rA   )r>   r½   rA   rA   rB   r®   ×  r  zDummyCookieJar.clearr�   c                 C   r‚  rj   rA   rÇ   rA   rA   rB   rÈ   Ú  r  zDummyCookieJar.clear_domainro   r¬   c                 C   r‚  rj   rA   rõ   rA   rA   rB   rö   Ý  r  zDummyCookieJar.update_cookiesr÷   c                 C   r~  )z2Ignore raw Set-Cookie fields without parsing them.NrA   )r>   r÷   r¬   rA   rA   rB   rü   à  s    z*DummyCookieJar.update_cookies_from_headersr  r  c                 C   r�  rj   )r	   )r>   r  rA   rA   rB   r5  å  s   zDummyCookieJar.filter_cookiesrf  rj   )rC   rD   rE   rF   rs  rt  r\   rÍ   r  rÎ   ru  r  rR   rS   r   r-   rG   r	   ro   r/   rq   r   r®   rÈ   r   r   rö   r   rü   r5  rJ   rA   rA   r?   rB   r   ´  s0    "
 ÿÿ
þr   )Nrs  rT  r  rj  rÓ   r  rŒ   r´   r|   r†   r:   rg  rÁ   r  r1   r   Úcollections.abcr   r   r   r   Úhttp.cookiesr   r   r	   Útypesr   Útypingr   r   Úyarlr   Ú_cookie_helpersr   r   r   r   Úabcr   r   Úhelpersr   Úlogr   Útypedefsr   r   r   Ú__all__rG   Ú
CookieItemr-   rz  rw  r  rx  r   rH   Úformatr#  r"  rÒ   r@  rá   râ   rñ   rî   r'  r(  rÑ   r%  r/   rŠ   Ú
_Unpicklerr&   r   r|  r   rA   rA   rA   rB   Ú<module>   sj   
 (      A