
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
ct„j~Š ã            )   @   sÊ  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dl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mZmZ d dlmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( d dl)m*Z*m+Z+ yd dl,Z,W n e-k
�r"   dZ.Y nX dZ.ddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'g!Z/d(ej0dd)…  Z1da2de
j3fddddd*œd+d„Z4d,d„ Z5g Z6d}d-d$„Z7d.d%„ Z8e	j9d/e	j:ƒZ;d0d1„ Z<G d2d„ dƒZ=G d3d„ dƒZ>d4d „ Z?G d5d	„ d	ƒZ@G d6d„ de@ƒZAG d7d
„ d
e@ƒZBG d8d„ de@ƒZCd9d:„ ZDG d;d„ de@ƒZEG d<d„ dƒZFG d=d„ deFƒZGG d>d„ deGƒZHG d?d„ dƒZIG d@d„ deIe@ƒZJG dAd„ deIe@ƒZKejLZMG dBd„ dƒZNG dCd„ de@eNƒZOG dDd„ de@eNƒZPG dEdF„ dFe@ƒZQG dGd„ deQƒZReSejTdHƒ�r.G dIdJ„ dJeQƒZUe/jVdJƒ G dKd„ de@ƒZWG dLd„ de@ƒZXdMdN„ ZYdOdP„ ZZG dQd„ de@ƒZ[dRdS„ Z\G dTd„ de@ƒZ]G dUd„ de]ƒZ^G dVd„ de@ƒZ_dWZ`ejadXk�rÈd dYlbmcZcmdZd ndZd"„ Zcd[d!„ Zdi ZeG d\d&„ d&ƒZfG d]d'„ d'efƒZgdahd^d_„ Zidajd`da„ Zkdaldbdc„ Zmdanddde„ ZoG dfdg„ dgƒZpdhdi„ Zqd~djdk„Zrdldm„ Zsejtdnk�r�d dolumvZvmwZw dpdq„ Zxdrds„ Zydtdu„ Zzdvd#„ Z{n6ejadXk�r¾dwdx„ Z|dyd#„ Z{dzd{„ Z}d|du„ ZzneqZ{erZzdS )é    N)ÚURLErrorÚ	HTTPErrorÚContentTooShortError)ÚurlparseÚurlsplitÚurljoinÚunwrapÚquoteÚunquoteÚ	splittypeÚ	splithostÚ	splitportÚ	splituserÚsplitpasswdÚ	splitattrÚ
splitqueryÚ
splitvalueÚsplittagÚto_bytesÚunquote_to_bytesÚ
urlunparse)Ú
addinfourlÚaddclosehookFTÚRequestÚOpenerDirectorÚBaseHandlerÚHTTPDefaultErrorHandlerÚHTTPRedirectHandlerÚHTTPCookieProcessorÚProxyHandlerÚHTTPPasswordMgrÚHTTPPasswordMgrWithDefaultRealmÚHTTPPasswordMgrWithPriorAuthÚAbstractBasicAuthHandlerÚHTTPBasicAuthHandlerÚProxyBasicAuthHandlerÚAbstractDigestAuthHandlerÚHTTPDigestAuthHandlerÚProxyDigestAuthHandlerÚHTTPHandlerÚFileHandlerÚ
FTPHandlerÚCacheFTPHandlerÚDataHandlerÚUnknownHandlerÚHTTPErrorProcessorÚurlopenÚinstall_openerÚbuild_openerÚpathname2urlÚurl2pathnameÚ
getproxiesÚurlretrieveÚ
urlcleanupÚ	URLopenerÚFancyURLopenerz%d.%dé   )ÚcafileÚcapathÚ	cadefaultÚcontextc      
      C   s¤   |s|s|rfdd l }|jdtdƒ |d k	r2tdƒ‚ts>tdƒ‚tjtjj||d�}t	|d�}t
|ƒ}	n0|r~t	|d�}t
|ƒ}	ntd kr’t
ƒ  a}	nt}	|	j| ||ƒS )Nr   zJcafile, capath and cadefault are deprecated, use a custom context instead.r:   zDYou can't pass both context and any of cafile, capath, and cadefaultzSSL support not available)r;   r<   )r>   )ÚwarningsÚwarnÚDeprecationWarningÚ
ValueErrorÚ	_have_sslÚsslZcreate_default_contextZPurposeZSERVER_AUTHÚHTTPSHandlerr2   Ú_openerÚopen)
ÚurlÚdataÚtimeoutr;   r<   r=   r>   r?   Zhttps_handlerÚopener© rL   ú&/usr/lib64/python3.6/urllib/request.pyr0   Œ   s*    <




c             C   s   | a d S )N)rF   )rK   rL   rL   rM   r1   á   s    c             C   s4  t | ƒ\}}tjt| |ƒƒ�è}|jƒ }|dkrD| rDtjj|ƒ|fS |rTt|dƒ}nt	j
dd�}|j}tj|ƒ |�† ||f}	d}
d}d}d}d	|kr¢t|d
 ƒ}|r²|||
|ƒ xB|j|
ƒ}|sÄP |t|ƒ7 }|j|ƒ |d7 }|r´|||
|ƒ q´W W d Q R X W d Q R X |dk�r0||k �r0td||f |	ƒ‚|	S )NÚfileÚwbF)Údeletei   é   é   r   zcontent-lengthzContent-Lengthz1retrieval incomplete: got only %i out of %i bytesi    éÿÿÿÿ)r   Ú
contextlibÚclosingr0   ÚinfoÚosÚpathÚnormpathrG   ÚtempfileZNamedTemporaryFileÚnameÚ_url_tempfilesÚappendÚintÚreadÚlenÚwriter   )rH   ÚfilenameÚ
reporthookrI   Zurl_typerX   ÚfpÚheadersÚtfpÚresultÚbsÚsizer_   ÚblocknumÚblockrL   rL   rM   r6   æ   sD    


$c              C   sH   x0t D ](} ytj| ƒ W q tk
r,   Y qX qW t d d …= trDd ad S )N)r\   rW   ÚunlinkÚOSErrorrF   )Z	temp_filerL   rL   rM   r7   %  s    


z:\d+$c             C   s<   | j }t|ƒd }|dkr&| jddƒ}tjd|dƒ}|jƒ S )NrR   Ú ÚHost)Úfull_urlr   Ú
get_headerÚ_cut_port_reÚsubÚlower)ÚrequestrH   ÚhostrL   rL   rM   Úrequest_host4  s    rw   c               @   sÊ   e Zd Zdi dddfdd„Zedd„ ƒZejdd„ ƒZejdd„ ƒZed	d
„ ƒZejdd
„ ƒZej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d„Zdd „ Zd!d"„ ZdS )$r   NFc       	      C   sp   || _ i | _i | _d | _|| _d | _x |jƒ D ]\}}| j||ƒ q.W |d krVt| ƒ}|| _	|| _
|rl|| _d S )N)rp   re   Úunredirected_hdrsÚ_datarI   Ú_tunnel_hostÚitemsÚ
add_headerrw   Úorigin_req_hostÚunverifiableÚmethod)	ÚselfrH   rI   re   r}   r~   r   ÚkeyÚvaluerL   rL   rM   Ú__init__F  s    zRequest.__init__c             C   s   | j rdj| j| j ƒS | jS )Nz{}#{})ÚfragmentÚformatÚ	_full_url)r€   rL   rL   rM   rp   X  s    zRequest.full_urlc             C   s(   t |ƒ| _t| jƒ\| _| _| jƒ  d S )N)r   r†   r   r„   Ú_parse)r€   rH   rL   rL   rM   rp   ^  s    
c             C   s   d | _ d | _d| _d S )Nrn   )r†   r„   Úselector)r€   rL   rL   rM   rp   e  s    c             C   s   | j S )N)ry   )r€   rL   rL   rM   rI   k  s    zRequest.datac             C   s(   || j kr$|| _ | jdƒr$| jdƒ d S )NzContent-length)ry   Ú
has_headerÚremove_header)r€   rI   rL   rL   rM   rI   o  s    

c             C   s
   d | _ d S )N)rI   )r€   rL   rL   rM   rI   y  s    c             C   sN   t | jƒ\| _}| jd kr(td| j ƒ‚t|ƒ\| _| _| jrJt| jƒ| _d S )Nzunknown url type: %r)	r   r†   ÚtyperB   rp   r   rv   rˆ   r
   )r€   ÚrestrL   rL   rM   r‡   }  s    
zRequest._parsec             C   s   | j d k	rdnd}t| d|ƒS )NÚPOSTÚGETr   )rI   Úgetattr)r€   Zdefault_methodrL   rL   rM   Ú
get_method…  s    zRequest.get_methodc             C   s   | j S )N)rp   )r€   rL   rL   rM   Úget_full_urlŠ  s    zRequest.get_full_urlc             C   s4   | j dkr| j r| j| _n|| _ | j| _|| _d S )NÚhttps)r‹   rz   rv   rp   rˆ   )r€   rv   r‹   rL   rL   rM   Ú	set_proxy�  s
    
