B
    v9am† ã            !   @   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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j/dd)…  Z0da1de
j2fddddd*œd+d„Z3d,d„ Z4g Z5d}d-d$„Z6d.d%„ Z7e	 8d/e	j9¡Z:d0d1„ Z;G d2d„ dƒZ<G d3d„ dƒZ=d4d „ Z>G d5d	„ d	ƒZ?G d6d„ de?ƒZ@G d7d
„ d
e?ƒZAG d8d„ de?ƒZBd9d:„ ZCG d;d„ de?ƒZDG d<d„ dƒZEG d=d„ deEƒZFG d>d„ deFƒZGG d?d„ dƒZHG d@d„ deHe?ƒZIG dAd„ deHe?ƒZJejKZLG dBd„ dƒZMG dCd„ de?eMƒZNG dDd„ de?eMƒZOG dEdF„ dFe?ƒZPG dGd„ dePƒZQeRejSdHƒr&G dIdJ„ dJePƒZTe. UdJ¡ G dKd„ de?ƒZVG dLd„ de?ƒZWdMdN„ ZXdOdP„ ZYG dQd„ de?ƒZZdRdS„ Z[G dTd„ de?ƒZ\G dUd„ de\ƒZ]G dVd„ de?ƒZ^dWZ_ej`dXkrÀd dYlambZbmcZc ndZd"„ Zbd[d!„ Zci ZdG d\d&„ d&ƒZeG d]d'„ d'eeƒZfdagd^d_„ Zhdaid`da„ Zjdakdbdc„ Zldamddde„ ZnG dfdg„ dgƒZodhdi„ Zpd~djdk„Zqdldm„ Zrejsdnkrˆd doltmuZumvZv dpdq„ Zwdrds„ Zxdtdu„ Zydvd#„ Zzn6ej`dXkr¶dwdx„ Z{dyd#„ Zzdzd{„ Z|d|du„ ZynepZzeqZyd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 }| 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}	|	 | ||¡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/lib/python3.7/request.pyr0   ‹   s*    <




c             C   s   | a d S )N)rF   )rK   rL   rL   rM   r1   à   s    c          
   C   s2  t | ƒ\}}t t| |ƒ¡æ}| ¡ }|dkrB|sBtj |¡|fS |rRt|dƒ}nt	j
dd}|j}t |¡ |† ||f}	d}
d}d}d}d|kr t|d	 ƒ}|r°|||
|ƒ xB| |
¡}|sÂP |t|ƒ7 }| |¡ |d
7 }|r²|||
|ƒ q²W W d Q R X W d Q R X |dkr.||k r.td||f |	ƒ‚|	S )NÚfileÚwbF)Údeletei    éÿÿÿÿr   zcontent-lengthzContent-Lengthé   z1retrieval incomplete: got only %i out of %i bytes)r   Ú
contextlibÚclosingr0   ÚinfoÚosÚpathÚnormpathrG   ÚtempfileZNamedTemporaryFileÚnameÚ_url_tempfilesÚappendÚintÚreadÚlenÚwriter   )rH   ÚfilenameÚ
reporthookrI   Zurl_typerW   ÚfpÚheadersÚtfpÚresultÚbsÚsizer^   ÚblocknumÚblockrL   rL   rM   r6   å   sD    


$c           	   C   sH   x0t D ](} yt | ¡ W q tk
r,   Y qX qW t d d …= trDd ad S )N)r[   rV   ÚunlinkÚOSErrorrF   )Z	temp_filerL   rL   rM   r7   $  s    


z:\d+$c             C   s<   | j }t|ƒd }|dkr&|  dd¡}t d|d¡}| ¡ S )NrR   Ú ÚHost)Úfull_urlr   Ú
get_headerÚ_cut_port_reÚsubÚlower)ÚrequestrH   ÚhostrL   rL   rM   Úrequest_host3  s    rv   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 | ¡ D ]\}}|  ||¡ q.W |d krVt| ƒ}|| _	|| _
|rl|| _d S )N)ro   rd   Úunredirected_hdrsÚ_datarI   Ú_tunnel_hostÚitemsÚ
add_headerrv   Úorigin_req_hostÚunverifiableÚmethod)	ÚselfrH   rI   rd   r|   r}   r~   ÚkeyÚvaluerL   rL   rM   Ú__init__E  s    zRequest.__init__c             C   s   | j rd | j| j ¡S | jS )Nz{}#{})ÚfragmentÚformatÚ	_full_url)r   rL   rL   rM   ro   W  s    zRequest.full_urlc             C   s(   t |ƒ| _t| jƒ\| _| _|  ¡  d S )N)r   r…   r   rƒ   Ú_parse)r   rH   rL   rL   rM   ro   ]  s    
c             C   s   d | _ d | _d| _d S )Nrm   )r…   rƒ   Úselector)r   rL   rL   rM   ro   d  s    c             C   s   | j S )N)rx   )r   rL   rL   rM   rI   j  s    zRequest.datac             C   s(   || j kr$|| _ |  d¡r$|  d¡ d S )NzContent-length)rx   Ú
has_headerÚremove_header)r   rI   rL   rL   rM   rI   n  s    

c             C   s
   d | _ d S )N)rI   )r   rL   rL   rM   rI   x  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   ro   r   ru   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)ro   )r   rL   rL   rM   Úget_full_url‰  s    zRequest.get_full_urlc             C   s2   | j dkr| js| j| _n|| _ | j| _|| _d S )NÚhttps)rŠ   ry   ru   ro   r‡   )r   ru   rŠ   rL   rL   rM   Ú	set_proxyŒ  s
    
zRequest.set_proxyc             C   s   | j | jkS )N)r‡   ro   )r   rL   rL   rM   Ú	has_proxy”  s    zRequest.has_proxyc             C   s   || j | ¡ < d S )N)rd   Ú
capitalize)r   r€   ÚvalrL   rL   rM   r{   —  s    zRequest.add_headerc             C   s   || j | ¡ < d S )N)rw   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)rd   rw   )r   Úheader_namerL   rL   rM   rˆ   Ÿ  s    
zRequest.has_headerc             C   s   | j  || j ||¡¡S )N)rd   Úgetrw   )r   r—   ÚdefaultrL   rL   rM   rp   £  s    zRequest.get_headerc             C   s    | j  |d ¡ | j |d ¡ d S )N)rd   Úpoprw   )r   r—   rL   rL   rM   r‰   ¨  s    zRequest.remove_headerc             C   s"   | j  ¡ }| | j¡ t| ¡ ƒS )N)rw   ÚcopyÚupdaterd   Úlistrz   )r   ÚhdrsrL   rL   rM   Úheader_items¬  s    
zRequest.header_items)N)Ú__name__Ú
__module__Ú__qualname__r‚   Úpropertyro   ÚsetterÚdeleterrI   r†   r   r   r’   r“   r{   r–   rˆ   rp   r‰   rŸ   rL   rL   rL   rM   r   C  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*| d¡}|d |… }||d d … }| d¡rÈ| d¡| d }||d d … }yt|ƒ}W n tk
r¬   Y nX | j 	|i ¡}	|	| j|< n>|dkrÜ|}| j
}	n*|d	krð|}| j}	n|d
kr*|}| j}	nq*|	 |g ¡}
|
r&t |
|¡ n
|
 |¡ d}q*W |rVt | j|¡ | | ¡ d S )NÚ
