a
    ze#,                    @   s  g d 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Zdadd ZeejjZdZdd	 Zd
Zdd Zg dZg dZg ZeD ]Zee  qddddZ deddZ!dddddZ"e#dej$Z%dd Z&dd Z'e#dej$Z(e#dej)ej$B Z*e#dej+ej$B Z,dd Z-e#dej+ej$B Z.dd  Z/d!d" Z0e#d#Z1e#d$Z2e#d%Z3e#d&Z4d'd( Z5e#d)Z6d*d+ Z7d,d- Z8d.d/ Z9e#d0ej$Z:d1d2 Z;d3d4 Z<d5d6 Z=d7d8 Z>e#d9ej$Z?d:d; Z@d<d= ZAd>d? ZBd@dA ZCdBZDe#dCZEdDdE ZFdFdG ZGdHdI ZHdJdK ZIG dLdM dMZJG dNdO dOZKG dPdQ dQeKZLdRdS ZMdTdU ZNG dVdW dWZOG dXdY dYZPG dZd[ d[eQZRG d\d] d]ePZSd^d_ ZTG d`da daeSZUG dbdc dceSZVdS )f)Cookie	CookieJarCookiePolicyDefaultCookiePolicyFileCookieJarLWPCookieJar	LoadErrorMozillaCookieJar    N)timegmFc                  G   s(   t sd S tsdd l}|datj |  S )Nr	   zhttp.cookiejar)debugloggerlogging	getLogger)argsr    r   $/usr/lib/python3.9/http/cookiejar.py_debug,   s    
r   zQa filename was not supplied (nor was the CookieJar instance initialised with one)c                  C   sJ   dd l } dd l}dd l}|  }|d | | }|jd| dd d S )Nr	   zhttp.cookiejar bug!
%s   )
stacklevel)iowarnings	tracebackStringIO	print_excgetvaluewarn)r   r   r   fmsgr   r   r   _warn_unhandled_exception:   s
    r   i  c                 C   s   | d d \}}}}}}|t krd|  kr4dkrn nhd|  krLdkrn nPd|  krddkrn n8d|  kr|dkrn n d|  krdkrn nt| S d S d S )	N            r	      ;   =   )
EPOCH_YEARr
   )ttyearmonthZmdayhourminsecr   r   r   _timegmI   s     8


r-   )ZMonZTueZWedZThuZFriZSatZSun)ZJanZFebZMarZAprZMayZJunZJulZAugZSepZOctZNovZDecc                 C   s@   | d u rt j  }nt j | }d|j|j|j|j|j|jf S )Nz%04d-%02d-%02d %02d:%02d:%02dZ)	datetimeutcnowutcfromtimestampr(   r)   dayr*   minutesecondtZdtr   r   r   	time2isozW   s    r6   c                 C   sR   | d u rt j  }nt j | }dt|  |jt|jd  |j|j	|j
|jf S )Nz#%s, %02d-%s-%04d %02d:%02d:%02d GMTr    )r.   r/   r0   DAYSZweekdayr1   MONTHSr)   r(   r*   r2   r3   r4   r   r   r   time2netscapej   s    r9   )ZGMTUTCZUTZz^([-+])?(\d\d?):?(\d\d)?$c                 C   sj   d }| t v rd}nTt| }|rfdt|d }|drR|dt|d  }|ddkrf| }|S )Nr	   i  r      <   r    -)	UTC_ZONESTIMEZONE_REsearchintgroup)tzoffsetmr   r   r   offset_from_tz_string   s    

rG   c                 C   s  t |}|tjkrd S zt| d }W nZ ty   zt |}W n ty\   Y Y d S 0 d|  krrdkr|n n|}nY d S Y n0 |d u rd}|d u rd}|d u rd}t | } t |}t |}t |}|dk r2tt d }|d }	|}
|| |	 }|	|
 }	t	|	dkr2|	dkr*|d }n|d }t
