B
    v9a+                @   s  d dddddddg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dddddddgZdddddd d!d"d#d$d%d&gZg ZxeD ]Zee  qW dtd'd(Zdud)d*Z d	d	d	d	d+Z!e"d,ej#Z$d-d. Z%d/d0 Z&e"d1ej#Z'e"d2ej(ej#B Z)e"d3ej*ej#B Z+d4d5 Z,e"d6ej*ej#B Z-d7d8 Z.d9d: Z/e"d;Z0e"d<Z1e"d=Z2e"d>Z3d?d@ Z4e"dAZ5dBdC Z6dDdE Z7dFdG Z8e"dHej#Z9dIdJ Z:dKdL Z;dMdN Z<dOdP Z=e"dQej#Z>dRdS Z?dTdU Z@dVdW ZAdXdY ZBdZZCe"d[ZDd\d] ZEd^d_ ZFd`da ZGdbdc ZHG ddd  d ZIG ded dZJG dfd deJZKdgdh ZLdidj ZMG dkdl dlZNG dmd dZOG dnd dePZQG dod deOZRdpdq ZSG drd deRZTG dsd deRZUd	S )v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loggingZ	getLogger)argsr    r   /usr/lib/python3.7/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_exception9   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   _timegmH   s
    8Hr,   ZMonZTueZWedZThuZFriZSatZSunZJanZFebZMarZAprZMayZJunZJulZAugZSepZOctZNovZDecc             C   s@   | d k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)tdtr   r   r   	time2isozV   s
    r5   c             C   sR   | d k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.   r/   DAYSZweekdayr0   MONTHSr(   r'   r)   r1   r2   )r3   r4   r   r   r   time2netscapei   s    r8   )ZGMTUTCZUTZz^([-+])?(\d\d?):?(\d\d)?$c             C   sj   d }| t k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    

rF   c             C   s  t |}|tjkrd S yt| d }W nX tk
r   yt |}W n tk
r\   d S X d|  krrdkr|n n|}nd S Y nX |d krd}|d krd}|d krd}t | } t |}t |}t |}|dk r0tt d }|d }	|}
|| |	 }|	|
 }	t	|	dkr0|	dkr(|d }n|d }t
||| ||||f}|d k	r|d kr^d}| }t|}|d kr|d S || }|S )Nr   r    r	   i  d   2   r9   )rA   r-   ZMAXYEARMONTHS_LOWERindexlower
ValueErrortimeZ	localtimeabsr,   upperrF   )r0   monyrhrr*   r+   rC   ZimonZcur_yrrE   Ztmpr3   rD   r   r   r   	_str2time   sV    

   

 



rS   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 k	r| \}}}}}}	}
nd S t||||||	|
S )	Nr   r   r	   r;             )STRICT_DATE_REr@   groupsrI   rJ   rK   rA   floatr,   lstrip
WEEKDAY_REsubLOOSE_HTTP_DATE_RErS   )textrE   grP   r&   r0   rQ   rR   r*   r+   rC   r   r   r   	http2time   s    
"
ra   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 k	rL| \}}}}}}}}	nd S t|||||||S )NrW   )r[   ISO_DATE_REr@   rY   rS   )
r_   r0   rP   rQ   rR   r*   r+   rC   rE   _r   r   r   iso2time$  s    
rd   c             C   s*   |  d\}}| jd | | j|d   S )Nr	   )spanstring)matchstartendr   r   r   	unmatchedE  s    rj   z^\s*([^=\s;,]+)z&^\s*=\s*\"([^\"\\]*(?:\\.[^\"\\]*)*)\"z^\s*=\s*([^\s;,]*)z\\(.)c       
      C   s  g }x | D ]}|}g }x|rt |}|rt|}|d}t|}|rlt|}|d}td|}n.t|}|rt|}|d}| }nd }|	||f q|
 dr|
 dd  }|r|	| g }qtdd|\}}	|}qW |r|	| qW |S )Nr   z\1,z^[=\s;]*rV   )HEADER_TOKEN_REr@   rj   rB   HEADER_QUOTED_VALUE_REHEADER_ESCAPE_REr]   HEADER_VALUE_RErstripappendr[   
startswithresubn)
Zheader_valuesresultr_   Z	orig_textpairsrE   namevalueZnon_junkZnr_junk_charsr   r   r   split_header_wordsN  s>    .






 
 ry   z([\"\\])c             C   s   g }xt| D ]l}g }xN|D ]F\}}|d k	rTt d|sHtd|}d| }d||f }|| qW |r
|d| q
W d|S )Nz^\w+$z\\\1z"%s"z%s=%sz; z, )rs   r@   HEADER_JOIN_ESCAPE_REr]   rq   join)Zlistsheadersrv   attrkvr   r   r   join_header_words  s    
 r   c             C   s0   |  dr| dd  } | dr,| d d } | S )N"r   )rr   endswith)r_   r   r   r   strip_quotes  s
    