add_parentz%expected BaseHandler instance, got %rF)Úredirect_requestÚdo_openÚ
proxy_openÚ_rR   ÚerrorrG   Úresponsert   T)Ú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<   |  |d¡}x*|D ]"}t||ƒ}||Ž }|d k	r|S qW d S )NrL   )r˜   rŽ   )	r   ÚchainrÀ   Ú	meth_nameÚargsr¨   r»   Úfuncrf   rL   rL   rM   Ú_call_chainð  s    

zOpenerDirector._call_chainNc       
      C   sª   t |tƒrt||ƒ}n|}|d k	r(||_||_|j}|d }x(| j |g ¡D ]}t||ƒ}||ƒ}qLW |  	||¡}	|d }x*| 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dd|¡}|r|S |j}|   | j||d |¡}|r>|S |   | jdd|¡S )Nr™   Zdefault_openrË   ÚunknownÚunknown_open)rÈ   r©   rŠ   )r   rÍ   rI   rf   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Ð   r:   zhttp_error_%srR   Ú_errorr   r™   Úhttp_error_default)rª   rÈ   )r   ÚprotorÆ   ÚdictrÅ   Zhttp_errZ	orig_argsrf   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| t¡ tƒ }xN|D ]F}x@| D ]8}t|tƒrlt||ƒr€| |¡ qHt||ƒrH| |¡ qHW q>W x|D ]}| |¡ qŽW x|D ]}| |ƒ ¡ q¦W x&| D ]}t|tƒrÔ|ƒ }| |¡ 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­   f  s    zBaseHandler.add_parentc             C   s   d S )NrL   )r   rL   rL   rM   rÃ   i  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__m  s    
zBaseHandler.__lt__N)r    r¡   r¢   rá   r­   rÃ   rã   rL   rL   rL   rM   r   c  s   c               @   s   e Zd ZdZdd„ ZeZdS )r/   iè  c             C   sH   |j |j| ¡   }}}d|  kr,dk sDn | j d|||||¡}|S )NéÈ   i,  rÐ   )ÚcodeÚmsgrU   rà   r²   )r   rt   r³   rå   ræ   rž   rL   rL   rM   Úhttp_responsez  s
    z HTTPErrorProcessor.http_responseN)r    r¡   r¢   rá   rç   Úhttps_responserL   rL   rL   rM   r/   v  s   c               @   s   e Zd Zdd„ ZdS )r   c             C   s   t |j||||ƒ‚d S )N)r   ro   )r   rÍ   rc   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       	         st   |  ¡ }|dkr|dks:|dkr(|dks:t|j||||ƒ‚| dd¡}d‰ ‡ fdd	„|j ¡ D ƒ}t|||jd
dS )N)i-  i.  i/  i3  )r   ZHEAD)i-  i.  i/  rŒ   ú z%20)zcontent-lengthzcontent-typec                s"   i | ]\}}|  ¡ ˆ kr||“qS rL   )rs   )Ú.0ÚkÚv)ÚCONTENT_HEADERSrL   rM   ú
<dictcomp>®  s    z8HTTPRedirectHandler.redirect_request.<locals>.<dictcomp>T)rd   r|   r}   )r   r   ro   Úreplacerd   rz   r   r|   )	r   rÍ   rc   rå   ræ   rd   ÚnewurlÚmZ
newheadersrL   )rï   rM   r®   “  s    
z$HTTPRedirectHandler.redirect_requestc       
      C   sL  d|kr|d }nd|kr$|d }nd S t |ƒ}|jdkrRt||d||f ||ƒ‚|jsn|jrnt|ƒ}d|d< t|ƒ}t|dtj	d}t
|j|ƒ}|  ||||||¡}|d kr²d S t|d	ƒr|j }	|_|	 |d
¡| jksìt|	ƒ| jkrt|j|| j| ||ƒ‚ni  }	 |_|_|	 |d
¡d |	|< | ¡  | ¡  | jj||jdS )NÚlocationÚuri)rÐ   r‘   Úftprm   z+%s - Redirection to url '%s' is not allowedú/r:   z
iso-8859-1)ÚencodingÚsafeÚredirect_dictr   rR   )rJ   )r   Úschemer   rW   Znetlocr   r   r	   ÚstringZpunctuationr   ro   r®   r´   rú   r˜   Úmax_repeatsr_   Úmax_redirectionsÚinf_msgr^   rÃ   rà   rG   rJ   )
r   rÍ   rc   rå   ræ   rd   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 | ƒ\}}| d¡s d }| }n:| d¡s6td|  ƒ‚| dd¡}|dkrNd }|d|… }t|ƒ\}}|d k	r|t|ƒ\}}nd  }}||||fS )Nr÷   z//zproxy URL with no authority: %rr:   rQ   )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| ¡ 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   Úproxiesrz   Ú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 |	 ¡ ¡ d¡}
| 	dd|
 ¡ t|ƒ}| 
||¡ ||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  ru   Ú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‚   E  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 )N)TFc             3   s   | ]}ˆ  |ˆ ¡V  qd S )N)Ú
reduce_uri)rì   Úu)Údefault_portr   rL   rM   ú	<genexpr>P  s    z/HTTPPasswordMgr.add_password.<locals>.<genexpr>)rÉ   rÊ   r  Útuple)r   Úrealmrõ   r
  r  Úreduced_urirL   )r  r   rM   Úadd_passwordH  s    