||| ||||f}|d ur|d u r`d}| }t|}|d u r~d S || }|S )Nr    r!   r	   i  d   2   r:   )rB   r.   ZMAXYEARMONTHS_LOWERindexlower
ValueErrortime	localtimeabsr-   upperrG   )r1   monyrhrr+   r,   rD   ZimonZcur_yrrF   tmpr5   rE   r   r   r   	_str2time   sN    





rV   zV^[SMTWF][a-z][a-z], (\d\d) ([JFMASOND][a-z][a-z]) (\d\d\d\d) (\d\d):(\d\d):(\d\d) GMT$z+^(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)[a-z]*,?\s*a  ^
    (\d\d?)            # day
       (?:\s+|[-\/])
    (\w+)              # month
        (?:\s+|[-\/])
    (\d+)              # year
    (?:
          (?:\s+|:)    # separator before clock
       (\d\d?):(\d\d)  # hour:min
       (?::(\d\d))?    # optional seconds
    )?                 # optional clock
       \s*
    (?:
       ([-+]?\d{2,4}|(?![APap][Mm]\b)[A-Za-z]+) # timezone
       \s*
    )?
    (?:
       \(\w+\)         # ASCII representation of timezone in parens.
       \s*
    )?$c                 C   s   t | }|rl| }t|d  d }t|d |t|d t|d t|d t|d f}t|S | 	 } t
d| d} d gd \}}}}}}	}
t| }|d ur| \}}}}}}	}
nd S t||||||	|
S )	Nr    r   r	   r<             )STRICT_DATE_RErA   groupsrJ   rK   rL   rB   floatr-   lstrip
WEEKDAY_REsubLOOSE_HTTP_DATE_RErV   )textrF   grR   r'   r1   rS   rT   r+   r,   rD   r   r   r   	http2time   s     

rd   a  ^
    (\d{4})              # year
       [-\/]?
    (\d\d?)              # numerical month
       [-\/]?
    (\d\d?)              # day
   (?:
         (?:\s+|[-:Tt])  # separator before clock
      (\d\d?):?(\d\d)    # hour:min
      (?::?(\d\d(?:\.\d*)?))?  # optional seconds (and fractional)
   )?                    # optional clock
      \s*
   (?:
      ([-+]?\d\d?:?(:?\d\d)?
       |Z|z)             # timezone  (Z is "zero meridian", i.e. GMT)
      \s*
   )?$c           
      C   sd   |   } d gd \}}}}}}}t| }|d urL| \}}}}}}}}	nd S t|||||||S )NrZ   )r^   ISO_DATE_RErA   r\   rV   )
rb   r1   rR   rS   rT   r+   r,   rD   rF   _r   r   r   iso2time+  s    
rg   c                 C   s*   |  d\}}| jd | | j|d   S )Nr	   )spanstring)matchstartendr   r   r   	unmatchedL  s    rm   z^\s*([^=\s;,]+)z&^\s*=\s*\"([^\"\\]*(?:\\.[^\"\\]*)*)\"z^\s*=\s*([^\s;,]*)z\\(.)c           
      C   s  g }| D ]}|}g }|rt |}|rt|}|d}t|}|rft|}|d}td|}n.t|}|rt|}|d}| }nd }|	||f q|
 dr|
 dd  }|r|	| g }qtdd|\}}	|}q|r|	| q|S )Nr    z\1,z^[=\s;]*rY   )HEADER_TOKEN_RErA   rm   rC   HEADER_QUOTED_VALUE_REHEADER_ESCAPE_REr`   HEADER_VALUE_RErstripappendr^   
startswithresubn)
Zheader_valuesresultrb   Z	orig_textpairsrF   namevalueZnon_junkZnr_junk_charsr   r   r   split_header_wordsU  s:    .






r|   ([\"\\])c                 C   s|   g }| D ]h}g }|D ]F\}}|d urPt d|sDtd|}d| }d||f }|| q|r|d| qd|S )Nz^\w+$\\\1z"%s"%s=%s; , )rv   rA   HEADER_JOIN_ESCAPE_REr`   rt   join)Zlistsheadersry   attrkvr   r   r   join_header_words  s    r   c                 C   s0   |  dr| dd  } | dr,| d d } | S )N"r    )ru   endswithrb   r   r   r   strip_quotes  s
    

r   c                 C   s   d}g }| D ]}g }d}t |dD ]\}}| }|d\}}	}
| }|sb|dkr& qnq&|	rn|
 nd }
|dkr| }||v r|}|dkr|
d urt|
}
d}n|dkr|
d urtt|
}
|||
f q&|r|s|d	 || q|S )
N)expiresdomainpathsecureversionportmax-ageF;=r	   r   Tr   )r   0)	enumeratesplitstrip	partitionrL   r   rd   rt   )Z
ns_headersZknown_attrsrx   Z	ns_headerry   version_setiiZparamkeysepvallcr   r   r   parse_ns_headers  s>    
r   z\.\d+$c                 C   s:   t | rdS | dkrdS | d dks2| d dkr6dS dS )NFrY   r	   .r   TIPV4_RErA   r   r   r   r   is_HDN  s    
r   c                 C   sl   |   } |  }| |krdS t| s(dS | |}|dksB|dkrFdS |dsTdS t|dd  shdS dS )NTFr   r	   r   r    )rL   r   rfindru   )ABir   r   r   domain_match  s    