r   c             C   s   d}g }x| D ]}g }d}xt |dD ]\}}| }|d\}}	}
| }|sd|dkr*P nq*|	rp|
 nd }
|dkr| }||kr|}|dkr|
d k	rt|
}
d}n|dkr|
d k	rtt|
}
|||
f q*W |r|s|d	 || qW |S )
N)expiresdomainpathsecureversionportzmax-ageF;=r	   r   Tr   )r   0)	enumeratesplitstrip	partitionrK   r   ra   rq   )Z
ns_headersZknown_attrsru   Z	ns_headerrv   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 )NFrV   r	   .r   T)IPV4_REr@   )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   )rK   r   rfindrr   )ABir   r   r   domain_match  s    

r   c             C   s   t | rdS dS )NFT)r   r@   )r_   r   r   r   liberal_is_HDN?  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   )rK   r   rr   r   )r   r   initial_dotr   r   r   user_domain_matchI  s    
r   z:\d+$c             C   sB   |   }tj|d }|dkr,| dd}td|d}| S )Nr   rV   ZHost)get_full_urlurllibparseZurlparseZ
get_headercut_port_rer]   rK   )requesturlhostr   r   r   request_host^  s    r   c             C   s4   t |  }}|ddkr,t|s,|d }||fS )Nr   r   z.local)r   findr   r@   )r   erhnreq_hostr   r   r   eff_request_hostn  s    r   c             C   s4   |   }tj|}t|j}|ds0d| }|S )N/)r   r   r   Zurlsplitescape_pathr   rr   )r   r   partsr   r   r   r   request_pathy  s    

r   c             C   s^   | j }|d}|dkrV||d d  }yt| W qZ tk
rR   td| d S X nt}|S )N:r	   r   znonnumeric port: '%s')r   r   rA   rL   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   )rB   rO   )rg   r   r   r   uppercase_escaped_char  s    r   c             C   s   t j| t} tt| } | S )N)r   r   Z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   Z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 k	rt |}|d k	r$t t|}|d kr<|dkr<td|| _|| _|| _|| _|| _| | _	|| _
|| _|	| _|
| _|| _|| _|| _|| _|| _|| _t|| _d S )NTz-if port is None, port_specified must be false)rA   rZ   rL   r   rw   rx   r   port_specifiedrK   r   domain_specifieddomain_initial_dotr   path_specifiedr   r   discardcommentcomment_urlrfc2109copy_rest)selfr   rw   rx   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 kS )N)r   )r   rw   r   r   r   has_nonstandard_attr  s    zCookie.has_nonstandard_attrNc             C   s   | j ||S )N)r   get)r   rw   defaultr   r   r   get_nonstandard_attr  s    zCookie.get_nonstandard_attrc             C   s   || j |< d S )N)r   )r   rw   rx   r   r   r   set_nonstandard_attr  s    zCookie.set_nonstandard_attrc             C   s,   |d krt   }| jd k	r(| j|kr(dS dS )NTF)rM   r   )r   nowr   r   r   
is_expired  s
     zCookie.is_expiredc             C   sX   | j d krd}n
d| j  }| j| | j }| jd k	rFd| j| jf }n| j}d||f S )NrV   r   z%s=%sz<Cookie %s for %s>)r   r   r   rx   rw   )r   plimitZ	namevaluer   r   r   __str__"  s    
 