zHTTPPasswordMgr.add_passwordc       	      C   s`   | j  |i ¡}xLdD ]D}|  ||¡}x2| ¡ D ]&\}}x|D ]}|  ||¡r<|S q<W q.W qW dS )N)TF)NN)r  r˜   r  rz   Ú	is_suburi)	r   r  ÚauthuriZdomainsr  Úreduced_authuriZurisZauthinforõ   rL   rL   rM   Úfind_user_passwordS  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œ |¡}	|	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  rW   ru   ÚportZdportrL   rL   rM   r  ]  s     zHTTPPasswordMgr.reduce_uric             C   sR   ||krdS |d |d kr dS t  |d |d f¡}t|ƒt|d ƒkrNdS dS )NTr   FrR   )Ú	posixpathÚcommonprefixr_   )r   ÚbaseÚtestÚcommonrL   rL   rM   r!  t  s    zHTTPPasswordMgr.is_suburiN)T)r    r¡   r¢   r‚   r   r$  r  r!  rL   rL   rL   rM   r    C  s
   

c               @   s   e Zd Zdd„ ZdS )r!   c             C   s0   t  | ||¡\}}|d k	r"||fS t  | 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<   |   ||¡ |d k	r&tƒ  d |||¡ tƒ  ||||¡ d S )N)Úupdate_authenticatedr.  r   )r   r  rõ   r
  r  Úis_authenticated)r0  rL   rM   r   “  s    z)HTTPPasswordMgrWithPriorAuth.add_passwordc             C   sF   t |tƒr|g}x0dD ](}x"|D ]}|  ||¡}|| j|< q W qW d S )N)TF)rÉ   rÊ   r  r-  )r   rõ   r2  r  r  r  rL   rL   rM   r1  š  s    


z1HTTPPasswordMgrWithPriorAuth.update_authenticatedc             C   sD   x>dD ]6}|   ||¡}x$| jD ]}|  ||¡r| j| S qW qW d S )N)TF)r  r-  r!  )r   r"  r  r#  rõ   rL   rL   rM   r2  ¤  s
    
z-HTTPPasswordMgrWithPriorAuth.is_authenticated)F)F)r    r¡   r¢   r‚   r   r1  r2  Ú__classcell__rL   rL   )r0  rM   r"     s   

c               @   sL   e Zd Ze dej¡Zd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   sˆ   |  |d ¡}|r„| ¡ d }| ¡ dkr6td| ƒ‚nNtj |¡}|r„| ¡ \}}}|dkrjt 	dt
d¡ | ¡ dkr„|  |||¡S d S )Nr   ÚbasiczDAbstractBasicAuthHandler does not support the following scheme: '%s')ú"ú'zBasic Auth Realm was unquotedr:   )r˜   Úsplitrs   rB   r#   ÚrxÚsearchÚgroupsr?   r@   ÚUserWarningÚretry_http_basic_auth)	r   Úauthreqru   rÍ   rd   rû   Úmor	   r  rL   rL   rM   Úhttp_error_auth_reqedÀ  s    
z.AbstractBasicAuthHandler.http_error_auth_reqedc             C   s|   | j  ||¡\}}|d k	rtd||f }dt | ¡ ¡ d¡ }| | jd ¡|krTd S | | j|¡ | j	j
||jdS d S d S )Nz%s:%szBasic r  )rJ   )r  r$  r  r  r  r  rp   Úauth_headerr–   rà   rG   rJ   )r   ru   rÍ   r  r
  ÚpwÚrawÚauthrL   rL   rM   r<  Ö  s    z.AbstractBasicAuthHandler.retry_http_basic_authc             C   st   t | jdƒr| j |j¡s|S | d¡sp| j d |j¡\}}d ||¡ ¡ }t 	|¡ 
¡ }| dd | ¡ ¡¡ |S )Nr2  ÚAuthorizationz{0}:{1}zBasic {})r´   r  r2  ro   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r"dk r8n n| j |jd¡ n| j |jd¡ |S )Nr2  rä   i,  TF)r´   r  rå   r1  ro   )r   rÍ   r³   rL   rL   rM   rç   ï  s
    z&AbstractBasicAuthHandler.http_response)N)r    r¡   r¢   ÚreÚcompileÚIr8  r‚   r?  r<  rF  rç   Úhttps_requestrè   rL   rL   rL   rM   r#   ¬  s   
c               @   s   e Zd ZdZdd„ ZdS )r$   rD  c             C   s   |j }|  d|||¡}|S )Nzwww-authenticate)ro   r?  )r   rÍ   rc   rå   ræ   rd   rH   r³   rL   rL   rM   Úhttp_error_401   s    
z#HTTPBasicAuthHandler.http_error_401N)r    r¡   r¢   r@  rK  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 }|  d|||¡}|S )Nzproxy-authenticate)ru   r?  )r   rÍ   rc   rå   ræ   rd   r  r³   rL   rL   rM   Úhttp_error_407  s    
z$ProxyBasicAuthHandler.http_error_407N)r    r¡   r¢   r@  rL  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‚   %  s    
z"AbstractDigestAuthHandler.__init__c             C   s
   d| _ d S )Nr   )rM  )r   rL   rL   rM   Úreset_retry_count.  s    z+AbstractDigestAuthHandler.reset_retry_countc             C   s|   |  |d ¡}| jdkr*t|jdd|d ƒ‚n|  jd7  _|rx| ¡ d }| ¡ dkr`|  ||¡S | ¡ dkrxtd| ƒ‚d S )	Né   i‘  zdigest auth failedrR   r   Zdigestr4  zEAbstractDigestAuthHandler does not support the following scheme: '%s')r˜   rM  r   ro   r7  rs   Úretry_http_digest_authrB   )r   r@  ru   rÍ   rd   r=  rû   rL   rL   rM   r?  1  s    


z/AbstractDigestAuthHandler.http_error_auth_reqedc             C   sz   |  dd¡\}}ttd t|ƒƒƒ}|  ||¡}|rvd| }|j | jd ¡|krRd S | | j|¡ | j	j
||jd}|S d S )Nrë   rR   z	Digest %s)rJ   )r7  Úparse_keqv_listÚfilterÚparse_http_listÚget_authorizationrd   r˜   r@  r–   rà   rG   rJ   )r   rÍ   rC  ÚtokenZ	challengeÚchalZauth_valZresprL   rL   rM   rR  E  s    z0AbstractDigestAuthHandler.retry_http_digest_authc             C   s@   d| j |t ¡ f }| d¡tdƒ }t |¡ ¡ }|d d… S )Nz	%s:%s:%s:r  é   é   )rN  Ú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 }|  d¡}|  dd¡}|  dd ¡}W n tk
rJ   d S X |  |¡\}}	|d krfd S | j ||j¡\}
}|
d kr†d S |jd k	r |  |j|¡}nd }d|
||f }d| ¡ |j	f }|d	kr.|| j
krè|  jd
7  _nd
| _|| _
d| 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  r`  ÚqopÚ	algorithmÚMD5Úopaquez%s:%s:%sz%s:%srC  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$  ro   rI   Úget_entity_digestr   r‡   rO  rN  rd  r   )r   rÍ   rX  r  r`  re  rf  rh  ÚHÚKDr
  rA  ZentdigZA1ZA2ZncvalueZcnonceZnoncebitZrespdigr*  rL   rL   rM   rV  \  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 )Nrg  c             S   s   t  |  d¡¡ ¡ S )Nr  )r]  Zmd5r  r_  )ÚxrL   rL   rM   r  ›  ó    z?AbstractDigestAuthHandler.get_algorithm_impls.<locals>.<lambda>ZSHAc             S   s   t  |  d¡¡ ¡ S )Nr  )r]  r^  r  r_  )rn  rL   rL   rM   r    ro  z.Unsupported digest authentication algorithm %rc                s   ˆ d| |f ƒS )Nz%s:%srL   )ra  Úd)rl  rL   rM   r  ¢  ro  )rB   )r   rf  rm  rL   )rl  rM   rj  ˜  s    