r   c                 C   s   t | rdS dS NFTr   r   r   r   r   liberal_is_HDNF  s    
r   c                 C   s`   |   } |  }t| r t|s0| |kr,dS dS |d}|rL| |rLdS |s\| |kr\dS dS )NTFr   )rL   r   ru   r   )r   r   initial_dotr   r   r   user_domain_matchP  s    
r   z:\d+$c                 C   sB   |   }tj|d }|dkr,| dd}td|d}| S )Nr    rY   ZHost)get_full_urlurllibparseurlparseZ
get_headercut_port_rer`   rL   )requesturlhostr   r   r   request_hoste  s    r   c                 C   s4   t |  }}|ddkr,t|s,|d }||fS )Nr   r   .local)r   findr   rA   )r   erhnreq_hostr   r   r   eff_request_hostu  s    r   c                 C   s4   |   }tj|}t|j}|ds0d| }|S )N/)r   r   r   urlsplitescape_pathr   ru   )r   r   partsr   r   r   r   request_path  s    

r   c                 C   s^   | j }|d}|dkrV||d d  }zt| W qZ tyR   td| Y d S 0 nt}|S )N:r	   r    znonnumeric port: '%s')r   r   rB   rM   r   DEFAULT_HTTP_PORT)r   r   r   r   r   r   r   request_port  s    


r   z%/;:@&=+$,!~*'()z%([0-9a-fA-F][0-9a-fA-F])c                 C   s   d|  d  S )Nz%%%sr    )rC   rQ   )rj   r   r   r   uppercase_escaped_char  s    r   c                 C   s   t j| t} tt| } | S N)r   r   quoteHTTP_PATH_SAFEESCAPED_CHAR_REr`   r   )r   r   r   r   r     s    
r   c                 C   sP   |  d}|dkrL| |d d  }| d}t| rL|dksD|dkrLd| S | S )Nr   r	   r    local)r   r   )hr   br   r   r   reach  s    

r   c                 C   s$   t | }t|t| jsdS dS d S NTF)r   r   r   Zorigin_req_host)r   r   r   r   r   is_third_party  s    
r   c                   @   sJ   e Zd ZdddZdd ZdddZd	d
 ZdddZdd Zdd Z	dS )r   Fc                 C   s   |d urt |}|d ur$t t|}|d u r<|du r<td|| _|| _|| _|| _|| _| | _	|| _
|| _|	| _|
| _|| _|| _|| _|| _|| _|| _t|| _d S )NTz-if port is None, port_specified must be false)rB   r]   rM   r   rz   r{   r   port_specifiedrL   r   domain_specifieddomain_initial_dotr   path_specifiedr   r   discardcommentcomment_urlrfc2109copy_rest)selfr   rz   r{   r   r   r   r   r   r   r   r   r   r   r   r   restr   r   r   r   __init__  s*    
zCookie.__init__c                 C   s
   || j v S r   r   )r   rz   r   r   r   has_nonstandard_attr  s    zCookie.has_nonstandard_attrNc                 C   s   | j ||S r   )r   get)r   rz   defaultr   r   r   get_nonstandard_attr  s    zCookie.get_nonstandard_attrc                 C   s   || j |< d S r   r   )r   rz   r{   r   r   r   set_nonstandard_attr   s    zCookie.set_nonstandard_attrc                 C   s,   |d u rt   }| jd ur(| j|kr(dS dS r   )rN   r   )r   nowr   r   r   
is_expired#  s    zCookie.is_expiredc                 C   sX   | j d u rd}n
d| j  }| j| | j }| jd urFd| j| jf }n| j}d||f S )NrY   r   r   z<Cookie %s for %s>)r   r   r   r{   rz   )r   plimitZ	namevaluer   r   r   __str__)  s    

zCookie.__str__c                 C   sl   g }dD ]$}t | |}|d|t|f  q|dt| j  |dt| j  d| jjd|f S )N)r   rz   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   zrest=%sz
rfc2109=%sz%s(%s)r   )getattrrt   reprr   r   	__class____name__r   )r   r   rz   r   r   r   r   __repr__3  s    
zCookie.__repr__)F)N)N)
r   
__module____qualname__r   r   r   r   r   r   r   r   r   r   r   r     s    
*


r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
r   c                 C   s
   t  d S r   NotImplementedErrorr   cookier   r   r   r   set_okK  s    zCookiePolicy.set_okc                 C   s
   t  d S r   r   r   r   r   r   	return_okT  s    zCookiePolicy.return_okc                 C   s   dS NTr   )r   r   r   r   r   r   domain_return_okX  s    zCookiePolicy.domain_return_okc                 C   s   dS r   r   )r   r   r   r   r   r   path_return_ok]  s    zCookiePolicy.path_return_okN)r   r   r   r   r   r   r   r   r   r   r   r   B  s   		r   c                   @   s   e Zd ZdZdZdZdZeeB Zdddddddddedddfd	d
Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 ZdS )7r   r    r   rW   r	   NTF)httpswssc                 C   sv   || _ || _|| _|| _|| _|| _|	| _|
| _|| _|| _	|| _
|d urVt|| _nd| _|d urlt|}|| _d S )Nr   )netscaperfc2965rfc2109_as_netscapehide_cookie2strict_domainstrict_rfc2965_unverifiablestrict_ns_unverifiablestrict_ns_domainstrict_ns_set_initial_dollarstrict_ns_set_pathsecure_protocolstuple_blocked_domains_allowed_domains)r   blocked_domainsallowed_domainsr   r   r   r   r   r   r  r  r  r  r  r   r   r   r   m  s"    zDefaultCookiePolicy.__init__c                 C   s   | j S r   )r  r   r   r   r   r	    s    z#DefaultCookiePolicy.blocked_domainsc                 C   s   t || _d S r   )r  r  )r   r	  r   r   r   set_blocked_domains  s    z'DefaultCookiePolicy.set_blocked_domainsc                 C   s    | j D ]}t||r dS qdS r   )r  r   )r   r   Zblocked_domainr   r   r   
is_blocked  s    