zCookie.__str__c             C   sp   g }x,dD ]$}t | |}|d|t|f  q
W |dt| j  |dt| j  d| jjd|f S )N)r   rw   rx   r   r   r   r   r   r   r   r   r   r   r   r   z%s=%szrest=%sz
rfc2109=%sz%s(%s)z, )getattrrq   reprr   r   	__class____name__r{   )r   r   rw   r}   r   r   r   __repr__,  s    

zCookie.__repr__)F)N)N)
r   
__module____qualname__r   r   r   r   r   r   r   r   r   r   r   r     s   
 


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 )N)NotImplementedError)r   cookier   r   r   r   set_okD  s    zCookiePolicy.set_okc             C   s
   t  d S )N)r   )r   r   r   r   r   r   	return_okM  s    zCookiePolicy.return_okc             C   s   dS )NTr   )r   r   r   r   r   r   domain_return_okQ  s    zCookiePolicy.domain_return_okc             C   s   dS )NTr   )r   r   r   r   r   r   path_return_okV  s    zCookiePolicy.path_return_okN)r   r   r   r   r   r   r   r   r   r   r   r   ;  s   		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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.d/ Zd0d1 Zd2d3 Zd4d5 ZdS )6r   r   r   rT   r	   NTFc             C   sp   || _ || _|| _|| _|| _|| _|	| _|
| _|| _|| _	|d k	rPt
|| _nd| _|d k	rft
|}|| _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tuple_blocked_domains_allowed_domains)r   blocked_domainsallowed_domainsr   r   r   r   r   r   r   r   r   r   r   r   r   r   f  s     zDefaultCookiePolicy.__init__c             C   s   | j S )N)r   )r   r   r   r   r     s    z#DefaultCookiePolicy.blocked_domainsc             C   s   t || _d S )N)r   r   )r   r   r   r   r   set_blocked_domains  s    z'DefaultCookiePolicy.set_blocked_domainsc             C   s"   x| j D ]}t||rdS qW dS )NTF)r   r   )r   r   Zblocked_domainr   r   r   
is_blocked  s    
zDefaultCookiePolicy.is_blockedc             C   s   | j S )N)r   )r   r   r   r   r     s    z#DefaultCookiePolicy.allowed_domainsc             C   s   |d k	rt |}|| _d S )N)r   r   )r   r   r   r   r   set_allowed_domains  s    z'DefaultCookiePolicy.set_allowed_domainsc             C   s0   | j d krdS x| j D ]}t||rdS qW dS )NFT)r   r   )r   r   Zallowed_domainr   r   r   is_not_allowed  s    

z"DefaultCookiePolicy.is_not_allowedc             C   sB   t d|j|j x,dD ]$}d| }t| |}|||sdS qW dS )Nz - checking cookie %s=%s)r   verifiabilityrw   r   r   r   Zset_ok_FT)r   rw   rx   r   )r   r   r   nfn_namefnr   r   r   r     s    


zDefaultCookiePolicy.set_okc             C   sZ   |j d k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	   z$   RFC 2965 cookies are switched offz$   Netscape cookies are switched offT)r   r   rw   rx   r   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)unverifiabler   r   r   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   rw   rr   r   )r   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k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 )Nz"   domain %s is in user block-listFz&   domain %s is not in user allow-listr   r   r	   r   )coZacZcomZeduZorgZnetZgovZmilrA   ZaeroZbizcatZcoopinfoZjobsZmobiZmuseumrw   ZproZtraveleuz&   country-code second level domain %sz.localz/   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   rK   lenrr   r   r   r   r   DomainRFC2965Matchr   DomainStrictNoDotsr   r@   )r   r   r   r   r   r   r   jZtldZsldZundotted_domainZembedded_dotsZhost_prefixr   r   r   set_ok_domain  sb    