zRequest.set_proxyc             C   s   | j | jkS )N)rˆ   rp   )r€   rL   rL   rM   Ú	has_proxy•  s    zRequest.has_proxyc             C   s   || j |jƒ < d S )N)re   Ú
capitalize)r€   r�   ÚvalrL   rL   rM   r|   ˜  s    zRequest.add_headerc             C   s   || j |jƒ < d S )N)rx   r•   )r€   r�   r–   rL   rL   rM   Úadd_unredirected_headerœ  s    zRequest.add_unredirected_headerc             C   s   || j kp|| jkS )N)re   rx   )r€   Úheader_namerL   rL   rM   r‰      s    
zRequest.has_headerc             C   s   | j j|| jj||ƒƒS )N)re   Úgetrx   )r€   r˜   ÚdefaultrL   rL   rM   rq   ¤  s    zRequest.get_headerc             C   s    | j j|d ƒ | jj|d ƒ d S )N)re   Úpoprx   )r€   r˜   rL   rL   rM   rŠ   ©  s    zRequest.remove_headerc             C   s"   | j jƒ }|j| jƒ t|jƒ ƒS )N)rx   ÚcopyÚupdatere   Úlistr{   )r€   ÚhdrsrL   rL   rM   Úheader_items­  s    
zRequest.header_items)N)Ú__name__Ú
__module__Ú__qualname__rƒ   Úpropertyrp   ÚsetterÚdeleterrI   r‡   r�   r‘   r“   r”   r|   r—   r‰   rq   rŠ   r    rL   rL   rL   rM   r   D  s(   

c               @   sN   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	ejfd
d„Z	ddd„Z
dd„ Zd	S )r   c             C   s6   dt  }d|fg| _g | _i | _i | _i | _i | _d S )NzPython-urllib/%sz
User-agent)Ú__version__Ú
addheadersÚhandlersÚhandle_openÚhandle_errorÚprocess_responseÚprocess_request)r€   Zclient_versionrL   rL   rM   rƒ   ³  s    zOpenerDirector.__init__c             C   sZ  t |dƒstdt|ƒ ƒ‚d}�xt|ƒD �]}|dkr:q*|jdƒ}|d |… }||d d … }|jd	ƒrÈ|jdƒ| d }||d d … }yt|ƒ}W n tk
r¬   Y nX | jj	|i ƒ}	|	| j|< n>|d
krÜ|}| j
}	n*|dkrð|}| j}	n|dkr*|}| j}	nq*|	j|g ƒ}
|
�r&tj|
|ƒ n
|
j|ƒ d}q*W |�rVtj| j|ƒ |j| ƒ d S )NÚ
add_parentz%expected BaseHandler instance, got %rFÚredirect_requestÚdo_openÚ
proxy_openÚ_rR   ÚerrorrG   Úresponseru   T)r¯   r°   r±   )ÚhasattrÚ	TypeErrorr‹   ÚdirÚfindÚ
startswithr^   rB   r«   r™   rª   r¬   r­   Ú
setdefaultÚbisectZinsortr]   r©   r®   )r€   ÚhandlerZaddedÚmethÚiÚprotocolZ	conditionÚjÚkindÚlookupr©   rL   rL   rM   Úadd_handler¾  sJ    



zOpenerDirector.add_handlerc             C   s   d S )NrL   )r€   rL   rL   rM   Úcloseí  s    zOpenerDirector.closec       	      G   s<   |j |f ƒ}x*|D ]"}t||ƒ}||Ž }|d k	r|S qW d S )N)r™   r�   )	r€   ÚchainrÁ   Ú	meth_nameÚargsr©   r¼   Úfuncrg   rL   rL   rM   Ú_call_chainñ  s    

zOpenerDirector._call_chainNc       
      C   sª   t |tƒrt||ƒ}n|}|d k	r(||_||_|j}|d }x(| jj|g ƒD ]}t||ƒ}||ƒ}qLW | j	||ƒ}	|d }x*| j
j|g ƒD ]}t||ƒ}|||	ƒ}	qŠW |	S )NZ_requestZ	_response)Ú
isinstanceÚstrr   rI   rJ   r‹   r­   r™   r�   Ú_openr¬   )
r€   ÚfullurlrI   rJ   Úreqr¿   rÆ   Z	processorr½   r´   rL   rL   rM   rG   ü  s"    


zOpenerDirector.openc             C   sP   | j | jdd|ƒ}|r|S |j}| j | j||d |ƒ}|r>|S | j | jdd|ƒS )Nrš   Zdefault_openrÌ   ÚunknownÚunknown_open)rÉ   rª   r‹   )r€   rÎ   rI   rg   r¿   rL   rL   rM   rÌ     s    


zOpenerDirector._openc             G   s~   |d
kr,| j d }|d }d| }d}|}n| j }|d }d}|||f| }| j|Ž }|r^|S |rz|dd	f| }| j|Ž S d S )NÚhttpr’   r:   zhttp_error_%srR   Z_errorr   rš   Úhttp_error_default)rÑ   r’   )r«   rÉ   )r€   ÚprotorÇ   ÚdictrÆ   Zhttp_errZ	orig_argsrg   rL   rL   rM   r³   '  s     

zOpenerDirector.error)N)r¡   r¢   r£   rƒ   rÃ   rÄ   rÉ   ÚsocketÚ_GLOBAL_DEFAULT_TIMEOUTrG   rÌ   r³   rL   rL   rL   rM   r   ²  s   /
c           	   G   sæ   t ƒ }ttttttttt	g	}t
tjdƒr2|jtƒ tƒ }xN|D ]F}x@| D ]8}t|tƒrlt||ƒr€|j|ƒ qHt||ƒrH|j|ƒ qHW q>W x|D ]}|j|ƒ qŽW x|D ]}|j|ƒ ƒ q¦W x&| D ]}t|tƒrÔ|ƒ }|j|ƒ qÀW |S )NÚHTTPSConnection)r   r   r.   r)   r   r   r+   r*   r/   r-   rµ   rÑ   Úclientr]   rE   ÚsetrÊ   r‹   Ú
issubclassÚaddÚremoverÃ   )r©   rK   Zdefault_classesÚskipÚklassZcheckÚhrL   rL   rM   r2   @  s0    	









c               @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	r   iô  c             C   s
   || _ d S )N)Úparent)r€   rà   rL   rL   rM   r®   g  s    zBaseHandler.add_parentc             C   s   d S )NrL   )r€   rL   rL   rM   rÄ   j  s    zBaseHandler.closec             C   s   t |dƒsdS | j|jk S )NÚhandler_orderT)rµ   rá   )r€   ÚotherrL   rL   rM   Ú__lt__n  s    
zBaseHandler.__lt__N)r¡   r¢   r£   rá   r®   rÄ   rã   rL   rL   rL   rM   r   d  s   c               @   s   e Zd ZdZdd„ ZeZdS )r/   iè  c             C   sJ   |j |j|jƒ   }}}d|  ko*dk n  sF| jjd|||||ƒ}|S )NéÈ   i,  rÑ   )ÚcodeÚmsgrV   rà   r³   )r€   ru   r´   rå   ræ   rŸ   rL   rL   rM   Úhttp_response{  s
    z HTTPErrorProcessor.http_responseN)r¡   r¢   r£   rá   rç   Úhttps_responserL   rL   rL   rM   r/   w  s   c               @   s   e Zd Zdd„ ZdS )r   c             C   s   t |j||||ƒ‚d S )N)r   rp   )r€   rÎ   rd   rå   ræ   rŸ   rL   rL   rM   rÒ   ‰  s    z*HTTPDefaultErrorHandler.http_error_defaultN)r¡   r¢   r£   rÒ   rL   rL   rL   rM   r   ˆ  s   c               @   s4   e Zd ZdZdZdd„ Zdd„ Ze Z ZZ	dZ
dS )	r   é   é
   c       	         sx   |j ƒ }|dkr|dkp&|dko&|dks:t|j||||ƒ‚|jdd	ƒ}d‰ t‡ fdd„|jjƒ D ƒƒ}t|||jdd�S )Né-  é.  é/  é3  rŽ   ÚHEADr�   ú z%20úcontent-lengthúcontent-typec             3   s&   | ]\}}|j ƒ ˆ kr||fV  qd S )N)rt   )Ú.0ÚkÚv)ÚCONTENT_HEADERSrL   rM   ú	<genexpr>¯  s    z7HTTPRedirectHandler.redirect_request.<locals>.<genexpr>T)re   r}   r~   )rë   rì   rí   rî   )rŽ   rï   )rë   rì   rí   )rñ   rò   )	r�   r   rp   ÚreplacerÔ   re   r{   r   r}   )	r€   rÎ   rd   rå   ræ   re   ÚnewurlÚmZ
newheadersrL   )rö   rM   r¯   ”  s    
z$HTTPRedirectHandler.redirect_requestc       
      C   sN  d|kr|d }nd|kr$|d }nd S t |ƒ}|jdkrRt||d||f ||ƒ‚|j rp|jrpt|ƒ}d|d	< t|ƒ}t|d
tj	d�}t
|j|ƒ}| j||||||ƒ}|d kr´d S t|dƒ�r|j }	|_|	j|dƒ| jksît|	ƒ| jk�rt|j|| j| ||ƒ‚ni  }	 |_|_|	j|dƒd |	|< |jƒ  |jƒ  | jj||jd�S )NÚlocationÚurirÑ   r’   Úftprn   z+%s - Redirection to url '%s' is not allowedú/r:   z
iso-8859-1)ÚencodingÚsafeÚredirect_dictr   rR   )rJ   )rÑ   r’   rý   rn   )r   Úschemer   rX   Znetlocrž   r   r	   ÚstringZpunctuationr   rp   r¯   rµ   r  r™   Úmax_repeatsr`   Úmax_redirectionsÚinf_msgr_   rÄ   rà   rG   rJ   )
r€   rÎ   rd   rå   ræ   re   rù   ÚurlpartsÚnewZvisitedrL   rL   rM   Úhttp_error_302º  s@    



z"HTTPRedirectHandler.http_error_302zoThe HTTP server returned a redirect error that would lead to an infinite loop.
The last 30x error message was:
N)r¡   r¢   r£   r  r  r¯   r	  Úhttp_error_301Úhttp_error_303Úhttp_error_307r  rL   rL   rL   rM   r   Œ  s   &<c       	      C   s�   t | ƒ\}}|jdƒs d }| }n:|jdƒs6td|  ƒ‚|jddƒ}|dkrNd }|d|… }t|ƒ\}}|d k	r|t|ƒ\}}nd  }}||||fS )Nrþ   z//zproxy URL with no authority: %rr:   rR   rS   )r   r¹   rB   r¸   r   r   )	Úproxyr  Zr_schemeÚ	authorityÚendZuserinfoÚhostportÚuserÚpasswordrL   rL   rM   Ú_parse_proxyý  s    

r  c               @   s"   e Zd ZdZddd„Zdd„ ZdS )r   éd   Nc             C   sL   |d krt ƒ }|| _x2|jƒ D ]&\}}t| d| ||| jfdd„ƒ qW d S )Nz%s_openc             S   s   || ||ƒS )NrL   )Úrr  r‹   r½   rL   rL   rM   Ú<lambda>%  s    z'ProxyHandler.__init__.<locals>.<lambda>)r5   Úproxiesr{   Úsetattrr±   )r€   r  r‹   rH   rL   rL   rM   rƒ     s    
zProxyHandler.__init__c             C   s´   |j }t|ƒ\}}}}|d kr"|}|jr6t|jƒr6d S |rv|rvdt|ƒt|ƒf }	tj|	jƒ ƒjdƒ}
|j	dd|
 ƒ t|ƒ}|j
||ƒ ||ksš|dkržd S | jj||jd�S d S )Nz%s:%sÚasciizProxy-authorizationzBasic r’   )rJ   )r‹   r  rv   Úproxy_bypassr
   Úbase64Ú	b64encodeÚencodeÚdecoder|   r“   rà   rG   rJ   )r€   rÎ   r  r‹   Z	orig_typeZ
proxy_typer  r  r  Z	user_passZcredsrL   rL   rM   r±   (  s     zProxyHandler.proxy_open)N)r¡   r¢   r£   rá   rƒ   r±   rL   rL   rL   rM   r     s   

c               @   s6   e Zd Zdd„ Zdd„ Zdd„ Zddd	„Zd
d„ ZdS )r    c             C   s
   i | _ d S )N)Úpasswd)r€   rL   rL   rM   rƒ   F  s    zHTTPPasswordMgr.__init__c                s`   t |tƒr|g}|ˆjkr$i ˆj|< x6dD ].‰ t‡ ‡fdd„|D ƒƒ}||fˆj| |< q*W d S )NTFc                s   g | ]}ˆj |ˆ ƒ‘qS rL   )Ú