z-AbstractDigestAuthHandler.get_algorithm_implsc             C   s   d S )NrL   )r   rI   rX  rL   rL   rM   rk  ¥  s    z+AbstractDigestAuthHandler.get_entity_digest)N)r    r¡   r¢   r‚   rP  r?  rR  rd  rV  rj  rk  rL   rL   rL   rM   r&     s   
	<c               @   s   e Zd ZdZdZdd„ ZdS )r'   rD  iê  c             C   s*   t |jƒd }|  d|||¡}|  ¡  |S )NrR   zwww-authenticate)r   ro   r?  rP  )r   rÍ   rc   rå   ræ   rd   ru   ÚretryrL   rL   rM   rK  ´  s
    
z$HTTPDigestAuthHandler.http_error_401N)r    r¡   r¢   r@  rá   rK  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 }|  d|||¡}|  ¡  |S )Nzproxy-authenticate)ru   r?  rP  )r   rÍ   rc   rå   ræ   rd   ru   rq  rL   rL   rM   rL  Á  s
    
z%ProxyDigestAuthHandler.http_error_407N)r    r¡   r¢   r@  rá   rL  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)rs  )r   ÚlevelrL   rL   rM   Úset_http_debuglevelÍ  s    z'AbstractHTTPHandler.set_http_debuglevelc             C   s   t jj |j| ¡ ¡S )N)rÐ   rØ   ÚHTTPConnectionÚ_get_content_lengthrI   r   )r   rt   rL   rL   rM   rx  Ð  s    z'AbstractHTTPHandler._get_content_lengthc             C   s  |j }|stdƒ‚|jd k	r’|j}t|tƒr8d}t|ƒ‚| d¡sN| dd¡ | d¡s’| d¡s’|  |¡}|d k	r†| dt|ƒ¡ n| dd¡ |}| 	¡ r¸t
|jƒ\}}t|ƒ\}}	| d¡sÎ| d|¡ x2| jjD ]&\}
}|
 ¡ }
| |
¡sØ| |
|¡ 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chunkedrn   )ru   r   rI   rÉ   rÊ   rµ   rˆ   r–   rx  r“   r   r‡   r   rà   r§   r”   )r   rt   ru   rI   ræ   Zcontent_lengthZsel_hostrû   ZselZsel_pathrZ   r   rL   rL   rM   Údo_request_Õ  s>    







zAbstractHTTPHandler.do_request_c       
   
      sT  |j }|stdƒ‚||fd|ji|—Ž}| | j¡ t|jƒ‰ ˆ  ‡ fdd„|j 	¡ D ƒ¡ dˆ d< dd„ ˆ  	¡ D ƒ‰ |j