zDefaultCookiePolicy.is_blockedc                 C   s   | j S r   )r  r  r   r   r   r
    s    z#DefaultCookiePolicy.allowed_domainsc                 C   s   |d urt |}|| _d S r   )r  r  )r   r
  r   r   r   set_allowed_domains  s    z'DefaultCookiePolicy.set_allowed_domainsc                 C   s.   | j d u rdS | j D ]}t||r dS qdS r   )r  r   )r   r   Zallowed_domainr   r   r   is_not_allowed  s    


z"DefaultCookiePolicy.is_not_allowedc                 C   s@   t d|j|j dD ]&}d| }t| |}|||s dS qdS )N - checking cookie %s=%s)r   verifiabilityrz   r   r   r   Zset_ok_FTr   rz   r{   r   r   r   r   nZfn_namefnr   r   r   r     s    

zDefaultCookiePolicy.set_okc                 C   sZ   |j d u rtd|j|j dS |j dkr:| js:td dS |j dkrV| jsVtd dS dS )Nz0   Set-Cookie2 without version attribute (%s=%s)Fr	   $   RFC 2965 cookies are switched off$   Netscape cookies are switched offT)r   r   rz   r{   r   r   r   r   r   r   set_ok_version  s    
z"DefaultCookiePolicy.set_ok_versionc                 C   sJ   |j rFt|rF|jdkr*| jr*td dS |jdkrF| jrFtd dS dS Nr	   z>   third-party RFC 2965 cookie during unverifiable transactionFz>   third-party Netscape cookie during unverifiable transactionTZunverifiabler   r   r   r   r  r   r   r   r   set_ok_verifiability  s    z(DefaultCookiePolicy.set_ok_verifiabilityc                 C   s0   |j dkr,| jr,|jdr,td|j dS dS )Nr	   $z'   illegal name (starts with '$'): '%s'FT)r   r  rz   ru   r   r   r   r   r   set_ok_name  s    
zDefaultCookiePolicy.set_ok_namec                 C   sL   |j rHt|}|jdks(|jdkrH| jrH| |j|sHtd|j| dS dS )Nr	   z7   path attribute %s is not a prefix of request path %sFT)r   r   r   r  r   r   r   )r   r   r   req_pathr   r   r   set_ok_path  s    
zDefaultCookiePolicy.set_ok_pathc                 C   s  |  |jrtd|j dS | |jr8td|j dS |jrt|\}}|j}| jr|ddkr|d}|dd|}|dkr||d d  }||d | }	|		 dv rt
|dkrtd	| dS |dr|dd  }
n|}
|
ddk}|s|d
krtd| dS |jdkrX||sX|dsXd| |sXtd|| dS |jdksr| j| j@ rt||std|| dS |jdks| j| j@ r|d t
|  }|ddkrt|std|| dS dS )N"   domain %s is in user block-listF&   domain %s is not in user allow-listr   r   r	   r    )coZacZcomZeduZorgZnetZgovZmilrB   ZaeroZbizcatZcoopinfoZjobsZmobiZmuseumrz   ZproZtraveleuz&   country-code second level domain %sr   z/   non-local domain %s contains no embedded dotzO   effective request-host %s (even with added initial dot) does not end with %sz5   effective request-host %s does not domain-match %sz.   host prefix %s for domain %s contains a dotT)r  r   r   r  r   r   r   countr   rL   lenru   r   r   r   r  DomainRFC2965Matchr   DomainStrictNoDotsr   rA   )r   r   r   r   r   r   r   jZtldZsldZundotted_domainZembedded_dotsZhost_prefixr   r   r   set_ok_domain  sv    