reduce_uri)ró   Úu)Údefault_portr€   rL   rM   ú
<listcomp>Q  s    z0HTTPPasswordMgr.add_password.<locals>.<listcomp>)TF)rÊ   rË   r  Útuple)r€   Úrealmrü   r  r  Úreduced_urirL   )r"  r€   rM   Úadd_passwordI  s    



zHTTPPasswordMgr.add_passwordc       	      C   s`   | j j|i ƒ}xLdD ]D}| j||ƒ}x2|jƒ D ]&\}}x|D ]}| j||ƒr<|S q<W q.W qW dS )NTF)TF)NN)r  r™   r   r{   Ú	is_suburi)	r€   r%  ÚauthuriZdomainsr"  Úreduced_authuriZurisZauthinforü   rL   rL   rM   Úfind_user_passwordT  s    

z"HTTPPasswordMgr.find_user_passwordTc       
      C   s†   t |ƒ}|d r.|d }|d }|d p*d}nd }|}d}t|ƒ\}}|r~|d kr~|d k	r~dddœj|ƒ}	|	d k	r~d||	f }||fS )	NrR   r   r:   rþ   éP   i»  )rÑ   r’   z%s:%d)r   r   r™   )
r€   rü   r"  Úpartsr  r  rX   rv   ÚportZdportrL   rL   rM   r   ^  s     zHTTPPasswordMgr.reduce_uric             C   sR   ||krdS |d |d kr dS t j|d |d fƒ}t|ƒt|d ƒkrNdS dS )NTr   FrR   )Ú	posixpathÚcommonprefixr`   )r€   ÚbaseÚtestÚcommonrL   rL   rM   r(  u  s    zHTTPPasswordMgr.is_suburiN)T)r¡   r¢   r£   rƒ   r'  r+  r   r(  rL   rL   rL   rM   r    D  s
   

c               @   s   e Zd Zdd„ ZdS )r!   c             C   s0   t j| ||ƒ\}}|d k	r"||fS t j| d |ƒS )N)r    r+  )r€   r%  r)  r  r  rL   rL   rM   r+  †  s
    
z2HTTPPasswordMgrWithDefaultRealm.find_user_passwordN)r¡   r¢   r£   r+  rL   rL   rL   rM   r!   „  s   c                   s<   e Zd Z‡ fdd„Zd
‡ fdd„	Zddd„Zdd	„ Z‡  ZS )r"   c                s   i | _ tƒ j||Ž d S )N)ÚauthenticatedÚsuperrƒ   )r€   rÇ   Úkwargs)Ú	__class__rL   rM   rƒ   �  s    z%HTTPPasswordMgrWithPriorAuth.__init__Fc                s<   | j ||ƒ |d k	r&tƒ jd |||ƒ tƒ j||||ƒ d S )N)Úupdate_authenticatedr5  r'  )r€   r%  rü   r  r  Úis_authenticated)r7  rL   rM   r'  ”  s    z)HTTPPasswordMgrWithPriorAuth.add_passwordc             C   sF   t |tƒr|g}x0dD ](}x"|D ]}| j||ƒ}|| j|< q W qW d S )NTF)TF)rÊ   rË   r   r4  )r€   rü   r9  r"  r!  r&  rL   rL   rM   r8  ›  s    


z1HTTPPasswordMgrWithPriorAuth.update_authenticatedc             C   sD   x>dD ]6}| j ||ƒ}x$| jD ]}| j||ƒr| j| S qW qW d S )NTF)TF)r   r4  r(  )r€   r)  r"  r*  rü   rL   rL   rM   r9  ¥  s
    
z-HTTPPasswordMgrWithPriorAuth.is_authenticated)F)F)r¡   r¢   r£   rƒ   r'  r8  r9  Ú__classcell__rL   rL   )r7  rM   r"   Ž  s   

c               @   sT   e Zd ZejdejƒZddd„Zdd„ Zdd„ Z	d	d
„ Z
dd„ Zdd„ ZeZeZdS )r#   z1(?:^|,)[ 	]*([^ 	,]+)[ 	]+realm=(["']?)([^"']*)\2Nc             C   s"   |d krt ƒ }|| _| jj| _d S )N)r    r  r'  )r€   Zpassword_mgrrL   rL   rM   rƒ   Â  s    z!AbstractBasicAuthHandler.__init__c             c   st   d}xFt jj|ƒD ]6}|jƒ \}}}|d	kr:tjdtdƒ ||fV  d}qW |sp|rb|jƒ d }nd}|d fV  d S )
NFú"ú'zBasic Auth Realm was unquotedé   Tr   rn   )r;  r<  )r#   ÚrxÚfinditerÚgroupsr?   r@   ÚUserWarningÚsplit)r€   ÚheaderZfound_challengeZmor  r	   r%  rL   rL   rM   Ú_parse_realmÈ  s    
z%AbstractBasicAuthHandler._parse_realmc       	      C   s~   |j |ƒ}|sd S d }xL|D ]D}x>| j|ƒD ]0\}}|jƒ dkrF|}q,|d k	r,| j|||ƒS q,W qW |d k	rztd|f ƒ‚d S )NÚbasiczBAbstractBasicAuthHandler does not support the following scheme: %r)Zget_allrD  rt   Úretry_http_basic_authrB   )	r€   Úauthreqrv   rÎ   re   ZunsupportedrC  r  r%  rL   rL   rM   Úhttp_error_auth_reqedÜ  s    

z.AbstractBasicAuthHandler.http_error_auth_reqedc             C   s|   | j j||ƒ\}}|d k	rtd||f }dtj|jƒ ƒjdƒ }|j| jd ƒ|krTd S |j| j|ƒ | j	j
||jd�S d S d S )Nz%s:%szBasic r  )rJ   )r  r+  r  r  r  r  rq   Úauth_headerr—   rà   rG   rJ   )r€   rv   rÎ   r%  r  ÚpwÚrawÚauthrL   rL   rM   rF  ö  s    z.AbstractBasicAuthHandler.retry_http_basic_authc             C   sx   t | jdƒ s| jj|jƒ r"|S |jdƒst| jjd |jƒ\}}dj||ƒjƒ }tj	|ƒj
ƒ }|jddj|jƒ ƒƒ |S )Nr9  ÚAuthorizationz{0}:{1}zBasic {})rµ   r  r9  rp   r‰   r+  r…   r  r  Zstandard_b64encoder  r—   Ústrip)r€   rÎ   r  r  ZcredentialsZauth_strrL   rL   rM   Úhttp_request  s    
z%AbstractBasicAuthHandler.http_requestc             C   sL   t | jdƒrHd|j  ko dk n  r8| jj|jdƒ n| jj|jdƒ |S )Nr9  rä   i,  TF)rµ   r  rå   r8  rp   )r€   rÎ   r´   rL   rL   rM   rç     s
    z&AbstractBasicAuthHandler.http_response)N)r¡   r¢   r£   ÚreÚcompileÚIr>  rƒ   rD  rH  rF  rO  rç   Úhttps_requestrè   rL   rL   rL   rM   r#   ­  s   