z!DefaultCookiePolicy.set_ok_domainc          	   C   s   |j rt|}|d krd}nt|}x\|jdD ]:}yt| W n tk
r`   td| dS X ||kr2P q2W td||j dS dS )N80rk   z   bad port %s (not numeric)Fz$   request port (%s) not found in %sT)r   r   strr   r   rA   rL   r   )r   r   r   req_portr   r   r   r   set_ok_port"  s"    

zDefaultCookiePolicy.set_ok_portc             C   sB   t d|j|j x,dD ]$}d| }t| |}|||sdS qW dS )Nz - checking cookie %s=%s)r   r   r   r   r   r   Z
return_ok_FT)r   rw   rx   r   )r   r   r   r   r   r   r   r   r   r   7  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	   z$   RFC 2965 cookies are switched offFz$   Netscape cookies are switched offT)r   r   r   r   )r   r   r   r   r   r   return_ok_versionI  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 )Nr	   z>   third-party RFC 2965 cookie during unverifiable transactionFz>   third-party Netscape cookie during unverifiable transactionT)r   r   r   r   r   r   )r   r   r   r   r   r   return_ok_verifiabilityR  s    z+DefaultCookiePolicy.return_ok_verifiabilityc             C   s    |j r|jdkrtd dS dS )NZhttpsz(   secure cookie with non-secure requestFT)r   typer   )r   r   r   r   r   r   return_ok_secure^  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   r   r   return_ok_expiresd  s    z%DefaultCookiePolicy.return_ok_expiresc             C   sP   |j rLt|}|d krd}x0|j dD ]}||kr(P q(W td||j  dS dS )Nr
  rk   z0   request port %s does not match cookie port %sFT)r   r   r   r   )r   r   r   r  r   r   r   r   return_ok_portj  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   rr   r   r   DomainStrictNonDomainr   r   r   r   )r   r   r   r   r   r   	dotdomainr   r   r   return_ok_domainx  s&    

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   Fz"   domain %s is in user block-listz&   domain %s is not in user allow-listT)r   rr   r   r   r   r   )r   r   r   r   r   r  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  rr   r   )r   r   r   r   Zpathlenr   r   r   r     s    

z"DefaultCookiePolicy.path_return_ok)r   r   r   r  r  r  ZDomainLiberalZDomainStrictr   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   r   r   \  sJ   	;	c             C   s   t |  }t| j|S )N)sortedkeysmapr   )Zadictr  r   r   r   vals_sorted_by_key  s    r  c          	   c   sZ   t | }xL|D ]D}d} y
|j W n tk
r4   Y nX d} t|E d H  | s|V  qW d S )NFT)r  itemsAttributeError
deepvalues)mappingvaluesobjr   r   r   r    s    

r  c               @   s   e Zd ZdS )AbsentN)r   r   r   r   r   r   r   r"    s    r"  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\Wz([\"\\])z\.?[^.]*z[^.]*z^\.+z^\#LWP-Cookies-(\d+\.\d+)Nc             C   s(   |d krt  }|| _t | _i | _d S )N)r   _policy
_threadingRLock_cookies_lock_cookies)r   policyr   r   r   r     s
    
zCookieJar.__init__c             C   s
   || _ d S )N)r#  )r   r(  r   r   r   
set_policy  s    zCookieJar.set_policyc             C   s   g }| j ||sg S td| | j| }xd| D ]X}| j ||sHq4|| }x:| D ].}| j ||svtd qZtd || qZW q4W |S )Nz!Checking %s for cookies to returnz   not returning cookiez   it's a match)	r#  r   r   r'  r  r   r   r   rq   )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 }x$| j  D ]}|| || qW |S )N)r'  r  extendr+  )r   r   r*  r   r   r   r   _cookies_for_request  s    zCookieJar._cookies_for_requestc       	      C   sF  |j dd dd d}g }x$|D ]}|j}|sLd}|dkrL|d|  |jd k	r~| j|jr~|dkr~| jd|j}n|j}|jd k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 k	r"d}|jr4|d|j  }|| q"W |S )Nc             S   s
   t | jS )N)r  r   )ar   r   r   <lambda>      z)CookieJar._cookie_attrs.<locals>.<lambda>T)r   reverseFr	   z$Version=%sz\\\1z%s=%sz
$Path="%s"r   r   z$Domain="%s"z$Portz="%s")sortr   rq   rx   non_word_rer@   quote_rer]   rw   r   r   r   rr   r   r   r   )	r   r*  r   attrsr   r   rx   r   r   r   r   r   _cookie_attrs  s>    



zCookieJar._cookie_attrsc             C   s   t d | j  ztt  | j_| _| |}| |}|r^|	ds^|
dd| | jjr| jjs|	dsx$|D ]}|jdkr~|
dd P q~W W d | j  X |   d S )Nadd_cookie_headerr   z; ZCookie2r   z$Version="1")r   r&  acquirerA   rM   r#  r  r-  r6  Z
has_headerZadd_unredirected_headerr{   r   r   r   releaseclear_expired_cookies)r   r   r*  r5  r   r   r   r   r7  @  s$    







zCookieJar.add_cookie_headerc          
   C   s  g }d}d}x||D ]r}|d \}}d}d}	i }
i }x4|dd  D ]"\}}|  }||ksh||krl|}||kr|d krd}||
krqF|dkr|d krtd d}	P |  }|d	kr|rqF|d krtd
 qF|dkrd}yt|}W n$ tk
r   td d}	P Y nX d	}| j| }||ks2||krb|d krX|dkrXtd|  d}	P ||
|< qF|||< qFW |	rvq||||
|f qW |S )N)r   r   )r   r   zmax-ager   r   r   r   
commenturlr	   Fr   Tr   z%   missing value for domain attributer   zM   missing or invalid value for expires attribute: treating as session cookiezmax-agez?   missing or invalid (non-numeric) value for max-age attribute)r   r   r;  z!   missing value for %s attribute)rK   r   rA   rL   r  rq   )r   	attrs_setcookie_tuplesboolean_attrsvalue_attrsZcookie_attrsrw   rx   Zmax_age_setZ
bad_cookiestandardr   r~   r   r   r   r   r   _normalized_cookie_tuplesa  sf    





z#CookieJar._normalized_cookie_tuplesc             C   s$  |\}}}}| dt}| dt}| dt}	| dt}
| dd }|d k	rryt|}W n tk
rp   d S X | dd}| dd}| d	d }| d
d }|tk	r|dkrd}t|}nXd}t|}|d}|dkr|dkr|d | }n|d |d  }t|dkrd}|tk	}d}|r8t|	d}|tkrTt
|\}}|}n|	dshd| }d}|	tk	r|	d krt|}	nd}tdd|	}	nd }	|
tkrd }
d}nH|
| jkry| ||| W n tk
r   Y nX td||| d S t||||	||||||||
||||S )Nr   r   r   r   r   r   Fr   r   r;  rV   Tr   r   r	   r   r   z\s+z2Expiring cookie, domain='%s', path='%s', name='%s')r   r"  rA   rL   r   r   r   r  boolrr   r   r   rs   r]   r  clearKeyErrorr   r   )r   tupr   rw   rx   r@  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   s:   |  |}g }x&|D ]}| ||}|r|| qW |S )N)rA  rF  rq   )r   r<  r   r=  r*  rE  r   r   r   r   _cookies_from_attrs_set  s    

 z!CookieJar._cookies_from_attrs_setc             C   sL   t | jdd }|d kr | jj }x&|D ]}|jdkr&d|_|r&d|_q&W d S )Nr   r   Tr	   )r   r#  r   r   r   )r   r*  Zrfc2109_as_nsr   r   r   r   _process_rfc2109_cookies'  s    


z"CookieJar._process_rfc2109_cookiesc             C   s(  |  }|dg }|dg }| jj}| jj}|s8|rP|s@|rP|sH|rP|sT|sTg S y| t||}W n tk
r   t  g }Y nX |r$|r$y| t	||}	W n tk
r   t  g }	Y nX | 
|	 |ri }
x |D ]}d |
|j|j|jf< qW |
fdd}t||	}	|	r$||	 |S )NzSet-Cookie2z
Set-Cookiec             S   s   | j | j| jf}||kS )N)r   r   rw   )Z	ns_cookielookupr   r   r   r   no_matching_rfc2965_  s    z3CookieJar.make_cookies.<locals>.no_matching_rfc2965)r  Zget_allr#  r   r   rG  ry   	Exceptionr   r   rH  r   r   rw   filterr,  )r   responser   r|   Zrfc2965_hdrsZns_hdrsr   r   r*  Z
ns_cookiesrI  r   rJ  r   r   r   make_cookies3  sB    





zCookieJar.make_cookiesc             C   sN   | j   z2tt  | j_| _| j||r:| | W d | j   X d S )N)	r&  r8  rA   rM   r#  r  r   
set_cookier9  )r   r   r   r   r   r   set_cookie_if_oki  s    
zCookieJar.set_cookie_if_okc             C   sl   | j }| j  zJ|j|kr&i ||j< ||j }|j|krDi ||j< ||j }|||j< W d | j  X d S )N)r'  r&  r8  r   r   rw   r9  )r   r   cZc2Zc3r   r   r   rO  v  s    

 


 

zCookieJar.set_cookiec             C   s|   t d|  | j  zRtt  | j_| _x6| ||D ]&}| j	||r>t d| | 
| q>W W d | j  X d S )Nzextract_cookies: %sz setting cookie: %s)r   r  r&  r8  rA   rM   r#  r  rN  r   rO  r9  )r   rM  r   r   r   r   r   extract_cookies  s    

zCookieJar.extract_cookiesc             C   st   |d k	r2|d ks|d kr t d| j| | |= n>|d k	rX|d krJt d| j| |= n|d k	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)rL   r'  )r   r   r   rw   r   r   r   rC    s    
zCookieJar.clearc             C   sH   | j   z,x&| D ]}|jr| |j|j|j qW W d | j   X d S )N)r&  r8  r   rC  r   r   rw   r9  )r   r   r   r   r   clear_session_cookies  s    

zCookieJar.clear_session_cookiesc             C   sT   | j   z8t }x*| D ]"}||r| |j|j|j qW W d | j   X d S )N)	r&  r8  rM   r   rC  r   r   rw   r9  )r   r   r   r   r   r   r:    s    



zCookieJar.clear_expired_cookiesc             C   s
   t | jS )N)r  r'  )r   r   r   r   __iter__  s    zCookieJar.__iter__c             C   s   d}x| D ]}|d }q
W |S )Nr	   r   r   )r   r   r   r   r   r   __len__  s    
 zCookieJar.__len__c             C   s6   g }x| D ]}| t| q
W d| jjd|f S )Nz<%s[%s]>z, )rq   r   r   r   r{   )r   rr   r   r   r   r     s    
 zCookieJar.__repr__c             C   s6   g }x| D ]}| t| q
W d| jjd|f S )Nz<%s[%s]>z, )rq   r  r   r   r{   )r   rV  r   r   r   r   r     s    
 zCookieJar.__str__)N)NNN)!r   r   r   rs   compiler3  r4  Zstrict_domain_reZ	domain_reZdots_reASCIImagic_rer   r)  r+  r-  r6  r7  rA  rF  rG  rH  rN  rP  rO  rR  rC  rS  r:  rT  rU  r   r   r   r   r   r   r     s6   





;!a\	6
c               @   s   e Zd ZdS )r   N)r   r   r   r   r   r   r   r     s    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   sJ   t | | |d k	r6y|d  W n   tdY nX || _t|| _d S )NrV   zfilename must be string-like)r   r   rL   filenamerB  	delayload)r   rZ  r[  r(  r   r   r   r     s    zFileCookieJar.__init__c             C   s
   t  d S )N)r   )r   rZ  ignore_discardignore_expiresr   r   r   save  s    zFileCookieJar.savec          	   C   sJ   |d kr"| j d k	r| j }nttt|}| |||| W d Q R X d S )N)rZ  rL   MISSING_FILENAME_TEXTopen_really_load)r   rZ  r\  r]  r   r   r   r   load  s    
 
zFileCookieJar.loadc             C   s   |d kr"| j d k	r| j }ntt| j  zFt| j}i | _y| ||| W n t	k
rn   || _ Y nX W d | j
  X d S )N)rZ  rL   r_  r&  r8  r   Zdeepcopyr'  rb  OSErrorr9  )r   rZ  r\  r]  Z	old_stater   r   r   revert  s    
 
zFileCookieJar.revert)NFN)NFF)NFF)NFF)r   r   r   r   r^  rb  rd  r   r   r   r   r     s
   


	 c             C   s$  | j | jfd| jfd| jfg}| jd k	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 }x$|D ]}||t| j| f qW |dt| jf t|gS )Nr   r   r   )	path_specN)	port_specN)
domain_dotN)r   Nr   )r   Nr   r;  r   )rw   rx   r   r   r   rq   r   r   r   r   r   r5   rZ   r   r   r   r  r   r  r  r   r   )r   r   r  r~   r   r   r   lwp_cookie_str  s6    

  
 
 
 
  
  
rh  c               @   s(   e Zd Zd
ddZdddZdd	 ZdS )r   Tc             C   sX   t   }g }x:| D ]2}|s"|jr"q|s2||r2q|dt|  qW d|dg S )NzSet-Cookie3: %s
rV   )rM   r   r   rq   rh  r{   )r   r\  r]  r   rV  r   r   r   r   
as_lwp_strH  s    

zLWPCookieJar.as_lwp_strNFc          	   C   sX   |d kr"| j d k	r| j }nttt|d"}|d || || W d Q R X d S )Nwz#LWP-Cookies-2.0
)rZ  rL   r_  r`  writerj  )r   rZ  r\  r]  r   r   r   r   r^  X  s    
 