z!DefaultCookiePolicy.set_ok_domainc              	   C   s   |j rt|}|d u rd}nt|}|jdD ]>}zt| W n  ty`   td| Y  dS 0 ||kr0 qq0td||j dS dS )N80rn   z   bad port %s (not numeric)Fz$   request port (%s) not found in %sT)r   r   strr   r   rB   rM   r   r   r   r   Zreq_portr   r   r   r   set_ok_port+  s$    

zDefaultCookiePolicy.set_ok_portc                 C   s@   t d|j|j dD ]&}d| }t| |}|||s dS qdS )Nr  )r   r  r   r   r   r   Z
return_ok_FTr  r  r   r   r   r   @  s    	

zDefaultCookiePolicy.return_okc                 C   s<   |j dkr| jstd dS |j dkr8| js8td dS dS )Nr	   r  Fr  T)r   r   r   r   r   r   r   r   return_ok_versionR  s    z%DefaultCookiePolicy.return_ok_versionc                 C   sJ   |j rFt|rF|jdkr*| jr*td dS |jdkrF| jrFtd dS dS r  r  r   r   r   r   return_ok_verifiability[  s    z+DefaultCookiePolicy.return_ok_verifiabilityc                 C   s"   |j r|j| jvrtd dS dS )Nz(   secure cookie with non-secure requestFT)r   typer  r   r   r   r   r   return_ok_secureg  s    z$DefaultCookiePolicy.return_ok_securec                 C   s   | | jrtd dS dS )Nz   cookie expiredFT)r   _nowr   r   r   r   r   return_ok_expiresm  s    z%DefaultCookiePolicy.return_ok_expiresc                 C   sN   |j rJt|}|d u rd}|j dD ]}||kr& qJq&td||j  dS dS )Nr,  rn   z0   request port %s does not match cookie port %sFT)r   r   r   r   r.  r   r   r   return_ok_ports  s    z"DefaultCookiePolicy.return_ok_portc                 C   s   t |\}}|j}|r*|ds*d| }n|}|jdkr^| j| j@ r^|js^||kr^td dS |jdkrt||std|| dS |jdkrd| 	|std|| dS dS )Nr   r	   zQ   cookie with unspecified domain does not string-compare equal to request domainFzQ   effective request-host name %s does not domain-match RFC 2965 cookie domain %sz;   request-host %s does not match Netscape cookie domain %sT)
r   r   ru   r   r  DomainStrictNonDomainr   r   r   r   )r   r   r   r   r   r   	dotdomainr   r   r   return_ok_domain  s2    


z$DefaultCookiePolicy.return_ok_domainc                 C   s   t |\}}|dsd| }|ds0d| }|rH|dsHd| }n|}||sd||sddS | |r|td| dS | |rtd| dS dS )Nr   Fr   r!  T)r   ru   r   r  r   r  )r   r   r   r   r   r8  r   r   r   r     s"    






z$DefaultCookiePolicy.domain_return_okc                 C   sb   t d| t|}t|}||kr&dS ||rR|dsN|||d  dkrRdS t d|| dS )Nz- checking cookie path=%sTr   r    z  %s does not path-match %sF)r   r   r'  ru   r   )r   r   r   r  pathlenr   r   r   r     s    

z"DefaultCookiePolicy.path_return_ok)r   r   r   r)  r7  r(  ZDomainLiberalZDomainStrictr   r	  r  r  r
  r  r  r   r  r  r  r  r+  r/  r   r0  r1  r3  r5  r6  r9  r   r   r   r   r   r   r   c  sN   
#	;	r   c                 C   s   t |  }t| j|S r   )sortedkeysmapr   )Zadictr<  r   r   r   vals_sorted_by_key  s    r>  c              	   c   sT   t | }|D ]B}d} z
|j W n ty0   Y n0 d} t|E d H  | s|V  qd S r   )r>  itemsAttributeError
deepvalues)mappingvaluesobjr   r   r   rA    s    
rA  c                   @   s   e Zd ZdS )AbsentNr   r   r   r   r   r   r   rE        rE  c                   @   s   e Zd ZedZedZedZedZedZ	edej
Zd2dd	Zd
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd3d$d%Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Z dS )4r   z\Wr}   z\.?[^.]*z[^.]*z^\.+z^\#LWP-Cookies-(\d+\.\d+)Nc                 C   s(   |d u rt  }|| _t | _i | _d S r   )r   _policy
_threadingRLock_cookies_lock_cookiesr   policyr   r   r   r     s
    
zCookieJar.__init__c                 C   s
   || _ d S r   )rH  rM  r   r   r   
set_policy  s    zCookieJar.set_policyc                 C   s   g }| j ||sg S td| | j| }| D ]T}| j ||sFq2|| }| D ].}| j ||srtd qVtd || qVq2|S )Nz!Checking %s for cookies to returnz   not returning cookiez   it's a match)	rH  r   r   rL  r<  r   rC  r   rt   )r   r   r   cookiesZcookies_by_pathr   Zcookies_by_namer   r   r   r   _cookies_for_domain  s     

zCookieJar._cookies_for_domainc                 C   s*   g }| j  D ]}|| || q|S r   )rL  r<  extendrQ  )r   r   rP  r   r   r   r   _cookies_for_request  s    zCookieJar._cookies_for_requestc           	      C   s<  |j dd dd d}g }|D ]}|j}|sHd}|dkrH|d|  |jd urz| j|jrz|dkrz| jd|j}n|j}|jd u r||j n|d	|j|f  |dkr|j	r|d
|j
  |jdr|j}|js|dr|dd  }|d|  |jd urd}|jr,|d|j  }|| q|S )Nc                 S   s
   t | jS r   )r'  r   )ar   r   r   <lambda>  rG  z)CookieJar._cookie_attrs.<locals>.<lambda>T)r   reverseFr	   z$Version=%sr~   r   z
$Path="%s"r   r    z$Domain="%s"z$Portz="%s")sortr   rt   r{   non_word_rerA   quote_rer`   rz   r   r   r   ru   r   r   r   )	r   rP  r   attrsr   r   r{   r   r   r   r   r   _cookie_attrs  sF    




zCookieJar._cookie_attrsc                 C   s   t d | j  ztt  | j_| _| |}| |}|r^|	ds^|
dd| | jjr| jjs|	ds|D ]}|jdkr||
dd  qq|W | j  n| j  0 |   d S )Nadd_cookie_headerr   r   ZCookie2r    z$Version="1")r   rK  acquirerB   rN   rH  r4  rS  r[  Z
has_headerZadd_unredirected_headerr   r   r   r   releaseclear_expired_cookies)r   r   rP  rZ  r   r   r   r   r\  I  s(    





zCookieJar.add_cookie_headerc              
   C   s  g }d}d}|D ]x}|d \}}d}d}	i }