c               @   s   e Zd ZdZdd„ ZdS )r$   rM  c             C   s   |j }| jd|||ƒ}|S )Nzwww-authenticate)rp   rH  )r€   rÎ   rd   rå   ræ   re   rH   r´   rL   rL   rM   Úhttp_error_401   s    
z#HTTPBasicAuthHandler.http_error_401N)r¡   r¢   r£   rI  rT  rL   rL   rL   rM   r$     s   c               @   s   e Zd ZdZdd„ ZdS )r%   zProxy-authorizationc             C   s   |j }| jd|||ƒ}|S )Nzproxy-authenticate)rv   rH  )r€   rÎ   rd   rå   ræ   re   r  r´   rL   rL   rM   Úhttp_error_407+  s    
z$ProxyBasicAuthHandler.http_error_407N)r¡   r¢   r£   rI  rU  rL   rL   rL   rM   r%   '  s   c               @   sN   e Zd Zd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S )r&   Nc             C   s4   |d krt ƒ }|| _| jj| _d| _d| _d | _d S )Nr   )r    r  r'  ÚretriedÚnonce_countÚ
last_nonce)r€   r  rL   rL   rM   rƒ   E  s    
z"AbstractDigestAuthHandler.__init__c             C   s
   d| _ d S )Nr   )rV  )r€   rL   rL   rM   Úreset_retry_countN  s    z+AbstractDigestAuthHandler.reset_retry_countc             C   s|   |j |d ƒ}| jdkr*t|jdd|d ƒ‚n|  jd7  _|rx|jƒ d }|jƒ dkr`| j||ƒS |jƒ dkrxtd| ƒ‚d S )	Né   i‘  zdigest auth failedrR   r   ZdigestrE  zEAbstractDigestAuthHandler does not support the following scheme: '%s')r™   rV  r   rp   rB  rt   Úretry_http_digest_authrB   )r€   rI  rv   rÎ   re   rG  r  rL   rL   rM   rH  Q  s    


z/AbstractDigestAuthHandler.http_error_auth_reqedc             C   sz   |j ddƒ\}}ttd t|ƒƒƒ}| j||ƒ}|rvd| }|jj| jd ƒ|krRd S |j| j|ƒ | j	j
||jd�}|S d S )Nrð   rR   z	Digest %s)rJ   )rB  Úparse_keqv_listÚfilterÚparse_http_listÚget_authorizationre   r™   rI  r—   rà   rG   rJ   )r€   rÎ   rL  ÚtokenZ	challengeÚchalZauth_valZresprL   rL   rM   r[  e  s    z0AbstractDigestAuthHandler.retry_http_digest_authc             C   s@   d| j |tjƒ f }|jdƒtdƒ }tj|ƒjƒ }|d d… S )Nz	%s:%s:%s:r  rQ   é   )rW  ÚtimeZctimer  Ú_randombytesÚhashlibÚsha1Ú	hexdigest)r€   ÚnonceÚsÚbÚdigrL   rL   rM   Ú
get_cnonceq  s    z$AbstractDigestAuthHandler.get_cnoncec             C   s¾  y6|d }|d }|j dƒ}|j ddƒ}|j dd ƒ}W n tk
rJ   d S X | j|ƒ\}}	|d krfd S | jj||jƒ\}
}|
d kr†d S |jd k	r | j|j|ƒ}nd }d|
||f }d|jƒ |j	f }|d	k�r.|| j
krè|  jd
7  _nd
| _|| _
d| j }| j|ƒ}d||||||ƒf }|	||ƒ|ƒ}n2|d k�rT|	||ƒd|||ƒf ƒ}ntd| ƒ‚d|
|||j	|f }|�r†|d| 7 }|�r˜|d| 7 }|d| 7 }|�rº|d||f 7 }|S )Nr%  rh  ÚqopÚ	algorithmÚMD5Úopaquez%s:%s:%sz%s:%srL  rR   z%08xz%s:%s:%s:%s:%szqop '%s' is not supported.z>username="%s", realm="%s", nonce="%s", uri="%s", response="%s"z, opaque="%s"z, digest="%s"z, algorithm="%s"z, qop=auth, nc=%s, cnonce="%s")r™   ÚKeyErrorÚget_algorithm_implsr  r+  rp   rI   Úget_entity_digestr�   rˆ   rX  rW  rl  r   )r€   rÎ   ra  r%  rh  rm  rn  rp  ÚHÚKDr  rJ  ZentdigZA1ZA2ZncvalueZcnonceZnoncebitZrespdigr1  rL   rL   rM   r_  |  sV    








z+AbstractDigestAuthHandler.get_authorizationc                sD   |dkrdd„ ‰ n|dkr$dd„ ‰ nt d| ƒ‚‡ fdd„}ˆ |fS )Nro  c             S   s   t j| jdƒƒjƒ S )Nr  )re  Zmd5r  rg  )ÚxrL   rL   rM   r  »  s    z?AbstractDigestAuthHandler.get_algorithm_impls.<locals>.<lambda>ZSHAc             S   s   t j| jdƒƒjƒ S )Nr  )re  rf  r  rg  )rv  rL   rL   rM   r  ½  s    z.Unsupported digest authentication algorithm %rc                s   ˆ d| |f ƒS )Nz%s:%srL   )ri  Úd)rt  rL   rM   r  Â  s    )rB   )r€   rn  ru  rL   )rt  rM   rr  ¸  s    

z-AbstractDigestAuthHandler.get_algorithm_implsc             C   s   d S )NrL   )r€   rI   ra  rL   rL   rM   rs  Å  s    z+AbstractDigestAuthHandler.get_entity_digest)N)r¡   r¢   r£   rƒ   rY  rH  r[  rl  r_  rr  rs  rL   rL   rL   rM   r&   :  s   
	<c               @   s   e Zd ZdZdZdd„ ZdS )r'   rM  iê  c             C   s*   t |jƒd }| jd|||ƒ}| jƒ  |S )NrR   zwww-authenticate)r   rp   rH  rY  )r€   rÎ   rd   rå   ræ   re   rv   ÚretryrL   rL   rM   rT  Ô  s
    
z$HTTPDigestAuthHandler.http_error_401N)r¡   r¢   r£   rI  rá   rT  rL   rL   rL   rM   r'   Ê  s   c               @   s   e Zd ZdZdZdd„ ZdS )r(   zProxy-Authorizationiê  c             C   s"   |j }| jd|||ƒ}| jƒ  |S )Nzproxy-authenticate)rv   rH  rY  )r€   rÎ   rd   rå   ræ   re   rv   rx  rL   rL   rM   rU  á  s
    
z%ProxyDigestAuthHandler.http_error_407N)r¡   r¢   r£   rI  rá   rU  rL   rL   rL   rM   r(   Ü  s   c               @   s6   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚAbstractHTTPHandlerr   c             C   s
   || _ d S )N)Ú_debuglevel)r€   Ú
debuglevelrL   rL   rM   rƒ   ê  s    zAbstractHTTPHandler.__init__c             C   s
   || _ d S )N)rz  )r€   ÚlevelrL   rL   rM   Úset_http_debuglevelí  s    z'AbstractHTTPHandler.set_http_debuglevelc             C   s   t jjj|j|jƒ ƒS )N)rÑ   rØ   ÚHTTPConnectionÚ_get_content_lengthrI   r�   )r€   ru   rL   rL   rM   r  ð  s    z'AbstractHTTPHandler._get_content_lengthc             C   s
  |j }|stdƒ‚|jd k	r–|j}t|tƒr8d}t|ƒ‚|jdƒsN|jddƒ |jdƒ r–|jdƒ r–| j|ƒ}|d k	rŠ|jdt|ƒƒ n|jddƒ |}|j	ƒ r¼t
|jƒ\}}t|ƒ\}}	|jdƒsÒ|jd|ƒ x2| jjD ]&\}
}|
jƒ }
|j|
ƒsÜ|j|
|ƒ qÜW |S )	Nzno host givenz\POST data should be bytes, an iterable of bytes, or a file object. It cannot be of type str.zContent-typez!application/x-www-form-urlencodedzContent-lengthzTransfer-encodingZchunkedro   )rv   r   rI   rÊ   rË   r¶   r‰   r—   r  r”   r   rˆ   r   rà   r¨   r•   )r€   ru   rv   rI   ræ   Zcontent_lengthZsel_hostr  ZselZsel_pathr[   r‚   rL   rL   rM   Údo_request_õ  s>    





zAbstractHTTPHandler.do_request_c       
         s\  |j }|stdƒ‚||fd|ji|—Ž}|j| jƒ t|jƒ‰ ˆ jt‡ fdd„|jj	ƒ D ƒƒƒ dˆ d< tdd„ ˆ j	ƒ D ƒƒ‰ |j
r¶i }d}|ˆ kr¦ˆ | ||< ˆ |= |j|j
|d	� y`y&|j|jƒ |j|jˆ |jd
ƒd� W n, tk
�r
 } zt|ƒ‚W Y d d }~X nX |jƒ }	W n   |jƒ  ‚ Y nX |j�rF|jjƒ  d |_|jƒ |	_|	j|	_|	S )Nzno host givenrJ   c             3   s"   | ]\}}|ˆ kr||fV  qd S )NrL   )ró   rô   rõ   )re   rL   rM   r÷   )  s    z.AbstractHTTPHandler.do_open.<locals>.<genexpr>rÄ   Ú
Connectionc             s   s   | ]\}}|j ƒ |fV  qd S )N)Útitle)ró   r[   r–   rL   rL   rM   r÷   6  s    zProxy-Authorization)re   zTransfer-encoding)Zencode_chunked)rv   r   rJ   Zset_debuglevelrz  rÔ   rx   r�   re   r{   rz   Z
set_tunnelru   r�   rˆ   rI   r‰   rm   ÚgetresponserÄ   Zsockr‘   rH   Úreasonræ   )
r€   Z
http_classrÎ   Zhttp_conn_argsrv   rß   Ztunnel_headersZproxy_auth_hdrÚerrr  rL   )re   rM   r°     s@    
"

zAbstractHTTPHandler.do_openN)r   )r¡   r¢   r£   rƒ   r}  r  r€  r°   rL   rL   rL   rM   ry  è  s
   