zLWPCookieJar.savec             C   sD  |  }| j|s$d| }t|t }d}d}	d}
yx|  }|dkrRP ||s^q@|t|d   }xt|gD ]p}|d \}}i }i }x|	D ]}d||< qW x|dd  D ]p\}}|d k	r|	 }nd }||
ks||	kr|}||	kr|d krd	}|||< q||
kr&|||< q|||< qW |j
}|d
}|d}|d k	rZt|}|d krhd	}|d}|d}t|d|||d|d|||d|d|d|d|||d|d|}|s|jrq|s||rq| | qW q@W W nB tk
r    Y n, tk
r>   t  td||f Y nX d S )Nz5%r does not look like a Set-Cookie3 (LWP) format filezSet-Cookie3:)rf  re  rg  r   r   )r   r   r   r   r   r   r;  rV   r	   Fr   Tr   r   r   r   r   r   rf  rg  r   re  r   r   r;  z&invalid Set-Cookie3 format file %r: %r)readlinerY  r@   r   rM   rr   r  r   ry   rK   r   rd   r   r   r   rO  rc  rK  r   )r   r   rZ  r\  r]  magicr   r   headerr>  r?  linedatarw   rx   r@  r   r~   r   r   r   r   r   r   r   rQ  r   r   r   ra  d  s     




 