i }|dd  D ].\}}|  }||v s`||v rd|}||v rx|d u rxd}||
v rq>|dkr|d u rtd d}	 qp|  }|d	kr|rq>|d u rtd
 q>|dkrd}zt|}W n( ty   td d}	Y  qpY n0 d	}| j| }||v s2||v rf|d u r\|dvr\td|  d}	 qp||
|< q>|||< q>|	rxq||||
|f q|S )N)r   r   )r   r   r   r   r   r   r   
commenturlr	   Fr    Tr   z%   missing value for domain attributer   zM   missing or invalid value for expires attribute: treating as session cookier   z?   missing or invalid (non-numeric) value for max-age attribute)r   r   r`  z!   missing value for %s attribute)rL   r   rB   rM   r4  rt   )r   	attrs_setcookie_tuplesboolean_attrsvalue_attrsZcookie_attrsrz   r{   Zmax_age_setZ
bad_cookiestandardr   r   r   r   r   r   r   _normalized_cookie_tuplesj  sh    






z#CookieJar._normalized_cookie_tuplesc                 C   s"  |\}}}}| dt}| dt}| dt}	| dt}
| dd }|d urrzt|}W n typ   Y d S 0 | dd}| dd}| d	d }| d
d }|tur|dkrd}t|}nXd}t|}|d}|dkr|dkr|d | }n|d |d  }t|dkrd}|tu}d}|r8t|	d}|tu rTt
|\}}|}n|	dshd| }d}|	tur|	d u rt|}	nd}tdd|	}	nd }	|
tu rd }
d}nF|
| jkrz| ||| W n ty   Y n0 td||| d S t||||	||||||||
||||S )Nr   r   r   r   r   r   Fr   r   r`  rY   Tr   r   r	   r    r   z\s+z2Expiring cookie, domain='%s', path='%s', name='%s')r   rE  rB   rM   r   r   r   r'  boolru   r   r   rv   r`   r4  clearKeyErrorr   r   )r   tupr   rz   r{   re  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   _cookie_from_cookie_tuple  s    







z#CookieJar._cookie_from_cookie_tuplec                 C   s6   |  |}g }|D ]}| ||}|r|| q|S r   )rf  rk  rt   )r   ra  r   rb  rP  rj  r   r   r   r   _cookies_from_attrs_set'  s    
z!CookieJar._cookies_from_attrs_setc                 C   sH   t | jdd }|d u r | jj }|D ]}|jdkr$d|_|r$d|_q$d S )Nr   r    Tr	   )r   rH  r   r   r   )r   rP  Zrfc2109_as_nsr   r   r   r   _process_rfc2109_cookies0  s    