r®i }d}|ˆ kržˆ | ||< ˆ |= |j|j
|d	 y`y&|j| ¡ |j|jˆ | d
¡d W n, tk
r } zt|ƒ‚W d d }~X Y nX | ¡ }	W n   | ¡  ‚ Y nX |jr>|j ¡  d |_| ¡ |	_|	j|	_|	S )Nzno host givenrJ   c                s   i | ]\}}|ˆ kr||“qS rL   rL   )rì   rí   rî   )rd   rL   rM   rð   	  s    z/AbstractHTTPHandler.do_open.<locals>.<dictcomp>rÃ   Ú
Connectionc             S   s   i | ]\}}||  ¡ “qS rL   )Útitle)rì   rZ   r•   rL   rL   rM   rð     s    zProxy-Authorization)rd   zTransfer-encoding)Zencode_chunked)ru   r   rJ   Zset_debuglevelrs  rÔ   rw   rœ   rd   rz   ry   Z
set_tunnelrt   r   r‡   rI   rˆ   rl   ÚgetresponserÃ   Zsockr   rH   Úreasonræ   )
r   Z
http_classrÍ   Zhttp_conn_argsru   rß   Ztunnel_headersZproxy_auth_hdrÚerrr  rL   )rd   rM   r¯   û  s@    


zAbstractHTTPHandler.do_openN)r   )r    r¡   r¢   r‚   rv  rx  ry  r¯   rL   rL   rL   rM   rr  È  s
   
&rr  c               @   s   e Zd Zdd„ ZejZdS )r)   c             C   s   |   tjj|¡S )N)r¯   rÐ   rØ   rw  )r   rÍ   rL   rL   rM   Ú	http_open@  s    zHTTPHandler.http_openN)r    r¡   r¢   r  rr  ry  rF  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  | |¡ || _|| _d S )N)rr  r‚   Ú_contextÚ_check_hostname)r   rt  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ƒ  rr  ry  rJ  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 ¡ }|| _d S )Nr   )Zhttp.cookiejarÚ	cookiejarZ	CookieJar)r   r„  rÐ   rL   rL   rM   r‚   W  s    
zHTTPCookieProcessor.__init__c             C   s   | j  |¡ |S )N)r„  Zadd_cookie_header)r   rt   rL   rL   rM   rF  ]  s    z HTTPCookieProcessor.http_requestc             C   s   | j  ||¡ |S )N)r„  Zextract_cookies)r   rt   r³   rL   rL   rM   rç   a  s    z!HTTPCookieProcessor.http_response)N)r    r¡   r¢   r‚   rF  rç   rJ  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Ï   i  s    zUnknownHandler.unknown_openN)r    r¡   r¢   rÏ   rL   rL   rL   rM   r.   h  s   c             C   sR   i }xH| D ]@}|  dd¡\}}|d dkrB|d dkrB|dd… }|||< q
W |S )Nú=rR   r   r5  rQ   )r7  )ÚlZparsedZeltrí   rî   rL   rL   rM   rS  m  s    
rS  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|  |¡ d}q|dkrzd}||7 }qW |r”|  |¡ dd„ |D ƒS )	Nrm   Fú\Tr5  ú,c             S   s   g | ]}|  ¡ ‘qS rL   )rE  )rì   ÚpartrL   rL   rM   ú
<listcomp>   s    z#parse_http_list.<locals>.<listcomp>)r\   )ra  Zresr‰  Úescaper	   ZcurrL   rL   rM   rU  w  s4    	


rU  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|  ¡ krXtdƒ‚n
|  |¡S d S )Nr:   z//é   r÷   Ú	localhostz-file:// scheme is supported only on localhost)r‡   ru   Ú	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 d¡d t t ¡ ¡d  ƒt _W n$ tjk
rX   t 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
dd}	| |¡d }
| d|
pbd||	f ¡}|r~t|ƒ\}}|r–|sÂt|ƒ|  ¡ krÂ|r¨d| | }nd| }tt|dƒ||ƒS W n* tk
rî } zt|ƒ‚W d d }~X Y 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Ú	mimetypesru   r‡   r4   rV   ÚstatÚst_sizeÚutilsÚ
formatdateÚst_mtimeÚ
guess_typeÚmessage_from_stringr   Ú_safe_gethostbynamerŽ  r   rG   rl   r   )r   rÍ   Úemailr™  ru   ra   Z	localfileÚstatsrh   ÚmodifiedÚmtyperd   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  | ¡S  t jk
r    d S X d S )N)rÕ   r•  r”  )ru   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
 |¡}W n* tk
r¸ } zt|ƒ‚W d d }~X Y nX t|jƒ\}	}
|	 d¡}ttt	|ƒƒ}|d d… |d  }}|r|d s|dd … }yÐ|  ||||||j¡}|r6dp8d}x:|
D ]2}t|ƒ\}}| ¡ d	kr@|d
kr@| ¡ }q@W | ||¡\}}d}| |j¡d }|r¬|d| 7 }|d k	rÌ|dkrÌ|d| 7 }t |¡}t|||jƒS  |jk
r& } z"td| ƒ}| t  ¡ d ¡‚W d d }~X Y nX d S )Nr   zftp error: no host givenrm   r÷   rQ   rR   rI  ÚDrŠ   )ÚaÚAr½   rI  rp  r§  zContent-type: %s
zContent-length: %d
zftp error: %rr:   )!Úftplibr™  ru   r   r   ÚFTP_PORTr]   r   r   r
   rÕ   r•  rl   r   r‡   r7  r   ÚmapÚconnect_ftprJ   r   rs   ÚupperÚretrfilerŸ  ro   r¢  r   r   Ú
all_errorsÚwith_tracebackÚsysÚexc_info)r   rÍ   rª  r™  ru   r'  r
  r  ræ   rW   ÚattrsÚdirsrN   ÚfwrŠ   Úattrr   rc   Úretrlenrd   r¥  r¦  ÚexcrL   rL   rM   Úftp_openÜ  s\    



zFTPHandler.ftp_openc          	   C   s   t ||||||ddS )NF)Ú
persistent)Ú
ftpwrapper)r   r
  r  ru   r'  rµ  rJ   rL   rL   rM   r­    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   é<   rZ  )ÚcacherJ   ÚsoonestÚdelayÚ	max_conns)r   rL   rL   rM   r‚     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   ÚsetMaxConns"  s    zCacheFTPHandler.setMaxConnsc             C   sr   |||d  |¡|f}|| jkr4t ¡ | j | j|< n,t||||||ƒ| j|< t ¡ | j | j|< |  ¡  | j| S )Nr÷   )Újoinr¾  r[  rÀ  rJ   r¼  Úcheck_cache)r   r
  r  ru   r'  rµ  rJ   r€   rL   rL   rM   r­  %  s    

zCacheFTPHandler.connect_ftpc             C   sÈ   t   ¡ }| j|krTx@t| j ¡ ƒD ].\}}||k r"| j|  ¡  | j|= | j|= q"W tt| j ¡ ƒƒ| _t	| jƒ| j
krÄx6t| j ¡ ƒD ]$\}}|| jkrˆ| j|= | j|= P qˆW tt| j ¡ ƒƒ| _d S )N)r[  r¿  r   rJ   rz   r¾  rÃ   ÚminÚvaluesr_   rÁ  )r   rÂ  rí   rî   rL   rL   rM   rÆ  0  s    

zCacheFTPHandler.check_cachec             C   s4   x| j  ¡ D ]}| ¡  qW | 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,     s   c               @   s   e Zd Zdd„ ZdS )r-   c             C   s~   |j }| dd¡\}}| dd¡\}}t|ƒ}| d¡rNt |¡}|d d… }|sVd}t d|t|ƒf ¡}t	t
 |¡||ƒS )Nú:rR   rˆ  z;base64iùÿÿÿztext/plain;charset=US-ASCIIz$Content-type: %s
Content-length: %d
)ro   r7  r   Úendswithr  Údecodebytesr¢  r   r_   r   ÚioÚBytesIO)r   rÍ   rH   rû   rI   Z	mediatyperd   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   q  s    c             C   s   t | ƒS )N)r	   )rÓ  rL   rL   rM   r3   v  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ƒ }|| _| d¡| _| 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)ZAcceptz*/*)r0  r    r?   r@   rA   r5   r  r˜   rÖ  r×  Úversionr§   Ú_URLopener__tempfilesrV   rk   Ú_URLopener__unlinkÚ	tempcacheÚftpcache)r   r  Zx509ræ   rL   rL   rM   r‚   Œ  s    zURLopener.__init__c             C   s   |   ¡  d S )N)rÃ   )r   rL   rL   rM   Ú__del__¦  s    zURLopener.__del__c             C   s   |   ¡  d S )N)Úcleanup)r   rL   rL   rM   rÃ   ©  s    zURLopener.closec          	   C   sZ   | j rFx2| j D ](}y|  |¡ W q tk
r4   Y qX qW | j d d …= | jrV| j ¡  d S )N)rÙ  rÚ  rl   rÛ  rÉ  )r   rN   rL   rL   rM   rÞ  ¬  s    
zURLopener.cleanupc             G   s   | j  |¡ d S )N)r§   r\   )r   rÆ   rL   rL   rM   Ú	addheaderº  s    zURLopener.addheaderc          
   C   sl  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| }|| _	| 
dd¡}t| |ƒrÆ|dkrä|rØ|  |||¡S |  ||¡S y,|d k rþt| |ƒ|ƒS t| |ƒ||ƒS W nV ttfk
r,   ‚ Y n< tk
rf } ztd	|ƒ t ¡ d
 ¡‚W d d }~X Y 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   rl   r±  r²  r³  )r   rÌ   rI   ra   rd   rc   ÚurltyperH   r  Ú	proxyhostru   r‡   rZ   ræ   rL   rL   rM   rG   À  s<    




zURLopener.openc             C   s   t |ƒ\}}tdd|ƒ‚d S )Nz	url errorzunknown url type)r   rl   )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   rl   )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˜|rF|dkr˜y.|  |¡}| ¡ }| ¡  tt|ƒd ƒ|fS  t	k
r– }	 zW d d }	~	X Y nX |  
||¡}z>| ¡ }
|rÀt
|dƒ}nrt|ƒ\}}t|pÔdƒ\}}t|pädƒ\}}t|pôdƒ\}}tj |¡d }t |¡\}}| j |¡ t |d¡}z¤||
f}| jd k	rR|| j|< d}d}d}d}d|
krxt|
d	 ƒ}|rŠ||||ƒ xH| |¡}|sžP |t|ƒ7 }| |¡ |d7 }|rŒ||||ƒ qŒW W d | ¡  X W d | ¡  X |dkr||k rtd
||f |ƒ‚|S )NrN   rR   rO   rm   i    rQ   r   zcontent-lengthzContent-Lengthz1retrieval incomplete: got only %i out of %i bytes)r   r   rÛ  r   r  rU   rÃ   r4   r   rl   rG   r   r   rV   rW   ÚsplitextrY   ZmkstemprÙ  r\   Úfdopenr]   r^   r_   r`   r   )r   rH   ra   rb   rI   rŠ   Zurl1rc   rž   ræ   rd   re   ZgarbagerW   ÚsuffixÚfdrf   rg   rh   r^   ri   rj   rL   rL   rM   Úretrieveï  sj    