&ry  c               @   s   e Zd Zdd„ ZejZdS )r)   c             C   s   | j tjj|ƒS )N)r°   rÑ   rØ   r~  )r€   rÎ   rL   rL   rM   Ú	http_open`  s    zHTTPHandler.http_openN)r¡   r¢   r£   r†  ry  r€  rO  rL   rL   rL   rM   r)   ^  s   r×   c               @   s$   e Zd Zddd„Zdd„ ZejZdS )rE   r   Nc             C   s   t j| |ƒ || _|| _d S )N)ry  rƒ   Ú_contextÚ_check_hostname)r€   r{  r>   Úcheck_hostnamerL   rL   rM   rƒ   i  s    zHTTPSHandler.__init__c             C   s   | j tjj|| j| jd�S )N)r>   r‰  )r°   rÑ   rØ   r×   r‡  rˆ  )r€   rÎ   rL   rL   rM   Ú
https_openn  s    zHTTPSHandler.https_open)r   NN)r¡   r¢   r£   rƒ   rŠ  ry  r€  rS  rL   rL   rL   rM   rE   g  s   
rE   c               @   s.   e Zd Zddd„Zdd„ Zdd„ ZeZeZdS )	r   Nc             C   s$   dd l }|d kr|jjƒ }|| _d S )Nr   )Zhttp.cookiejarÚ	cookiejarZ	CookieJar)r€   r‹  rÑ   rL   rL   rM   rƒ   w  s    
zHTTPCookieProcessor.__init__c             C   s   | j j|ƒ |S )N)r‹  Zadd_cookie_header)r€   ru   rL   rL   rM   rO  }  s    z HTTPCookieProcessor.http_requestc             C   s   | j j||ƒ |S )N)r‹  Zextract_cookies)r€   ru   r´   rL   rL   rM   rç   �  s    z!HTTPCookieProcessor.http_response)N)r¡   r¢   r£   rƒ   rO  rç   rS  rè   rL   rL   rL   rM   r   v  s
   
c               @   s   e Zd Zdd„ ZdS )r.   c             C   s   |j }td| ƒ‚d S )Nzunknown url type: %s)r‹   r   )r€   rÎ   r‹   rL   rL   rM   rÐ   ‰  s    zUnknownHandler.unknown_openN)r¡   r¢   r£   rÐ   rL   rL   rL   rM   r.   ˆ  s   c             C   sR   i }xH| D ]@}|j ddƒ\}}|d dkrB|d dkrB|dd… }|||< q
W |S )Nú=rR   r   r;  rS   rS   )rB  )ÚlZparsedZeltrô   rõ   rL   rL   rM   r\  �  s    
r\  c             C   s¢   g }d}d }}xt| D ]l}|r,||7 }d}q|rV|dkr@d}qn|dkrLd}||7 }q|dkrn|j |ƒ d}q|dkrzd}||7 }qW |r”|j |ƒ dd„ |D ƒS )	Nrn   Fú\Tr;  ú,c             S   s   g | ]}|j ƒ ‘qS rL   )rN  )ró   ÚpartrL   rL   rM   r#  À  s    z#parse_http_list.<locals>.<listcomp>)r]   )ri  Úresr�  Úescaper	   ZcurrL   rL   rM   r^  —  s4    	


r^  c               @   s(   e Zd Zdd„ ZdZdd„ Zdd„ ZdS )r*   c             C   s\   |j }|d d… dkrN|dd… dkrN|jrN|jdkrN|j| jƒ krXtdƒ‚n
| j|ƒS d S )Nr:   z//r=  rþ   Ú	localhostz-file:// scheme is supported only on localhost)rˆ   rv   Ú	get_namesr   Úopen_local_file)r€   rÎ   rH   rL   rL   rM   Ú	file_openÄ  s    &

zFileHandler.file_openNc             C   s`   t jd krZy*ttjdƒd tjtjƒ ƒd  ƒt _W n$ tjk
rX   tjdƒft _Y nX t jS )Nr“  r:   )r*   Únamesr$  rÕ   Úgethostbyname_exÚgethostnameÚgaierrorÚgethostbyname)r€   rL   rL   rM   r”  Ï  s    
zFileHandler.get_namesc             C   s   dd l }dd l}|j}|j}t|ƒ}y¤tj|ƒ}|j}|jj	|j
dd�}	|j|ƒd }
|jd|
pbd||	f ƒ}|r~t|ƒ\}}| sš| rÆt|ƒ| jƒ krÆ|r¬d| | }nd| }tt|dƒ||ƒS W n* tk
rò } zt|ƒ‚W Y d d }~X nX tdƒ‚d S )	Nr   T)Úusegmtz6Content-type: %s
Content-length: %d
Last-modified: %s
z
text/plainzfile://Úrbzfile not on local host)Úemail.utilsÚ	mimetypesrv   rˆ   r4   rW   ÚstatÚst_sizeÚutilsÚ
formatdateÚst_mtimeÚ
guess_typeÚmessage_from_stringr   Ú_safe_gethostbynamer”  r   rG   rm   r   )r€   rÎ   ÚemailrŸ  rv   rb   Z	localfileÚstatsri   ÚmodifiedÚmtypere   r.  ZorigurlÚexprL   rL   rM   r•  Ú  s0    
zFileHandler.open_local_file)r¡   r¢   r£   r–  r—  r”  r•  rL   rL   rL   rM   r*   Â  s   
c             C   s&   y
t j| ƒS  t jk
r    d S X d S )N)rÕ   r›  rš  )rv   rL   rL   rM   r§  õ  s    
r§  c               @   s   e Zd Zdd„ Zdd„ ZdS )r+   c             C   s.  dd l }dd l}|j}|s"tdƒ‚t|ƒ\}}|d kr>|j}nt|ƒ}t|ƒ\}}|rdt|ƒ\}}nd }t	|ƒ}|pvd}|p~d}yt
j|ƒ}W n* tk
r¸ } zt|ƒ‚W Y d d }~X nX t|jƒ\}	}
|	jdƒ}ttt	|ƒƒ}|d d… |d  }}|�r|d  �r|dd … }yÐ| j||||||jƒ}|�r8d�p:d}x:|
D ]2}t|ƒ\}}|jƒ dk�rB|dk�rB|jƒ }�qBW |j||ƒ\}}d}|j|jƒd }|�r®|d| 7 }|d k	�rÎ|dk�rÎ|d| 7 }tj|ƒ}t|||jƒS  |jk
�r( } z$td| ƒ}|jtj ƒ d ƒ‚W Y d d }~X nX d S )Nr   zftp error: no host givenrn   rþ   rR   rR  ÚDr‹   ÚaÚAr¾   rw  zContent-type: %s
zContent-length: %d
zftp error: %rr:   rS   rS   )r®  r¯  r¾   rR  rw  r­  )!ÚftplibrŸ  rv   r   r   ÚFTP_PORTr^   r   r   r
   rÕ   r›  rm   r   rˆ   rB  rž   ÚmapÚconnect_ftprJ   r   rt   ÚupperÚretrfiler¥  rp   r¨  r¦  r   Ú
all_errorsÚwith_tracebackÚsysÚexc_info)r€   rÎ   r°  rŸ  rv   r.  r  r  ræ   rX   ÚattrsÚdirsrN   Úfwr‹   Úattrr‚   rd   Úretrlenre   r«  r¬  ÚexcrL   rL   rM   Úftp_openü  s\    



zFTPHandler.ftp_openc          	   C   s   t ||||||dd�S )NF)Ú
persistent)Ú
ftpwrapper)r€   r  r  rv   r.  r»  rJ   rL   rL   rM   r³  1  s    zFTPHandler.connect_ftpN)r¡   r¢   r£   rÀ  r³  rL   rL   rL   rM   r+   û  s   5c               @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )r,   c             C   s"   i | _ i | _d| _d| _d| _d S )Nr   é<   rb  )ÚcacherJ   ÚsoonestÚdelayÚ	max_conns)r€   rL   rL   rM   rƒ   8  s
    zCacheFTPHandler.__init__c             C   s
   || _ d S )N)rÆ  )r€   ÚtrL   rL   rM   Ú
setTimeout?  s    zCacheFTPHandler.setTimeoutc             C   s
   || _ d S )N)rÇ  )r€   rú   rL   rL   rM   ÚsetMaxConnsB  s    zCacheFTPHandler.setMaxConnsc             C   sr   |||dj |ƒ|f}|| jkr4tjƒ | j | j|< n,t||||||ƒ| j|< tjƒ | j | j|< | jƒ  | j| S )Nrþ   )ÚjoinrÄ  rc  rÆ  rJ   rÂ  Úcheck_cache)r€   r  r  rv   r.  r»  rJ   r�   rL   rL   rM   r³  E  s    

zCacheFTPHandler.connect_ftpc             C   sÈ   t j ƒ }| j|krTx@t| jjƒ ƒD ].\}}||k r"| j| jƒ  | j|= | j|= q"W tt| jjƒ ƒƒ| _t	| jƒ| j
krÄx6t| jjƒ ƒD ]$\}}|| jkrˆ| j|= | j|= P qˆW tt| jjƒ ƒƒ| _d S )N)rc  rÅ  rž   rJ   r{   rÄ  rÄ   ÚminÚvaluesr`   rÇ  )r€   rÈ  rô   rõ   rL   rL   rM   rÌ  P  s    

zCacheFTPHandler.check_cachec             C   s4   x| j jƒ D ]}|jƒ  qW | j jƒ  | jjƒ  d S )N)rÄ  rÎ  rÄ   ÚclearrJ   )r€   ÚconnrL   rL   rM   Úclear_cached  s    
zCacheFTPHandler.clear_cacheN)	r¡   r¢   r£   rƒ   rÉ  rÊ  r³  rÌ  rÑ  rL   rL   rL   rM   r,   5  s   c               @   s   e Zd Zdd„ ZdS )r-   c             C   s~   |j }|jddƒ\}}|jddƒ\}}t|ƒ}|jdƒrNtj|ƒ}|d d… }|sVd}tjd|t|ƒf ƒ}t	t
j|ƒ||ƒS )	Nú:rR   r�  z;base64é   ztext/plain;charset=US-ASCIIz$Content-type: %s
Content-length: %d
iùÿÿÿ)rp   rB  r   Úendswithr  Údecodebytesr¨  r¦  r`   r   ÚioÚBytesIO)r€   rÎ   rH   r  rI   Z	mediatypere   rL   rL   rM   Ú	data_openk  s    


zDataHandler.data_openN)r¡   r¢   r£   rØ  rL   rL   rL   rM   r-   j  s   rê   Únt)r4   r3   c             C   s   t | ƒS )N)r
   )ÚpathnamerL   rL   rM   r4   ‘  s    c             C   s   t | ƒS )N)r	   )rÚ  rL   rL   rM   r3   –  s    c               @   sÆ   e Zd ZdZde Zd)dd„Zdd„ Zdd„ Zd	d