z"CookieJar._process_rfc2109_cookiesc                 C   s6  |  }|dg }|dg }tt  | j_| _| jj}| jj}|sN|rf|sV|rf|s^|rf|sj|sjg S z| t	||}W n t
y   t  g }Y n0 |r2|r2z| t||}	W n t
y   t  g }	Y n0 | |	 |r"i }
|D ]}d |
|j|j|jf< q|
fdd}t||	}	|	r2||	 |S )NzSet-Cookie2z
Set-Cookiec                 S   s   | j | j| jf}||vS r   )r   r   rz   )Z	ns_cookielookupr   r   r   r   no_matching_rfc2965i  s    z3CookieJar.make_cookies.<locals>.no_matching_rfc2965)r$  Zget_allrB   rN   rH  r4  r   r   rl  r|   	Exceptionr   r   rm  r   r   rz   filterrR  )r   responser   r   Zrfc2965_hdrsZns_hdrsr   r   rP  Z
ns_cookiesrn  r   ro  r   r   r   make_cookies<  sZ    




zCookieJar.make_cookiesc                 C   sX   | j   z<tt  | j_| _| j||r:| | W | j   n| j   0 d S r   )	rK  r]  rB   rN   rH  r4  r   
set_cookier^  r   r   r   r   set_cookie_if_oks  s    
zCookieJar.set_cookie_if_okc                 C   sv   | j }| j  zT|j|vr&i ||j< ||j }|j|vrDi ||j< ||j }|||j< W | j  n| j  0 d S r   )rL  rK  r]  r   r   rz   r^  )r   r   cc2Zc3r   r   r   rt    s    


zCookieJar.set_cookiec                 C   sl   t d|  | j  zB| ||D ]&}| j||r&t d| | | q&W | j  n| j  0 d S )Nzextract_cookies: %sz setting cookie: %s)	r   r$  rK  r]  rs  rH  r   rt  r^  )r   rr  r   r   r   r   r   extract_cookies  s    

zCookieJar.extract_cookiesc                 C   st   |d ur2|d u s|d u r t d| j| | |= n>|d urX|d u rJt d| j| |= n|d urj| j|= ni | _d S )Nz8domain and path must be given to remove a cookie by namez.domain must be given to remove cookies by path)rM   rL  )r   r   r   rz   r   r   r   rh    s    
zCookieJar.clearc                 C   sN   | j   z2| D ]}|jr| |j|j|j qW | j   n| j   0 d S r   )rK  r]  r   rh  r   r   rz   r^  )r   r   r   r   r   clear_session_cookies  s    
zCookieJar.clear_session_cookiesc                 C   sZ   | j   z>t }| D ]"}||r| |j|j|j qW | j   n| j   0 d S r   )	rK  r]  rN   r   rh  r   r   rz   r^  )r   r   r   r   r   r   r_    s    


zCookieJar.clear_expired_cookiesc                 C   s
   t | jS r   )rA  rL  r  r   r   r   __iter__  s    zCookieJar.__iter__c                 C   s   d}| D ]}|d }q|S )Nr	   r    r   )r   r   r   r   r   r   __len__  s    zCookieJar.__len__c                 C   s2   g }| D ]}| t| qd| jjd|f S Nz<%s[%s]>r   )rt   r   r   r   r   r   rr   r   r   r   r     s    zCookieJar.__repr__c                 C   s2   g }| D ]}| t| qd| jjd|f S r|  )rt   r-  r   r   r   r}  r   r   r   r     s    zCookieJar.__str__)N)NNN)!r   r   r   rv   compilerX  rY  Zstrict_domain_reZ	domain_reZdots_reASCIImagic_rer   rO  rQ  rS  r[  r\  rf  rk  rl  rm  rs  ru  rt  rx  rh  ry  r_  rz  r{  r   r   r   r   r   r   r     s6   





;!a\	7
r   c                   @   s   e Zd ZdS )r   NrF  r   r   r   r   r     rG  r   c                   @   s4   e Zd ZdddZdddZdddZdd	d
ZdS )r   NFc                 C   s2   t | | |d urt|}|| _t|| _d S r   )r   r   osfspathfilenamerg  	delayload)r   r  r  rN  r   r   r   r     s
    
zFileCookieJar.__init__c                 C   s
   t  d S r   r   )r   r  ignore_discardignore_expiresr   r   r   save  s    zFileCookieJar.savec                 C   s^   |d u r"| j d ur| j }nttt| }| |||| W d    n1 sP0    Y  d S r   )r  rM   MISSING_FILENAME_TEXTopen_really_loadr   r  r  r  r   r   r   r   load   s
    
zFileCookieJar.loadc                 C   s   |d u r"| j d ur| j }ntt| j  zNt| j}i | _z| ||| W n t	yl   || _ Y n0 W | j
  n| j
  0 d S r   )r  rM   r  rK  r]  r   deepcopyrL  r  OSErrorr^  )r   r  r  r  Z	old_stater   r   r   revert	  s    

zFileCookieJar.revert)NFN)NFF)NFF)NFF)r   r   r   r   r  r  r  r   r   r   r   r     s   


	  r   c                 C   s   | j | jfd| jfd| jfg}| jd ur8|d| jf | jrH|d | jrX|d | jrh|d | j	rx|d | j