zURLopener.retrievec             C   s(  d }d }t |tƒr<t|ƒ\}}|r6t|ƒ\}}t|ƒ}|}nt|\}}t|ƒ\}}t|ƒ\}	}
|
}d }|	 ¡ dkrvd }n:t|
ƒ\}}
|r’t|ƒ\}}|r¤d|	||
f }t|ƒr°|}|s¾tddƒ‚|ràt|ƒ}t	 
| ¡ ¡ d¡}nd }|rt|ƒ}t	 
| ¡ ¡ d¡}nd }||ƒ}i }|r*d| |d< |r<d| |d< |rJ||d	< d
|d< x| jD ]\}}|||< qZW |d k	r”d|d< | d|||¡ n|jd||d y| ¡ }W n" tjjk
rÒ   tdƒ‚Y nX d|j  krîdk rn nt||jd| |jƒS |  ||j|j|j|j|¡S d S )NrÐ   z	%s://%s%sz
http errorzno host givenr  zBasic %szProxy-AuthorizationrD  rn   rÃ   rz  z!application/x-www-form-urlencodedzContent-TyperŒ   r   )rd   z$http protocol error: bad status linerä   i,  zhttp:)rÉ   rÊ   r   r   r
   r   rs   r  rl   r  r  r  r  r§   rt   r|  rÐ   rØ   ZBadStatusLiner   Ústatusr   ræ   Ú
http_errorrc   r}  )r   Zconnection_factoryrH   rI   Zuser_passwdZproxy_passwdru   r‡   Zrealhostrã  r‹   Z
proxy_authrC  Z	http_connrd   Úheaderr   r³   rL   rL   rM   Ú_open_generic_http0  sr    
 

zURLopener._open_generic_httpc             C   s   |   tjj||¡S )N)rí  rÐ   rØ   rw  )r   rH   rI   rL   rL   rM   Ú	open_httpŒ  s    zURLopener.open_httpc       
      C   sb   d| }t | |ƒrPt| |ƒ}|d kr6||||||ƒ}	n|||||||ƒ}	|	rP|	S |  |||||¡S )Nzhttp_error_%d)r´   rŽ   rÒ   )
r   rH   rc   ÚerrcodeÚerrmsgrd   rI   rZ   r~   rf   rL   rL   rM   rë    s    

 zURLopener.http_errorc             C   s   |  ¡  t||||d ƒ‚d S )N)rÃ   r   )r   rH   rc   rï  rð  rd   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   ru   rL   rL   rM   Ú_https_connection¦  s    zURLopener._https_connectionc             C   s   |   | 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…  ¡ dkrPtdƒ‚n
|  |¡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   rs   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 |¡}W n0 tk
rb } zt|j|j	ƒ‚W d d }~X Y nX |j
}	|jj|jdd}
| |¡d }| d|p–d|	|
f ¡}|sÔ|}|d d… dkrÂd| }tt|d	ƒ||ƒS t|ƒ\}}|sPt |¡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   rV   rš  rl   r   Ústrerrorra   r›  rœ  r  rž  rŸ  r   r   rG   r   rÕ   r•  r  ÚthishostrB   )r   rH   r¢  r™  ru   rN   Z	localnamer£  Úerh   r¤  r¥  rd   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	 
|¡}|sždd l}|j}nt|ƒ}t|ƒ\}}	t|ƒ}| d¡}
|
d d… |
d  }
}|
rò|
d sò|
dd … }
|
r
|
d s
d|
d< |||d |
¡f}t| jƒtkrfx8t| jƒD ]*}||kr8| j| }| j|= | ¡  q8W yæ|| jkrŠt|||||
ƒ| j|< |s–d}nd	}x:|	D ]2}t|ƒ\}}| ¡ d
kr |dkr | ¡ }q W | j|  ||¡\}}| d| ¡d }d}|r|d| 7 }|d k	r4|dkr4|d| 7 }t |¡}t||d| ƒS  tƒ k
rŒ } ztd| ƒ  t! "¡ d ¡‚W d d }~X Y nX d S )NzCftp error: proxy support for ftp protocol currently not implementedr   zftp error: no host givenrm   r÷   rQ   rR   r§  rI  rŠ   )r¨  r©  r½   rI  rp  r§  zftp:zContent-Type: %s
zContent-Length: %d
zftp error %rr:   )#rÉ   rÊ   r   r™  r   r   r   r   r
   rÕ   r•  rª  r«  r]   r   r7  rÅ  r_   rÜ  ÚMAXFTPCACHEr   rÃ   r¼  r   rs   r®  r¯  rŸ  r¢  r   r   Ú	ftperrorsr±  r²  r³  )r   rH   r™  ru   rW   r'  r
  r  rª  r´  rµ  rN   r€   rí   rî   rŠ   r·  r   rc   r¸  r¥  rd   r¦  rL   rL   rM   Úopen_ftpØ  sp    
  

  

 


zURLopener.open_ftpc       	   
   C   s<  t |tƒstdƒ‚y| dd¡\}}W n tk
rD   tddƒ‚Y nX |sNd}| d¡}|dkrŽd	||d … krŽ||d d … }|d |… }nd
}g }| dt 	dt 
t ¡ ¡¡ ¡ | d| ¡ |dkrät | d¡¡ d¡}nt|ƒ}| dt|ƒ ¡ | d
¡ | |¡ d |¡}t |¡}t |¡}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…  rm   zDate: %sz%a, %d %b %Y %H:%M:%S GMTzContent-type: %sr  r  zlatin-1zContent-Length: %dÚ
)rÉ   rÊ   r   r7  rB   rl   Úrfindr\   r[  ZstrftimeZgmtimer  rÎ  r  r  r
   r_   rÅ  r¢  r   rÏ  ÚStringIOr   )	r   rH   rI   rŠ   Zsemirø   ræ   rd   ÚfrL   rL   rM   Ú	open_data  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,   

$


A\


	 :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Æ   r/  rL   rL   rM   r‚   ?  s    zFancyURLopener.__init__c             C   s   t ||d| |ƒS )Nzhttp:)r   )r   rH   rc   rï  rð  rd   rL   rL   rM   rÒ   E  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 |  ||||||¡}|S d| _ X d S )NrR   Úhttp_error_500iô  z)Internal Server Error: Redirect Recursionr   )r  r  r´   r  rÒ   Úredirect_internal)	r   rH   rc   rï  rð  rd   rI   r¼   rf   rL   rL   rM   r  I  s    
