<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
B
    YI~d‹ ã            !   @   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   ú3/opt/alt/python37/lib64/python3.7/urllib/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   sN   ||krdS |d |d kr dS |d }|dd … dkr@|d7 }|d   |¡S )NTr   FrR   rQ   r÷   )r¸   )r   ÚbaseÚtestÚprefixrL   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)r.  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õ   r0  r  r  r  rL   rL   rM   r/  š  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   r0  ¤  s
    
z-HTTPPasswordMgrWithPriorAuth.is_authenticated)F)F)r    r¡   r¢   r‚   r   r/  r0  Ú__classcell__rL   rL   )r.  rM   r"     s   

c               @   sT   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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 |¡D ]6}| ¡ \}}}|dkr:t dtd¡ ||fV  d}qW |sp|rb| ¡ d }nd}|d fV  d S )NF)ú"ú'zBasic Auth Realm was unquotedé   Tr   rm   )r#   ÚrxÚfinditerÚgroupsr?   r@   ÚUserWarningÚsplit)r   ÚheaderZfound_challengeÚmorû   r	   r  rL   rL   rM   Ú_parse_realmÇ  s    
z%AbstractBasicAuthHandler._parse_realmc       	      C   s~   |  |¡}|sd S d }xL|D ]D}x>|  |¡D ]0\}}| ¡ dkrF|}q,|d k	r,|  |||¡S q,W qW |d k	rztd|f ƒ‚d S )NÚbasiczBAbstractBasicAuthHandler does not support the following scheme: %r)Zget_allr<  rs   Úretry_http_basic_authrB   )	r   Úauthreqru   rÍ   rd   Zunsupportedr:  rû   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 )Nr0  ÚAuthorizationz{0}:{1}zBasic {})r´   r  r0  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 )Nr0  rä   i,  TF)r´   r  rå   r/  ro   )r   rÍ   r³   rL   rL   rM   rç     s
    z&AbstractBasicAuthHandler.http_response)N)r    r¡   r¢   ÚreÚcompileÚIr5  r‚   r<  r@  r>  rG  rç   Úhttps_requestrè   rL   rL   rL   rM   r#   ¬  s   
c               @   s   e Zd ZdZdd„ ZdS )r$   rE  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¢   rA  rL  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¢   rA  rM  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‚   D  s    
z"AbstractDigestAuthHandler.__init__c             C   s
   d| _ d S )Nr   )rN  )r   rL   rL   rM   Úreset_retry_countM  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digestr=  zEAbstractDigestAuthHandler does not support the following scheme: '%s')r˜   rN  r   ro   r9  rs   Úretry_http_digest_authrB   )r   rA  ru   rÍ   rd   r?  rû   rL   rL   rM   r@  P  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   )r9  Úparse_keqv_listÚfilterÚparse_http_listÚget_authorizationrd   r˜   rA  r–   rà   rG   rJ   )r   rÍ   rD  ÚtokenZ	challengeÚchalZauth_valZresprL   rL   rM   rS  d  s    z0AbstractDigestAuthHandler.retry_http_digest_authc             C   s@   d| j |t ¡ f }| d¡tdƒ }t |¡ ¡ }|d d… S )Nz	%s:%s:%s:r  é   é   )rO  ÚtimeZctimer  Ú_randombytesÚhashlibÚsha1Ú	hexdigest)r   ÚnonceÚsÚbÚdigrL   rL   rM   Ú