„ Z	dd„ Z
d*dd„Zd+dd„Zd,dd„Zd-dd„Zdd„ Zd.dd„Zd/dd„Zdd„ Zer dd„ Zd0dd „Zd!d"„ Zd#d$„ Zd%d&„ Zd1d'd(„ZdS )2r8   NzPython-urllib/%sc             K   sz   dd| j ji }tj|tdd� |d kr.tƒ }|| _|jdƒ| _|jdƒ| _	d| j
fd
g| _g | _tj| _d | _t| _d S )NzW%(class)s style of invoking requests is deprecated. Use newer urlopen functions/methodsÚclassr=  )Ú
stacklevelÚkey_fileÚ	cert_filez
User-AgentÚAcceptú*/*)rß  rà  )r7  r¡   r?   r@   rA   r5   r  r™   rÝ  rÞ  Úversionr¨   Ú_URLopener__tempfilesrW   rl   Ú_URLopener__unlinkÚ	tempcacheÚftpcache)r€   r  Zx509ræ   rL   rL   rM   rƒ   ¬  s    zURLopener.__init__c             C   s   | j ƒ  d S )N)rÄ   )r€   rL   rL   rM   Ú__del__Æ  s    zURLopener.__del__c             C   s   | j ƒ  d S )N)Úcleanup)r€   rL   rL   rM   rÄ   É  s    zURLopener.closec             C   sZ   | j rFx2| j D ](}y| j|ƒ W q tk
r4   Y qX qW | j d d …= | jrV| jjƒ  d S )N)râ  rã  rm   rä  rÏ  )r€   rN   rL   rL   rM   rç  Ì  s    
zURLopener.cleanupc             G   s   | j j|ƒ d S )N)r¨   r]   )r€   rÇ   rL   rL   rM   Ú	addheaderÚ  s    zURLopener.addheaderc             C   sn  t t|ƒƒ}t|dd�}| jrL|| jkrL| j| \}}t|dƒ}t|||ƒS t|ƒ\}}|s`d}|| jkr–| j| }t|ƒ\}}	t|	ƒ\}
}|
|f}nd }d| }|| _	|j
ddƒ}t| |ƒ sÈ|dkræ|rÚ| j|||ƒS | j||ƒS y,|d k�r t| |ƒ|ƒS t| |ƒ||ƒS W nV ttfk
�r.   ‚ Y n< tk
�rh } ztd	|ƒjtjƒ d
 ƒ‚W Y d d }~X nX d S )Nz%/:=&?~#+!$,;'@()*[]|)r   r�  rN   Zopen_ú-r²   r•  zsocket errorr:   )r   r   r	   rä  rG   r   r   r  r   r‹   rø   rµ   Úopen_unknown_proxyÚopen_unknownr�   r   r   rm   r·  r¸  r¹  )r€   rÍ   rI   rb   re   rd   ÚurltyperH   r  Ú	proxyhostrv   rˆ   r[   ræ   rL   rL   rM   rG   à  s<    




zURLopener.openc             C   s   t |ƒ\}}tdd|ƒ‚d S )Nz	url errorzunknown url type)r   rm   )r€   rÍ   rI   r‹   rH   rL   rL   rM   rë    s    zURLopener.open_unknownc             C   s    t |ƒ\}}tdd| |ƒ‚d S )Nz	url errorzinvalid proxy for %s)r   rm   )r€   r  rÍ   rI   r‹   rH   rL   rL   rM   rê  	  s    zURLopener.open_unknown_proxyc              C   s&  t t|ƒƒ}| jr&|| jkr&| j| S t|ƒ\}}|d krš| sH|dkršy.| j|ƒ}|jƒ }|jƒ  tt|ƒd ƒ|fS  t	k
r˜ }	 zW Y d d }	~	X nX | j
||ƒ}�zH|jƒ }
|rÂt
|dƒ}n|dd l}t|ƒ\}}t|pÞdƒ\}}t|pîdƒ\}}t|�p dƒ\}}tjj|ƒd }|j|ƒ\}}| jj|ƒ tj|dƒ}z¤||
f}| jd k	�r^|| j|< d}d}d}d}d|
k�r„t|
d	 ƒ}|�r–||||ƒ xH|j|ƒ}|�sªP |t|ƒ7 }|j|ƒ |d7 }|�r˜||||ƒ �q˜W W d |jƒ  X W d |jƒ  X |dk�r"||k �r"td
||f |ƒ‚|S )NrN   rR   rO   r   rn   i   rQ   zcontent-lengthzContent-Lengthz1retrieval incomplete: got only %i out of %i bytesi    rS   )r   r   rä  r   r•  rV   rÄ   r4   r   rm   rG   rZ   r   r   rW   rX   ÚsplitextZmkstemprâ  r]   Úfdopenr^   r_   r`   ra   r   )r€   rH   rb   rc   rI   r‹   Zurl1rd   rŸ   ræ   re   rf   rZ   ZgarbagerX   ÚsuffixÚfdrg   rh   ri   r_   rj   rk   rL   rL   rM   Úretrieve  sl    






zURLopener.retrievec             C   s(  d }d }t |tƒr<t|ƒ\}}|r6t|ƒ\}}t|ƒ}|}nt|\}}t|ƒ\}}t|ƒ\}	}
|
}d }|	jƒ dkrvd }n:t|
ƒ\}}
|r’t|ƒ\}}|r¤d|	||
f }t|ƒr°|}|s¾tddƒ‚|ràt|ƒ}t	j
|jƒ ƒjdƒ}nd }|�rt|ƒ}t	j
|jƒ ƒjdƒ}nd }||ƒ}i }|�r*d| |d< |�r<d| |d< |�rJ||d	< d
|d< x| jD ]\}}|||< �qZW |d k	�r”d|d< |jd|||ƒ n|jd||d� y|jƒ }W n" tjjk
�rÒ   tdƒ‚Y nX d|j  k�oêdk n  �rt||jd| |jƒS | j||j|j|j|j|ƒS d S )NrÑ   z	%s://%s%sz
http errorzno host givenr  zBasic %szProxy-AuthorizationrM  ro   rÄ   r�  z!application/x-www-form-urlencodedzContent-Typer�   rŽ   )re   z$http protocol error: bad status linerä   i,  zhttp:)rÊ   rË   r   r   r
   r   rt   r  rm   r  r  r  r  r¨   ru   rƒ  rÑ   rØ   ZBadStatusLiner   Zstatusr   ræ   Ú
http_errorrd   r„  )r€   Zconnection_factoryrH   rI   Zuser_passwdZproxy_passwdrv   rˆ   Zrealhostrì  rŒ   Z
proxy_authrL  Z	http_connre   rC  r‚   r´   rL   rL   rM   Ú_open_generic_httpQ  sr    
 

zURLopener._open_generic_httpc             C   s   | j tjj||ƒS )N)rô  rÑ   rØ   r~  )r€   rH   rI   rL   rL   rM   Ú	open_http­  s    zURLopener.open_httpc       
      C   sb   d| }t | |ƒrPt| |ƒ}|d kr6||||||ƒ}	n|||||||ƒ}	|	rP|	S | j|||||ƒS )Nzhttp_error_%d)rµ   r�   rÒ   )
r€   rH   rd   ÚerrcodeÚerrmsgre   rI   r[   r   rg   rL   rL   rM   ró  ±  s    

 zURLopener.http_errorc             C   s   |j ƒ  t||||d ƒ‚d S )N)rÄ   r   )r€   rH   rd   rö  r÷  re   rL   rL   rM   rÒ   Á  s    zURLopener.http_error_defaultc             C   s   t jj|| j| jd�S )N)rÝ  rÞ  )rÑ   rØ   r×   rÝ  rÞ  )r€   rv   rL   rL   rM   Ú_https_connectionÇ  s    zURLopener._https_connectionc             C   s   | j | j||ƒS )N)rô  rø  )r€   rH   rI   rL   rL   rM   Ú
open_httpsÌ  s    zURLopener.open_httpsc             C   s^   t |tƒstdƒ‚|d d… dkrP|dd… dkrP|dd… jƒ dkrPtdƒ‚n
| j|ƒS d S )	NzEfile error: proxy support for file protocol currently not implementedr:   z//r=  rþ   é   z
localhost/z-file:// scheme is supported only on localhost)rÊ   rË   r   rt   rB   r•  )r€   rH   rL   rL   rM   Ú	open_fileÐ  s
    
4
zURLopener.open_filec             C   s\  dd l }dd l}t|ƒ\}}t|ƒ}ytj|ƒ}W n0 tk
rb } zt|j|j	ƒ‚W Y d d }~X nX |j
}	|jj|jdd�}
|j|ƒd }|jd|p–d|	|
f ƒ}|sÔ|}|d d… dkrÂd| }tt|d	ƒ||ƒS t|ƒ\}}| oütj|ƒtƒ ftƒ  k�rP|}|d d… dk�r d| }n|d d
… dk�r>td| ƒ‚tt|d	ƒ||ƒS tdƒ‚d S )Nr   T)rœ  z6Content-Type: %s
Content-Length: %d
Last-modified: %s
z
text/plainrR   rþ   zfile://r�  r:   z./zAlocal file url may start with / or file:. Unknown url of type: %sz#local file error: not on local host)rž  rŸ  r   r4   rW   r   rm   r   Ústrerrorrb   r¡  r¢  r£  r¤  r¥  r¦  r   rG   r   rÕ   r›  r“  ÚthishostrB   )r€   rH   r¨  rŸ  rv   rN   Z	localnamer©  Úeri   rª  r«  re   Zurlfiler.  rL   rL   rM   r•  Ù  s:     
zURLopener.open_local_filec             C   s˜  t |tƒstdƒ‚dd l}t|ƒ\}}|s2tdƒ‚t|ƒ\}}t|ƒ\}}|r\t|ƒ\}}nd }t|ƒ}t|ppdƒ}t|p|dƒ}t	j
|ƒ}|sždd l}|j}nt|ƒ}t|ƒ\}}	t|ƒ}|jdƒ}
|
d d… |
d  }
}|
oæ|
d  � rö|
dd … }
|
�r|
d  �rd|
d< |||dj|
ƒf}t| jƒtk�rlx8t| jƒD ]*}||k�r>| j| }| j|= |jƒ  �q>W yæ|| jk�r�t|||||
ƒ| j|< |�sœd}nd}x:|	D ]2}t|ƒ\}}|jƒ d	k�r¦|dk�r¦|jƒ }�q¦W | j| j||ƒ\}}|jd| ƒd }d}|�r|d| 7 }|d k	�r:|dk�r:|d| 7 }tj|ƒ}t||d| ƒS  tƒ k
�r’ } z td| ƒj t!j"ƒ d ƒ‚W Y d d }~X nX d S )NzCftp error: proxy support for ftp protocol currently not implementedr   zftp error: no host givenrn   rþ   rR   r­  rR  r‹   r®  r¯  r¾   rw  zftp:zContent-Type: %s
zContent-Length: %d
zftp error %rr:   rS   rS   )r®  r¯  r¾   rR  rw  r­  )#rÊ   rË   r   rŸ  r   r   r   r   r
   rÕ   r›  r°  r±  r^   r   rB  rË  r`   rå  ÚMAXFTPCACHErž   rÄ   rÂ  r   rt   r´  rµ  r¥  r¨  r¦  r   Ú	ftperrorsr·  r¸  r¹  )r€   rH   rŸ  rv   rX   r.  r  r  r°  rº  r»  rN   r�   rô   rõ   r‹   r½  r‚   rd   r¾  r«  re   r¬  rL   rL   rM   Úopen_ftpù  sp    
  

  

 


zURLopener.open_ftpc       	      C   s<  t |tƒstdƒ‚y|jddƒ\}}W n tk
rD   tddƒ‚Y nX |sNd}|jdƒ}|dkrŽd	||d … krŽ||d d … }|d |… }nd
}g }|jdtj	dtj
tjƒ ƒƒ ƒ |jd| ƒ |dkrätj|jdƒƒjdƒ}nt|ƒ}|jdt|ƒ ƒ |jd
ƒ |j|ƒ dj|ƒ}tj|ƒ}tj|ƒ}t|||ƒS )NzEdata error: proxy support for data protocol currently not implementedr�  rR   z
data errorzbad data URLztext/plain;charset=US-ASCIIú;r   rŒ  rn   zDate: %sz%a, %d %b %Y %H:%M:%S GMTzContent-type: %sr  r  zlatin-1zContent-Length: %dÚ
)rÊ   rË   r   rB  rB   rm   Úrfindr]   rc  ZstrftimeZgmtimer  rÕ  r  r  r
   r`   rË  r¨  r¦  rÖ  ÚStringIOr   )	r€   rH   rI   r‹   Zsemirÿ   ræ   re   ÚfrL   rL   rM   Ú	open_data3  s6    






zURLopener.open_data)N)N)N)N)NNN)N)N)N)N)r¡   r¢   r£   râ  r§   rá  rƒ   ræ  rÄ   rç  rè  rG   rë  rê  rò  rô  rõ  ró  rÒ   rC   rø  rù  rû  r•  r  r  rL   rL   rL   rM   r8   Ÿ  s,   

$


B\


	 :c               @   sš   e Zd Zdd„ Zdd„ Zd"dd„Zdd	„ Zd#d
d„Zd$dd„Zd%dd„Z	d&dd„Z
d'dd„Zd(dd„Zd)dd„Zd*dd„Zd+dd„Zd,dd„Zd d!„ ZdS )-r9   c             O   s(   t j| f|ž|Ž i | _d| _d| _d S )Nr   rê   )r8   rƒ   Ú
auth_cacheÚtriesÚmaxtries)r€   rÇ   r6  rL   rL   rM   rƒ   `  s    zFancyURLopener.__init__c             C   s   t ||d| |ƒS )Nzhttp:)r   )r€   rH   rd   rö  r÷  re   rL   rL   rM   rÒ   f  s    z!FancyURLopener.http_error_defaultNc       	      C   sn   |  j d7  _ zR| jrJ| j | jkrJt| dƒr4| j}n| j}|||dd|ƒS | j||||||ƒ}|S d| _ X d S )NrR   Úhttp_error_500iô  z)Internal Server Error: Redirect Recursionr   )r	  r
  rµ   r  rÒ   Úredirect_internal)	r€   rH   rd   rö  r÷  re   rI   r½   rg   rL   rL   rM   r	  j  s    
zFancyURLopener.http_error_302c       	      C   sx   d|kr|d }nd|kr$|d }nd S |j ƒ  t| jd | |ƒ}t|ƒ}|jd	krnt|||d|  ||ƒ‚| j|ƒS )
Nrû   rü   rÒ  rÑ   r’   rý   rn   z( Redirection to url '%s' is not allowed.)rÑ   r’   rý   rn   )rÄ   r   r‹   r   r  r   rG   )	r€   rH   rd   rö  r÷  re   rI   rù   r  rL   rL   rM   r  |  s    


z FancyURLopener.redirect_internalc             C   s   | j ||||||ƒS )N)r	  )r€   rH   rd   rö  r÷  re   rI   rL   rL   rM   r
  ˜  s    zFancyURLopener.http_error_301c             C   s   | j ||||||ƒS )N)r	  )r€   rH   rd   rö  r÷  re   rI   rL   rL   rM   r  œ  s    zFancyURLopener.http_error_303c             C   s2   |d kr| j ||||||ƒS | j|||||ƒS d S )N)r	  rÒ   )r€   rH   rd   rö  r÷  re   rI   rL   rL   rM   r     s    zFancyURLopener.http_error_307Fc             C   sÈ   d|krt j| |||||ƒ |d }tjd|ƒ}	|	sHt j| |||||ƒ |	jƒ \}
}|
jƒ dkrtt j| |||||ƒ |sŒt j| |||||ƒ d| j d }|d kr²t| |ƒ||ƒS t| |ƒ|||ƒS d S )Nzwww-authenticatez![ 	]*([^ 	]+)[ 	]+realm="([^"]*)"rE  Zretry_Ú_basic_auth)r8   rÒ   rP  Úmatchr@  rt   r‹   r�   )r€   rH   rd   rö  r÷  re   rI   rx  Ústuffr  r  r%  r[   rL   rL   rM   rT  §  s&    





zFancyURLopener.http_error_401c             C   sÈ   d|krt j| |||||ƒ |d }tjd|ƒ}	|	sHt j| |||||ƒ |	jƒ \}
}|
jƒ dkrtt j| |||||ƒ |sŒt j| |||||ƒ d| j d }|d kr²t| |ƒ||ƒS t| |ƒ|||ƒS d S )Nzproxy-authenticatez![ 	]*([^ 	]+)[ 	]+realm="([^"]*)"rE  Zretry_proxy_r  )r8   rÒ   rP  r  r@  rt   r‹   r�   )r€   rH   rd   rö  r÷  re   rI   rx  r  r  r  r%  r[   rL   rL   rM   rU  À  s&    





zFancyURLopener.http_error_407c             C   sÄ   t |ƒ\}}d| | }| jd }t|ƒ\}}	t |	ƒ\}	}
|	jdƒd }|	|d … }	| j|	||ƒ\}}|pl|srd S dt|dd�t|dd�|	f }	d|	 |
 | jd< |d kr´| j|ƒS | j||ƒS d S )Nzhttp://rÑ   ú@rR   z%s:%s@%srn   )r   )r   r  r   r¸   Úget_user_passwdr	   rG   )r€   rH   r%  rI   rv   rˆ   rù   r  rì  rí  Úproxyselectorr¾   r  r  rL   rL   rM   Úretry_proxy_http_basic_authÙ  s     
 
z*FancyURLopener.retry_proxy_http_basic_authc             C   sÄ   t |ƒ\}}d| | }| jd }t|ƒ\}}	t |	ƒ\}	}
|	jdƒd }|	|d … }	| j|	||ƒ\}}|pl|srd S dt|dd�t|dd�|	f }	d|	 |
 | jd< |d kr´| j|ƒS | j||ƒS d S )Nzhttps://r’   r  rR   z%s:%s@%srn   )r   )r   r  r   r¸   r  r	   rG   )r€   rH   r%  rI   rv   rˆ   rù   r  rì  rí  r  r¾   r  r  rL   rL   rM   Úretry_proxy_https_basic_authë  s     
 
z+FancyURLopener.retry_proxy_https_basic_authc       
      C   s�   t |ƒ\}}|jdƒd }||d … }| j|||ƒ\}}|p>|sDd S dt|dd�t|dd�|f }d| | }	|d kr€| j|	ƒS | j|	|ƒS d S )Nr  rR   z%s:%s@%srn   )r   zhttp://)r   r¸   r  r	   rG   )
r€   rH   r%  rI   rv   rˆ   r¾   r  r  rù   rL   rL   rM   rF  ý  s     
z$FancyURLopener.retry_http_basic_authc       
      C   s�   t |ƒ\}}|jdƒd }||d … }| j|||ƒ\}}|p>|sDd S dt|dd�t|dd�|f }d| | }	|d kr€| j|	ƒS | j|	|ƒS d S )Nr  rR   z%s:%s@%srn   )r   zhttps://)r   r¸   r  r	   rG   )
r€   rH   r%  rI   rv   rˆ   r¾   r  r  rù   rL   rL   rM   Úretry_https_basic_auth	  s     
z%FancyURLopener.retry_https_basic_authr   c             C   s`   |d |j ƒ  }|| jkr2|r(| j|= n
| j| S | j||ƒ\}}|sJ|rX||f| j|< ||fS )Nr  )rt   r  Úprompt_user_passwd)r€   rv   r%  rÑ  r�   r  r  rL   rL   rM   r  	  s    


 zFancyURLopener.get_user_passwdc             C   sT   dd l }y,td||f ƒ}|j d|||f ƒ}||fS  tk
rN   tƒ  dS X d S )Nr   zEnter username for %s at %s: z#Enter password for %s in %s at %s: )NN)ÚgetpassÚinputÚKeyboardInterruptÚprint)r€   rv   r%  r  r  r  rL   rL   rM   r  $	  s    z!FancyURLopener.prompt_user_passwd)N)N)N)N)NF)NF)N)N)N)N)r   )r¡   r¢   r£   rƒ   rÒ   r	  r  r
  r  r  rT  rU  r  r  rF  r  r  r  rL   rL   rL   rM   r9   ]  s"   



 
 





c               C   s   t d krtjdƒa t S )Nr“  )Ú
_localhostrÕ   r›  rL   rL   rL   rM   r“  4	  s    
r“  c               C   sP   t d krLyttjtjƒ ƒd ƒa W n( tjk
rJ   ttjdƒd ƒa Y nX t S )Nr:   r“  )Ú	_thishostr$  rÕ   r˜  r™  rš  rL   rL   rL   rM   rý  <	  s    rý  c              C   s   t d krdd l} | ja t S )Nr   )Ú
_ftperrorsr°  r¶  )r°  rL   rL   rM   r   G	  s    r   c               C   s   t d krtjdƒa t S )Nrn   )Ú
_noheadersr¨  r¦  rL   rL   rL   rM   Ú	noheadersP	  s    
r  c               @   sF   e Zd Zddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Zdd„ Z	dS )rÂ  NTc          	   C   sX   || _ || _|| _|| _|| _|| _d| _|| _y| jƒ  W n   | j	ƒ  ‚ Y nX d S )Nr   )
r  r  rv   r.  r»  rJ   ÚrefcountÚ	keepaliveÚinitrÄ   )r€   r  r  rv   r.  r»  rJ   rÁ  rL   rL   rM   rƒ   ]	  s    zftpwrapper.__init__c             C   s\   dd l }d| _|jƒ | _| jj| j| j| jƒ | jj| j	| j
ƒ dj| jƒ}| jj|ƒ d S )Nr   rþ   )r°  ÚbusyZFTPrý   Zconnectrv   r.  rJ   Zloginr  r  rË  r»  Úcwd)r€   r°  Z_targetrL   rL   rM   r"  m	  s    
zftpwrapper.initc          -   C   s¸  dd l }| jƒ  |dkr"d}d}nd| }d}y| jj|ƒ W n* |jk
rh   | jƒ  | jj|ƒ Y nX d }|rè| rèyd| }| jj|ƒ\}}W nR |jk
ræ } z4t|ƒd d… d	krÖt	d
| ƒj
tjƒ d ƒ‚W Y d d }~X nX |�s‚| jjdƒ |�rn| jjƒ }	zJy| jj|ƒ W n4 |jk
�rP } zt	d
| ƒ|‚W Y d d }~X nX W d | jj|	ƒ X d| }nd}| jj|ƒ\}}d| _t|jdƒ| jƒ}
|  jd7  _|jƒ  |
|fS )Nr   rw  r­  zTYPE ArR   zTYPE zRETR r=  Z550zftp error: %rr:   zLIST ZLISTr�  )rw  r­  )r°  Úendtransferrý   Zvoidcmdr¶  r"  ZntransfercmdZ
error_permrË   r   r·  r¸  r¹  Úpwdr$  r#  r   ÚmakefileÚ
file_closer   rÄ   )r€   rN   r‹   r°  ÚcmdÚisdirrÐ  r¾  r„  r&  ZftpobjrL   rL   rM   rµ  v	  sN       
 
$
zftpwrapper.retrfilec             C   s
   d| _ d S )Nr   )r#  )r€   rL   rL   rM   r%  £	  s    zftpwrapper.endtransferc             C   s   d| _ | jdkr| jƒ  d S )NFr   )r!  r   Ú
real_close)r€   rL   rL   rM   rÄ   ¦	  s    
zftpwrapper.closec             C   s4   | j ƒ  |  jd8  _| jdkr0| j r0| jƒ  d S )NrR   r   )r%  r   r!  r+  )r€   rL   rL   rM   r(  «	  s    zftpwrapper.file_closec             C   s2   | j ƒ  y| jjƒ  W n tƒ k
r,   Y nX d S )N)r%  rý   rÄ   r   )r€   rL   rL   rM   r+  ±	  s
    zftpwrapper.real_close)NT)
r¡   r¢   r£   rƒ   r"  rµ  r%  rÄ   r(  r+  rL   rL   rL   rM   rÂ  Z	  s    
	-rÂ  c              C   s¼   i } xBt jjƒ D ]4\}}|jƒ }|r|dd … dkr|| |d d… < qW dt jkr^| jdd ƒ xXt jjƒ D ]J\}}|dd … dkrj|jƒ }|r || |d d… < qj| j|d d	… d ƒ qjW | S )
Né   Ú_proxyZREQUEST_METHODrÑ   iúÿÿÿiúÿÿÿiúÿÿÿiúÿÿÿiúÿÿÿ)rW   Úenvironr{   rt   r›   )r  r[   r‚   rL   rL   rM   Úgetproxies_environment¹	  s    	
r/  c             C   s²   |d krt ƒ }y|d }W n tk
r.   dS X |dkr<dS t| ƒ\}}dd„ |jdƒD ƒ}xP|D ]H}|rb|jdƒ}tj|ƒ}d	| }tj||tjƒs¦tj|| tjƒrbdS qbW dS )
NÚnor   Ú*rR   c             S   s   g | ]}|j ƒ ‘qS rL   )rN  )ró   r  rL   rL   rM   r#  ì	  s    z,proxy_bypass_environment.<locals>.<listcomp>r�  Ú.z
(.+\.)?%s$)	r/  rq  r   rB  ÚlstriprP  r’  r  rR  )rv   r  Zno_proxyÚhostonlyr.  Zno_proxy_listr[   ÚpatternrL   rL   rM   Úproxy_bypass_environmentØ	  s&    


r6  c             C   s  ddl m } t| ƒ\}}dd„ }d| kr4|d r4dS d }xÞ|jdf ƒD ]Î}|sPqFtjd	|ƒ}|d k	�r|d krœytj|ƒ}||ƒ}W n tk
rš   wFY nX ||jd
ƒƒ}	|jdƒ}
|
d krÖd|jd
ƒj	dƒd
  }
nt
|
d
d … ƒ}
d|
 }
||
? |	|
? k�rdS qF|| |ƒrFdS qFW dS )Nr   )Úfnmatchc             S   sh   | j dƒ}ttt|ƒƒ}t|ƒdkr<|ddddg d d… }|d d> |d d> B |d d> B |d	 B S )
Nr2  ré   r   é   rR   rb  r:   rQ   r=  )rB  rž   r²  r^   r`   )ZipAddrr-  rL   rL   rM   Úip2num
  s
    
z,_proxy_bypass_macosx_sysconf.<locals>.ip2numr2  Zexclude_simpleTÚ
exceptionsz(\d+(?:\.\d+)*)(/\d+)?rR   r:   rQ   é    F)r7  r   r™   rP  r  rÕ   r›  rm   ÚgroupÚcountr^   )rv   Úproxy_settingsr7  r4  r.  r9  ZhostIPr‚   rú   r1  ÚmaskrL   rL   rM   Ú_proxy_bypass_macosx_sysconfû	  s:     



r@  Údarwin)Ú_get_proxy_settingsÚ_get_proxiesc             C   s   t ƒ }t| |ƒS )N)rB  r@  )rv   r>  rL   rL   rM   Úproxy_bypass_macosx_sysconf:
  s    rD  c               C   s   t ƒ S )N)rC  rL   rL   rL   rM   Úgetproxies_macosx_sysconf>
  s    rE  c             C   s    t ƒ }|rt| |ƒS t| ƒS d S )N)r/  r6  rD  )rv   r  rL   rL   rM   r  H
  s    
r  c               C   s   t ƒ p
tƒ S )N)r/  rE  rL   rL   rL   rM   r5   U
  s    c              C   s  i } ydd l }W n tk
r$   | S X yÎ|j|jdƒ}|j|dƒd }|rêt|j|dƒd ƒ}d|kr¬x‚|jdƒD ]4}|jddƒ\}}tjd|ƒsžd	||f }|| |< qrW n>|d d
… dkrÆ|| d< n$d| | d< d| | d< d| | d< |j	ƒ  W n t
ttfk
�r   Y nX | S )Nr   z;Software\Microsoft\Windows\CurrentVersion\Internet SettingsÚProxyEnableZProxyServerrŒ  r  rR   z^([^/:]+)://z%s://%srZ  zhttp:rÑ   z	http://%sz
https://%sr’   zftp://%srý   )ÚwinregÚImportErrorÚOpenKeyÚHKEY_CURRENT_USERÚQueryValueExrË   rB  rP  r  ZCloserm   rB   r¶   )r  rG  ÚinternetSettingsÚproxyEnableZproxyServerÚpr¿   ZaddressrL   rL   rM   Úgetproxies_registryZ
  s8    

rO  c               C   s   t ƒ p
tƒ S )N)r/  rO  rL   rL   rL   rM   r5   ‡
  s    c          &   C   s~  ydd l }W n tk
r    dS X y6|j|jdƒ}|j|dƒd }t|j|dƒd ƒ}W n tk
rl   dS X | sz| r~dS t| ƒ\}}|g} y tj	|ƒ}||kr®| j
|ƒ W n tk
rÄ   Y nX y tj|ƒ}||krä| j
|ƒ W n tk
� rü   Y nX |jdƒ}xp|D ]h}	|	dk�r*d|k�r*dS |	jdd	ƒ}	|	jd
dƒ}	|	jddƒ}	x$| D ]}
tj|	|
tjƒ�rTdS �qTW �qW dS )Nr   z;Software\Microsoft\Windows\CurrentVersion\Internet SettingsrF  ZProxyOverrider  z<local>r2  rR   z\.r1  z.*ú?)rG  rH  rI  rJ  rK  rË   rm   r   rÕ   r›  r]   ZgetfqdnrB  rø   rP  r  rR  )rv   rG  rL  rM  ZproxyOverrideZrawHostr.  ZaddrZfqdnr2  r–   rL   rL   rM   Úproxy_bypass_registry�
  sR    







rQ  c             C   s    t ƒ }|rt| |ƒS t| ƒS d S )N)r/  r6  rQ  )rv   r  rL   rL   rM   r  Â
  s    
)NNN)N)~r  r»   r¨  re  Zhttp.clientrÑ   rÖ  rW   r/  rP  rÕ   r  r¸  rc  ÚcollectionsrZ   rT   r?   Zurllib.errorr   r   r   Zurllib.parser   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   Zurllib.responser   r   rD   rH  rC   Ú__all__Úversion_infor§   rF   rÖ   r0   r1   r\   r6   r7   rQ  ÚASCIIrr   rw   r   r   r2   r   r/   r   r   r  r   r    r!   r"   r#   r$   r%   Úurandomrd  r&   r'   r(   ry  r)   rµ   rØ   rE   r]   r   r.   r\  r^  r*   r§  r+   r,   r-   rÿ  r[   Z
nturl2pathr4   r3   rå  r8   r9   r  r“  r  rý  r  r   r  r  rÂ  r/  r6  r@  ÚplatformZ_scproxyrB  rC  rD  rE  r  r5   rO  rQ  rL   rL   rL   rM   Ú<module>T   sê   P
T
?n $q*@
o v

+3:5!   A W

_
#<

-	2