zFancyURLopener.http_error_302c       	      C   sx   d|kr|d }nd|kr$|d }nd S |  ¡  t| jd | |ƒ}t|ƒ}|jdkrnt|||d|  ||ƒ‚|  |¡S )Nrô   rõ   rÌ  )rÐ   r‘   rö   rm   z( Redirection to url '%s' is not allowed.)rÃ   r   rŠ   r   rû   r   rG   )	r   rH   rc   rï  rð  rd   rI   rò   r   rL   rL   rM   r  [  s    


z FancyURLopener.redirect_internalc             C   s   |   ||||||¡S )N)r  )r   rH   rc   rï  rð  rd   rI   rL   rL   rM   r  w  s    zFancyURLopener.http_error_301c             C   s   |   ||||||¡S )N)r  )r   rH   rc   rï  rð  rd   rI   rL   rL   rM   r  {  s    zFancyURLopener.http_error_303c             C   s2   |d kr|   ||||||¡S |  |||||¡S d S )N)r  rÒ   )r   rH   rc   rï  rð  rd   rI   rL   rL   rM   r    s    zFancyURLopener.http_error_307Fc             C   sÈ   d|krt  | |||||¡ |d }t d|¡}	|	sHt  | |||||¡ |	 ¡ \}
}|
 ¡ dkrtt  | |||||¡ |sŒt  | |||||¡ d| j d }|d kr²t| |ƒ||ƒS t| |ƒ|||ƒS d S )Nzwww-authenticatez![ 	]*([^ 	]+)[ 	]+realm="([^"]*)"r4  Zretry_Ú_basic_auth)r8   rÒ   rG  Úmatchr:  rs   rŠ   rŽ   )r   rH   rc   rï  rð  rd   rI   rq  Ústuffr  rû   r  rZ   rL   rL   rM   rK  †  s&    





zFancyURLopener.http_error_401c             C   sÈ   d|krt  | |||||¡ |d }t d|¡}	|	sHt  | |||||¡ |	 ¡ \}
}|
 ¡ dkrtt  | |||||¡ |sŒt  | |||||¡ d| j d }|d kr²t| |ƒ||ƒS t| |ƒ|||ƒS d S )Nzproxy-authenticatez![ 	]*([^ 	]+)[ 	]+realm="([^"]*)"r4  Zretry_proxy_r  )r8   rÒ   rG  r  r:  rs   rŠ   rŽ   )r   rH   rc   rï  rð  rd   rI   rq  r  r  rû   r  rZ   rL   rL   rM   rL  Ÿ  s&    





zFancyURLopener.http_error_407c             C   sÄ   t |ƒ\}}d| | }| jd }t|ƒ\}}	t |	ƒ\}	}
|	 d¡d }|	|d … }	|  |	||¡\}}|sr|srd S dt|ddt|dd|	f }	d|	 |
 | jd< |d kr´|  |¡S |  ||¡S d S )Nzhttp://rÐ   ú@rR   z%s:%s@%srm   )rù   )r   r  r   r·   Úget_user_passwdr	   rG   )r   rH   r  rI   ru   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 |	ƒ\}	}
|	 d¡d }|	|d … }	|  |	||¡\}}|sr|srd S dt|ddt|dd|	f }	d|	 |
 | jd< |d kr´|  |¡S |  ||¡S d S )Nzhttps://r‘   r	  rR   z%s:%s@%srm   )rù   )r   r  r   r·   r
  r	   rG   )r   rH   r  rI   ru   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 |ƒ\}}| d¡d }||d … }|  |||¡\}}|sD|sDd S dt|ddt|dd|f }d| | }	|d kr€|  |	¡S |  |	|¡S d S )Nr	  rR   z%s:%s@%srm   )rù   zhttp://)r   r·   r
  r	   rG   )
r   rH   r  rI   ru   r‡   r½   r
  r  rò   rL   rL   rM   r<  Ü  s     
z$FancyURLopener.retry_http_basic_authc       
      C   s   t |ƒ\}}| d¡d }||d … }|  |||¡\}}|sD|sDd S dt|ddt|dd|f }d| | }	|d kr€|  |	¡S |  |	|¡S d S )Nr	  rR   z%s:%s@%srm   )rù   zhttps://)r   r·   r
  r	   rG   )
r   rH   r  rI   ru   r‡   r½   r
  r  rò   rL   rL   rM   Úretry_https_basic_authê  s     