get_cnoncep  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è|	||ƒd|||ƒf ƒ}n~d	| 
d
¡krZ|| jkr|  jd7  _nd| _|| _d| j }|  |¡}d|||d	||ƒf }|	||ƒ|ƒ}ntd| ƒ‚d|
|||j	|f }|rŒ|d| 7 }|rž|d| 7 }|d| 7 }|rÀ|d||f 7 }|S )Nr  ra  ÚqopÚ	algorithmÚMD5Úopaquez%s:%s:%sz%s:%srD  ú,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‡   r9  rP  rO  re  r   )r   rÍ   rY  r  ra  rf  rg  ri  ÚHÚKDr
  rB  ZentdigZA1ZA2ZrespdigZncvalueZcnonceZnoncebitr(  rL   rL   rM   rW  {  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 )Nrh  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`  )rp  rL   rL   rM   r  ¾  rq  z.Unsupported digest authentication algorithm %rc                s   ˆ d| |f ƒS )Nz%s:%srL   )rb  Úd)rn  rL   rM   r  Ã  rq  )rB   )r   rg  ro  rL   )rn  rM   rl  ¹  s    

z-AbstractDigestAuthHandler.get_algorithm_implsc             C   s   d S )NrL   )r   rI   rY  rL   rL   rM   rm  Æ  s    z+AbstractDigestAuthHandler.get_entity_digest)N)r    r¡   r¢   r‚   rQ  r@  rS  re  rW  rl  rm  rL   rL   rL   rM   r&   9  s   
	>c               @   s   e Zd ZdZdZdd„ ZdS )r'   rE  iê  c             C   s*   t |jƒd }|  d|||¡}|  ¡  |S )NrR   zwww-authenticate)r   ro   r@  rQ  )r   rÍ   rc   rå   ræ   rd   ru   ÚretryrL   rL   rM   rL  Õ  s
    
z$HTTPDigestAuthHandler.http_error_401N)r    r¡   r¢   rA  rá   rL  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@  rQ  )r   rÍ   rc   rå   ræ   rd   ru   rs  rL   rL   rM   rM  â  s
    
z%ProxyDigestAuthHandler.http_error_407N)r    r¡   r¢   rA  rá   rM  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)ru  )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   rz  ñ  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–   rz  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ð   7  s    zProxy-Authorization)rd   zTransfer-encoding)Zencode_chunked)ru   r   rJ   Zset_debuglevelru  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‚   rx  rz  r{  r¯   rL   rL   rL   rM   rt  é  s
   
&rt  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Ø   ry  )r   rÍ   rL   rL   rM   Ú	http_opena  s    zHTTPHandler.http_openN)r    r¡   r¢   r  rt  r{  rG  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)rt  r‚   Ú_contextÚ_check_hostname)r   rv  r>   Úcheck_hostnamerL   rL   rM   r‚   j  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_openo  s    zHTTPSHandler.https_open)r   NN)r    r¡   r¢   r‚   r…  rt  r{  rK  rL   rL   rL   rM   rE   h  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‚   x  s    
zHTTPCookieProcessor.__init__c             C   s   | j  |¡ |S )N)r†  Zadd_cookie_header)r   rt   rL   rL   rM   rG  ~  s    z HTTPCookieProcessor.http_requestc             C   s   | j  ||¡ |S )N)r†  Zextract_cookies)r   rt   r³   rL   rL   rM   rç   ‚  s    z!HTTPCookieProcessor.http_response)N)r    r¡   r¢   r‚   rG  rç   rK  rè   rL   rL   rL   rM   r   w  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 ]@}|  dd¡\}}|d dkrB|d dkrB|dd… }|||< q
W |S )Nú=rR   r   r2  rQ   )r9  )ÚlZparsedZeltrí   rî   rL   rL   rM   rT  Ž  s    
rT  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ú\Tr2  rj  c             S   s   g | ]}|  ¡ ‘qS rL   )rF  )rì   ÚpartrL   rL   rM   ú
<listcomp>Á  s    z#parse_http_list.<locals>.<listcomp>)r\   )rb  ZresrŠ  Úescaper	   ZcurrL   rL   rM   rV  ˜  s4    	


rV  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//r4  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   rJ  ÚDrŠ   )ÚaÚAr½   rJ  rr  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‡   r9  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­  2  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   é<   r[  )ÚcacherJ   ÚsoonestÚdelayÚ	max_conns)r   rL   rL   rM   r‚   9  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   ÚsetMaxConnsC  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­  F  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Æ  Q  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_cachee  s    
zCacheFTPHandler.clear_cacheN)	r    r¡   r¢   r‚   rÃ  rÄ  r­  rÆ  rË  rL   rL   rL   rM   r,   6  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   rj  z;base64iùÿÿÿztext/plain;charset=US-ASCIIz$Content-type: %s
Content-length: %d
)ro   r9  r   Úendswithr  Údecodebytesr¢  r   r_   r   ÚioÚBytesIO)r   rÍ   rH   rû   rI   Z	mediatyperd   rL   rL   rM   Ú	data_openl  s    


zDataHandler.data_openN)r    r¡   r¢   rÑ  rL   rL   rL   rM   r-   k  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ƒ }|| _| 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Úclassr4  )Ú
stacklevelÚkey_fileÚ	cert_filez
User-Agent)ZAcceptz*/*)r.  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-AuthorizationrE  rn   rÃ   r|  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_authrD  Z	http_connrd   r:  r   r³   rL   rL   rM   Ú_open_generic_httpQ  sr    
 

zURLopener._open_generic_httpc             C   s   |   tjj||¡S )N)rì  rÐ   rØ   ry  )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//r4  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§  rJ  rŠ   )r¨  r©  r½   rJ  rr  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   r9  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 implementedrj  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   r9  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_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,   

$


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Ò   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 |  ||||||¡}|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  j  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  ˜  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="([^"]*)"r=  Zretry_Ú_basic_auth)r8   rÒ   rH  Úmatchr7  rs   rŠ   rŽ   )r   rH   rc   rî  rï  rd   rI   rs  Ústuffr  rû   r  rZ   rL   rL   rM   rL  §  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="([^"]*)"r=  Zretry_proxy_r  )r8   rÒ   rH  r  r7  rs   rŠ   rŽ   )r   rH   rc   rî  rï  rd   rI   rs  r  r  rû   r  rZ   rL   rL   rM   rM  À  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  rL  rM  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  4	  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ø  G	  s    rø  c               C   s   t d krt d¡a t S )Nrm   )Ú
_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|  ¡  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  m	  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   )rr  r§  zTYPE ArR   zTYPE zRETR r4  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¯  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|  ¡  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¼  Z	  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| ƒ\}}xd| d¡D ]V}| ¡ }|r\| d¡}| ¡ }||ksŽ| |kr’dS d| }| |¡s®|  |¡r\dS q\W dS )NÚnoFÚ*Trj  Ú.)r%  rk  rs   r   r9  rF  ÚlstriprÍ  )ru   r  Zno_proxyÚhostonlyr'  rZ   rL   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   r[  r:   rZ  r4  )r9  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:   rZ  é    F)r,  r   r˜   rH  r  rÕ   r•  rl   ÚgroupÚcountr]   )ru   Úproxy_settingsr,  r*  r'  r.  ZhostIPr   ró   r(  ÚmaskrL   rL   rM   Ú_proxy_bypass_macosx_sysconfý	  s:     



r5  Údarwin)Ú_get_proxy_settingsÚ_get_proxiesc             C   s   t ƒ }t| |ƒS )N)r7  r5  )ru   r3  rL   rL   rM   Úproxy_bypass_macosx_sysconf<
  s    r9  c               C   s   t ƒ S )N)r8  rL   rL   rL   rM   Úgetproxies_macosx_sysconf@
  s    r:  c             C   s    t ƒ }|rt| |ƒS t| ƒS d S )N)r%  r+  r9  )ru   r  rL   rL   rM   r  J
  s    
r  c               C   s   t ƒ p
tƒ S )N)r%  r:  rL   rL   rL   rM   r5   W
  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://%srR  zhttp:rÐ   z	http://%sz
https://%sr‘   zftp://%srö   )ÚwinregÚImportErrorÚOpenKeyÚHKEY_CURRENT_USERÚQueryValueExrÊ   r9  rH  r  ZCloserl   rB   rµ   )r  r<  ÚinternetSettingsÚproxyEnableZproxyServerÚpr¾   ZaddressrL   rL   rM   Úgetproxies_registry\
  s8    

rD  c               C   s   t ƒ p
tƒ S )N)r%  rD  rL   rL   rL   rM   r5   ‰
  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>  r?  r@  rÊ   rl   r   rÕ   r•  r\   Zgetfqdnr9  rñ   rH  r  rJ  )ru   r<  rA  rB  ZproxyOverrideZrawHostr'  ZaddrZfqdnr)  r•   rL   rL   rM   Úproxy_bypass_registry’
  sR    







rF  c             C   s    t ƒ }|rt| |ƒS t| ƒS d S )N)r%  r+  rF  )ru   r  rL   rL   rM   r  Ä
  s    
)NNN)N)}r  rº   r¢  r^  Zhttp.clientrÐ   rÏ  rV   Ú	posixpathrH  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   rI  ÚASCIIrq   rv   r   r   r2   r   r/   r   r   r  r   r    r!   r"   r#   r$   r%   Úurandomr]  r&   r'   r(   rt  r)   r´   rØ   rE   r\   r   r.   rT  rV  r*   r¡  r+   r,   r-   r÷  rZ   Z
nturl2pathr4   r3   rÜ  r8   r9   r  r  r  rõ  r  rø  r  r  r¼  r%  r+  r5  ÚplatformZ_scproxyr7  r8  r9  r:  r  r5   rD  rF  rL   rL   rL   rM   Ú<module>T   sè   P
T
?n $q*@
o v

+3:5!   @ W

_
%<

-	2