r|dtt| j
f | jr|d	 | jr|d
| jf | jr|d| jf t| j }|D ]}||t| j| f q|dt| jf t|gS )Nr   r   r   )	path_specN)	port_specN)
domain_dotN)r   Nr   )r   Nr   r`  r   )rz   r{   r   r   r   rt   r   r   r   r   r   r6   r]   r   r   r   r;  r   r<  r-  r   r   )r   r   r<  r   r   r   r   lwp_cookie_str$  s(    
r  c                   @   s(   e Zd Zd
ddZdddZdd	 ZdS )r   Tc                 C   sT   t   }g }| D ]2}|s |jr q|s0||r0q|dt|  qd|dg S )NzSet-Cookie3: %s
rY   )rN   r   r   rt   r  r   )r   r  r  r   r~  r   r   r   r   
as_lwp_strM  s    
zLWPCookieJar.as_lwp_strNFc                 C   sl   |d u r"| j d ur| j }nttt|d,}|d || || W d    n1 s^0    Y  d S )Nwz#LWP-Cookies-2.0
)r  rM   r  r  writer  r  r   r   r   r  ]  s    
zLWPCookieJar.savec                 C   s,  |  }| j|s$d| }t|t }d}d}	d}
z|  }|dkrPq||s\q<|t|d   }t|gD ]f}|d \}}i }i }|	D ]}d||< q|dd  D ]n\}}|d ur|	 }nd }||
v s||	v r|}||	v r|d u rd	}|||< q||
v r|||< q|||< q|j
}|d
}|d}|d urJt|}|d u rXd	}|d}|d}t|d|||d|d|||d|d|d|d|||d|d|}|s|jrqz|s||rqz| | qzq<W n> ty    Y n* ty&   t  td||f Y n0 d S )Nz5%r does not look like a Set-Cookie3 (LWP) format filezSet-Cookie3:)r  r  r  r   r   )r   r   r   r   r   r   r`  rY   r	   Fr    Tr   r   r   r   r   r   r  r  r   r  r   r   r`  z&invalid Set-Cookie3 format file %r: %r)readliner  rA   r   rN   ru   r'  r   r|   rL   r   rg   r   r   r   rt  r  rp  r   )r   r   r  r  r  magicr   r   headerrc  rd  linedatarz   r{   re  r   r   r   r   r   r   r   r   r   rv  r   r   r   r  i  s    












zLWPCookieJar._really_load)TT)NFF)r   r   r   r  r  r  r   r   r   r   r   @  s   

r   c                   @   s,   e Zd ZedZdZdd Zd	ddZdS )
r   z#( Netscape)? HTTP Cookie Filezr# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This is a generated file!  Do not edit.

c                 C   s^  t   }| }| j|s(td| z| }|dkr>q|drT|d d }| ds*| dkrpq*|d\}}	}
}}}}|dk}|	dk}	|dkr|}d }|d}d	}|dkrd }d
}t	d||d d	||	||
d	|||d d i }|s|j
rq*|s||rq*| | q*W n> ty0    Y n* tyX   t  td||f Y n0 d S )Nz4%r does not look like a Netscape format cookies filerY   r  r   )#r  	TRUEr   FTr	   z+invalid Netscape format cookies file %r: %r)rN   r  r  rA   r   r   r   ru   r   r   r   r   rt  r  rp  r   )r   r   r  r  r  r   r  r  r   r   r   r   r   rz   r{   r   r   rv  r   r   r   r    sf    



zMozillaCookieJar._really_loadNFc                 C   s  |d u r"| j d ur| j }nttt|d}|| j t }| D ]}|sV|jrVqF|sf||rfqF|j	rrd}nd}|j
drd}nd}|jd urt|j}	nd}	|jd u rd}
|j}n|j}
|j}|d|j
||j||	|
|gd  qFW d    n1 s0    Y  d S )Nr  r  FALSEr   rY   r  r  )r  rM   r  r  r  r  rN   r   r   r   r   ru   r   r-  r{   rz   r   r   )r   r  r  r  r   r   r   r   r   r   rz   r{   r   r   r   r     s<    


zMozillaCookieJar.save)NFF)	r   r   r   rv   r  r  r  r  r  r   r   r   r   r     s   
Ar   )N)N)W__all__r  r   r.   rv   rN   urllib.parser   Zurllib.request	threadingrI  Zhttp.clienthttpZcalendarr
   r   r   r   r-  clientZ	HTTP_PORTr   r  r   r&   r-   r7   r8   rJ   r)   rt   rL   r6   r9   r?   r  r  r@   rG   rV   r[   Ir_   Xra   rd   re   rg   rm   ro   rp   rr   rq   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r>  rA  rE  r   r  r   r   r  r   r   r   r   r   r   <module>   s   


8
8
!



U
D'


#b!  b    7x