zLWPCookieJar._really_load)TT)NFF)r   r   r   rj  r^  ra  r   r   r   r   r   ;  s   

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   sd  t   }| }| j|s(td| yx| }|dkr>P |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 W nB tk
r4    Y n, tk
r^   t  td||f Y nX d S )Nz4%r does not look like a Netscape format cookies filerV   ri  r   )#r   	TRUEr   FTr	   z+invalid Netscape format cookies file %r: %r)rM   rm  rY  r@   r   r   r   rr   r   r   r   r   rO  rc  rK  r   )r   r   rZ  r\  r]  r   rn  rp  r   r   r   r   r   rw   rx   r   r   rQ  r   r   r   ra    s`     
 

zMozillaCookieJar._really_loadNFc             C   s  |d kr"| j d k	r| j }nttt|d}|| j t }x| D ]}|sX|jrXqH|sh||rhqH|j	rtd}nd}|j
drd}nd}|jd k	rt|j}	nd}	|jd krd}
|j}n|j}
|j}|d|j
||j||	|
|gd  qHW W d Q R X d S )Nrk  rt  ZFALSEr   rV   rs  ri  )rZ  rL   r_  r`  rl  ro  rM   r   r   r   r   rr   r   r  rx   rw   r{   r   )r   rZ  r\  r]  r   r   r   r   r   r   rw   rx   r   r   r   r^    s<    
 

  

zMozillaCookieJar.save)NFF)	r   r   r   rs   rW  rY  ro  ra  r^  r   r   r   r   r     s   
A)N)N)V__all__r   r-   rs   rM   Zurllib.parser   Zurllib.requestZ	threadingr$  Zhttp.clientZhttpZcalendarr
   r   r   r   r  ZclientZ	HTTP_PORTr   r_  r   r%   r,   r6   r7   rI   r(   rq   rK   r5   r8   r>   rW  rX  r?   rF   rS   rX   Ir\   Xr^   ra   rb   rd   rj   rl   rm   ro   rn   ry   rz   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"  r   rc  r   r   rh  r   r   r   r   r   r   <module>   s   

 

88!



U
D'


#b!  `    :x