z%FancyURLopener.retry_https_basic_authr   c             C   s`   |d |  ¡  }|| jkr2|r(| j|= n
| j| S |  ||¡\}}|sJ|rX||f| j|< ||fS )Nr	  )rs   r  Úprompt_user_passwd)r   ru   r  rË  r€   r
  r  rL   rL   rM   r
  ø  s    


 zFancyURLopener.get_user_passwdc             C   sT   dd l }y,td||f ƒ}|  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   ru   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  rK  rL  r  r  r<  r  r
  r  rL   rL   rL   rM   r9   <  s"   



 
 





c               C   s   t d krt d¡a t S )Nr  )Ú
_localhostrÕ   r•  rL   rL   rL   rM   r  	  s    
r  c               C   sP   t d krLytt t ¡ ¡d ƒa W n( tjk
rJ   tt 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ù  &	  s    rù  c               C   s   t d krt d¡a t S )Nrm   )Ú
_noheadersr¢  r   rL   rL   rL   rM   Ú	noheaders/	  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|  ¡  W n   |  	¡  ‚ Y nX d S )Nr   )
r
  r  ru   r'  rµ  rJ   ÚrefcountÚ	keepaliveÚinitrÃ   )r   r
  r  ru   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
¡ d | j¡}| j |¡ d S )Nr   r÷   )rª  ÚbusyZFTPrö   Zconnectru   r'  rJ   Zloginr
  r  rÅ  rµ  Úcwd)r   rª  Z_targetrL   rL   rM   r  L	  s    
zftpwrapper.initc          
   C   s¶  dd l }|  ¡  |dkr"d}d}nd| }d}y| j |¡ W n* |jk
rh   |  ¡  | j |¡ Y nX d }|ræ|sæyd| }| j |¡\}}W nR |jk
rä } z2t|ƒd d… dkrÔt	d	| ƒ 
t ¡ d
 ¡‚W d d }~X Y nX |s€| j d¡ |rl| j ¡ }	zJy| j |¡ W n4 |jk
rN } zt	d	| ƒ|‚W d d }~X Y nX W d | j |	¡ X d| }nd}| j |¡\}}d| _t| d¡| jƒ}
|  jd7  _| ¡  |
|fS )Nr   )rp  r§  zTYPE ArR   zTYPE zRETR rŒ  Z550zftp error: %rr:   zLIST ZLISTr—  )rª  Úendtransferrö   Zvoidcmdr°  r  ZntransfercmdZ
error_permrÊ   r   r±  r²  r³  Úpwdr  r  r   ZmakefileÚ
file_closer  rÃ   )r   rN   rŠ   rª  ÚcmdÚisdirrÊ  r¸  r}  r  ZftpobjrL   rL   rM   r¯  U	  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|  ¡  d S )NFr   )r  r  Ú
real_close)r   rL   rL   rM   rÃ   …	  s    
zftpwrapper.closec             C   s2   |   ¡  |  jd8  _| jdkr.| js.|  ¡  d S )NrR   r   )r  r  r  r#  )r   rL   rL   rM   r   Š	  s    zftpwrapper.file_closec             C   s2   |   ¡  y| 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¼  9	  s    
	-r¼  c              C   s¼   i } xBt j ¡ D ]4\}}| ¡ }|r|dd … dkr|| |d d… < qW dt jkr^|  dd ¡ xXt j ¡ D ]J\}}|dd … dkrj| ¡ }|r || |d d… < qj|  |d d… d ¡ qjW | S )NiúÿÿÿÚ_proxyZREQUEST_METHODrÐ   )rV   Úenvironrz   rs   rš   )r  rZ   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„ | d¡D ƒ}xP|D ]H}|rb| d¡}t |¡}d	| }t ||tj¡s¦t || tj¡rbdS qbW dS )
NÚnor   Ú*rR   c             S   s   g | ]}|  ¡ ‘qS rL   )rE  )rì   r  rL   rL   rM   rŠ  Ë	  s    z,proxy_bypass_environment.<locals>.<listcomp>rˆ  Ú.z
(.+\.)?%s$)	r&  ri  r   r7  ÚlstriprG  r‹  r  rI  )ru   r  Zno_proxyÚhostonlyr'  Zno_proxy_listrZ   ÚpatternrL   rL   rM   Úproxy_bypass_environment·	  s&    


r-  c          	   C   s  ddl m } t| ƒ\}}dd„ }d| kr4|d r4dS d }xÞ| dd	¡D ]Î}|sPqFt d
|¡}|d k	r|d krœyt |¡}||ƒ}W n tk
rš   wFY nX || d¡ƒ}	| d¡}
|
d krÖd| d¡ 	d¡d  }
nt
|
dd … ƒ}
d|
 }
||
? |	|
? krdS qF|| |ƒrFdS qFW dS )Nr   )Úfnmatchc             S   sh   |   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 )
Nr)  ré   r   é   rR   rZ  r:   rY  rŒ  )r7  r   r¬  r]   r_   )ZipAddrr&  rL   rL   rM   Úip2numê	  s
    
z,_proxy_bypass_macosx_sysconf.<locals>.ip2numr)  Zexclude_simpleTÚ
exceptionsrL   z(\d+(?:\.\d+)*)(/\d+)?rR   r:   rY  é    F)r.  r   r˜   rG  r  rÕ   r•  rl   ÚgroupÚcountr]   )ru   Úproxy_settingsr.  r+  r'  r0  ZhostIPr   ró   r*  ÚmaskrL   rL   rM   Ú_proxy_bypass_macosx_sysconfÚ	  s:     



r7  Údarwin)Ú_get_proxy_settingsÚ_get_proxiesc             C   s   t ƒ }t| |ƒS )N)r9  r7  )ru   r5  rL   rL   rM   Úproxy_bypass_macosx_sysconf
  s    r;  c               C   s   t ƒ S )N)r:  rL   rL   rL   rM   Úgetproxies_macosx_sysconf
  s    r<  c             C   s    t ƒ }|rt| |ƒS t| ƒS d S )N)r&  r-  r;  )ru   r  rL   rL   rM   r  '
  s    
r  c               C   s   t ƒ p
tƒ S )N)r&  r<  rL   rL   rL   rM   r5   4
  s    c           
   C   s  i } ydd l }W n tk
r$   | S X yÎ| |jd¡}| |d¡d }|rêt| |d¡d ƒ}d|kr¬x‚| d¡D ]4}| dd¡\}}t d|¡sžd	||f }|| |< qrW n>|d d
… dkrÆ|| d< n$d| | d< d| | d< d| | d< | 	¡  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://%srQ  zhttp:rÐ   z	http://%sz
https://%sr‘   zftp://%srö   )ÚwinregÚImportErrorÚOpenKeyÚHKEY_CURRENT_USERÚQueryValueExrÊ   r7  rG  r  ZCloserl   rB   rµ   )r  r>  ÚinternetSettingsÚproxyEnableZproxyServerÚpr¾   ZaddressrL   rL   rM   Úgetproxies_registry9
  s8    

rF  c               C   s   t ƒ p
tƒ S )N)r&  rF  rL   rL   rL   rM   r5   f
  s    c             C   sx  ydd l }W n tk
r    dS X y6| |jd¡}| |d¡d }t| |d¡d ƒ}W n tk
rl   dS X |rv|szdS t| ƒ\}}|g} y t 	|¡}||krª|  
|¡ W n tk
rÀ   Y nX y t |¡}||krà|  
|¡ W n tk
rö   Y nX | d¡}xp|D ]h}	|	dkr$d|kr$dS |	 dd	¡}	|	 d
d¡}	|	 dd¡}	x$| D ]}
t |	|
tj¡rNdS qNW qW dS )Nr   z;Software\Microsoft\Windows\CurrentVersion\Internet Settingsr=  ZProxyOverriderû  z<local>r)  rR   z\.r(  z.*ú?)r>  r?  r@  rA  rB  rÊ   rl   r   rÕ   r•  r\   Zgetfqdnr7  rñ   rG  r  rI  )ru   r>  rC  rD  ZproxyOverrideZrawHostr'  ZaddrZfqdnr+  r•   rL   rL   rM   Úproxy_bypass_registryo
  sR    







rH  c             C   s    t ƒ }|rt| |ƒS t| ƒS d S )N)r&  r-  rH  )ru   r  rL   rL   rM   r  ¡
  s    
)NNN)N)}r  rº   r¢  r]  Zhttp.clientrÐ   rÏ  rV   r(  rG  rÕ   rü   r²  r[  rY   rS   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   r?  rC   Ú__all__Úversion_infor¦   rF   rÖ   r0   r1   r[   r6   r7   rH  ÚASCIIrq   rv   r   r   r2   r   r/   r   r   r  r   r    r!   r"   r#   r$   r%   Úurandomr\  r&   r'   r(   rr  r)   r´   rØ   rE   r\   r   r.   rS  rU  r*   r¡  r+   r,   r-   rø  rZ   Z
nturl2pathr4   r3   rÜ  r8   r9   r  r  r  rö  r  rù  r  r  r¼  r&  r-  r7  ÚplatformZ_scproxyr9  r:  r;  r<  r  r5   rF  rH  rL   rL   rL   rM   Ú<module>T   sè   P
T
?n $q*@
P v

+3:5!   @ W

_
#<

-	2
