
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    ¡ê,aÒŒ ã                !   @   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* z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/python38/lib64/python3.8/urllib/request.pyr0   ‹   s2    < ÿÿ
þ



c                 C   s   | a d S ©N)rF   )rK   rL   rL   rM   r1   à   s    c              
   C   s:  t | ƒ\}}t t| |ƒ¡�î}| ¡ }|dkrN|sNtj |¡|fW  5 Q R £ S |r^t|dƒ}nt	j
dd�}|j}t |¡ |�‚ ||f}	d}
d}d}d}d|kr¬t|d	 ƒ}|r¼|||
|ƒ | |
¡}|sÌqü|t|ƒ7 }| |¡ |d
7 }|r¼|||
|ƒ q¼W 5 Q R X W 5 Q R X |dk�r6||k �r6td||f |	ƒ‚|	S )NÚfileÚwbF)Údeleteé    éÿÿÿÿr   úcontent-lengthúContent-Lengthé   ú1retrieval 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_typer\   ÚfpÚheadersÚtfpÚresultÚbsÚsizerc   ÚblocknumÚblockrL   rL   rM   r6   å   sH    


"ÿþc               	   C   sD   t D ](} zt | ¡ W q tk
r*   Y qX qt d d …= tr@d ad S rN   )r`   r[   Ú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 )NrV   Ú ÚHost)Úfull_urlr   Ú
get_headerÚ_cut_port_reÚsubÚlower)ÚrequestrH   ÚhostrL   rL   rM   Úrequest_host3  s    r{   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   sl   || _ i | _i | _d | _|| _d | _| ¡ D ]\}}|  ||¡ q,|d krRt| ƒ}|| _	|| _
|rh|| _d S rN   )rt   ri   Úunredirected_hdrsÚ_datarI   Ú_tunnel_hostÚitemsÚ
add_headerr{   Úorigin_req_hostÚunverifiableÚmethod)	ÚselfrH   rI   ri   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   rt   W  s    zRequest.full_urlc                 C   s(   t |ƒ| _t| jƒ\| _| _|  ¡  d S rN   )r   rŠ   r   rˆ   Ú_parse©r„   rH   rL   rL   rM   rt   ]  s    
c                 C   s   d | _ d | _d| _d S ©Nrr   )rŠ   rˆ   Úselectorr‹   rL   rL   rM   rt   d  s    c                 C   s   | j S rN   )r}   r‹   rL   rL   rM   rI   j  s    zRequest.datac                 C   s(   || j kr$|| _ |  d¡r$|  d¡ d S )NúContent-length)r}   Ú
has_headerÚremove_header)r„   rI   rL   rL   rM   rI   n  s    

c                 C   s
   d | _ d S rN   )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   rt   r   rz   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 rN   )rt   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“   r~   rz   rt   r�   )r„   rz   r“   rL   rL   rM   Ú	set_proxyŒ  s
    
zRequest.set_proxyc                 C   s   | j | jkS rN   )r�   rt   r‹   rL   rL   rM   Ú	has_proxy”  s    zRequest.has_proxyc                 C   s   || j | ¡ < d S rN   )ri   Ú
capitalize©r„   r…   ÚvalrL   rL   rM   r€   —  s    zRequest.add_headerc                 C   s   || j | ¡ < d S rN   )r|   r�   rž   rL   rL   rM   Úadd_unredirected_header›  s    zRequest.add_unredirected_headerc                 C   s   || j kp|| jkS rN   )ri   r|   ©r„   Úheader_namerL   rL   rM   r‘   Ÿ  s    
ÿzRequest.has_headerc                 C   s   | j  || j ||¡¡S rN   )ri   Úgetr|   )r„   r¢   ÚdefaultrL   rL   rM   ru   £  s    þzRequest.get_headerc                 C   s    | j  |d ¡ | j |d ¡ d S rN   )ri   Úpopr|   r¡   rL   rL   rM   r’   ¨  s    zRequest.remove_headerc                 C   s   | j | j–}t| ¡ ƒS rN   )r|   ri   Úlistr   )r„   ÚhdrsrL   rL   rM   Úheader_items¬  s    zRequest.header_items)N)Ú__name__Ú
__module__Ú__qualname__r‡   Úpropertyrt   ÚsetterÚdeleterrI   rŒ   r˜   r™   r›   rœ   r€   r    r‘   ru   r’   r¨   rL   rL   rL   rM   r   C  s8    þ





	

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 )Nú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   sT  t |dƒstdt|ƒ ƒ‚d}t|ƒD �]}|dkr6q&| d¡}|d |… }||d d … }| d¡rÄ| d¡| d }||d d … }z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&|�rPt | j|¡ | | ¡ d S )NÚ
add_parentz%expected BaseHandler instance, got %rF)Úredirect_requestÚdo_openÚ
proxy_openÚ_rV   ÚerrorrG   Úresponsery   T)ÚhasattrÚ	TypeErrorr“   ÚdirÚfindÚ
startswithrb   rB   r´   r£   r³   rµ   r¶   Ú
setdefaultÚbisectZinsortra   r²   r·   )r„   ÚhandlerZaddedÚmethÚiÚprotocolZ	conditionÚjÚkindÚlookupr²   rL   rL   rM   Úadd_handler¼  sL    
ÿ


zOpenerDirector.add_handlerc                 C   s   d S rN   rL   r‹   rL   rL   rM   Úcloseë  s    zOpenerDirector.closec           	      G   s<   |  |d¡}|D ]&}t||ƒ}||Ž }|d k	r|  S qd S )NrL   )r£   r—   )	r„   ÚchainrÊ   Ú	meth_nameÚargsr²   rÅ   Úfuncrk   rL   rL   rM   Ú_call_chainï  s    
zOpenerDirector._call_chainNc           
      C   s¾   t |tƒrt||ƒ}n|}|d k	r(||_||_|j}|d }| j |g ¡D ]}t||ƒ}||ƒ}qJt	 
d|j|j|j| ¡ ¡ |  ||¡}	|d }| j |g ¡D ]}t||ƒ}|||	ƒ}	q |	S )NZ_requestzurllib.RequestZ	_response)Ú
isinstanceÚstrr   rI   rJ   r“   r¶   r£   r—   ÚsysÚauditrt   ri   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   rk   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_%srV   Z_errorr   r¤   Úhttp_error_default)r´   rÒ   )r„   ÚprotorÐ   ÚdictrÏ   Zhttp_errZ	orig_argsrk   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ƒ }|D ]B}| D ]8}t|tƒrht||ƒr|| |¡ qDt||ƒrD| |¡ qDq<|D ]}| |¡ q„|D ]}| |ƒ ¡ q˜| D ]}t|tƒrÂ|ƒ }| |¡ q®|S )NÚHTTPSConnection)r   r   r.   r)   r   r   r+   r*   r/   r-   r¾   rÝ   Úclientra   rE   ÚsetrÓ   r“   Ú
issubclassÚaddÚremoverÌ   )r²   rK   Zdefault_classesÚskipÚklassZcheckÚhrL   rL   rM   r2   ?  s8    	   ý




c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	r   éô  c                 C   s
   || _ d S rN   )Úparent)r„   rí   rL   rL   rM   r·   f  s    zBaseHandler.add_parentc                 C   s   d S rN   rL   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éÈ   é,  rÝ   )ÚcodeÚmsgrZ   rí   r¼   )r„   ry   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 rN   )r   rt   )r„   rÙ   rh   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)é-  é.  é/  i3  )r–   ZHEAD)rù   rú   rû   r•   ú z%20)rT   zcontent-typec                    s"   i | ]\}}|  ¡ ˆ kr||“qS rL   )rx   ©Ú.0ÚkÚv©ZCONTENT_HEADERSrL   rM   Ú
<dictcomp>®  s    ÿ z8HTTPRedirectHandler.redirect_request.<locals>.<dictcomp>T)ri   r�   r‚   )r˜   r   rt   Úreplaceri   r   r   r�   )	r„   rÙ   rh   ró   rô   ri   Ú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š   Úftprr   z+%s - Redirection to url '%s' is not allowedú/r:   z
iso-8859-1)ÚencodingÚsafeÚredirect_dictr   rV   ©rJ   )r   Úschemer   r\   Znetlocr¦   r   r	   ÚstringZpunctuationr   rt   r¸   r¾   r  r£   Úmax_repeatsrd   Úmax_redirectionsÚinf_msgrc   rÍ   rí   rG   rJ   )
r„   rÙ   rh   ró   rô   ri   r  ÚurlpartsÚnewZvisitedrL   rL   rM   Úhttp_error_302¹  sT    


 
 ý  ÿÿ  ÿ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 }| }nZ| d¡s6td|  ƒ‚d|krV| d¡}| d|¡}n| dd¡}|dkrnd }|d|… }t|ƒ\}}|d k	rœt|ƒ\}}	nd  }}	|||	|fS )Nr
  ú//zproxy URL with no authority: %rú@r:   rS   )r   rÂ   rB   rÁ   r   r   )
Úproxyr  Zr_schemeÚ	authorityZhost_separatorÚ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   sP   |d krt ƒ }|| _| ¡ D ].\}}| ¡ }t| d| ||| jfdd„ƒ qd S )Nz%s_openc                 S   s   || ||ƒS rN   rL   )Úrr  r“   rÆ   rL   rL   rM   Ú<lambda>)  s    z'ProxyHandler.__init__.<locals>.<lambda>)r5   Úproxiesr   rx   Ú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 )Nú%s:%sÚasciiúProxy-authorizationúBasic rš   r  )r“   r"  rz   Ú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 rN   )Úpasswdr‹   rL   rL   rM   r‡   J  s    zHTTPPasswordMgr.__init__c                    s\   t |tƒr|g}|ˆjkr$i ˆj|< dD ].‰ t‡ ‡fdd„|D ƒƒ}||fˆj| |< q(d S )N©TFc                 3   s   | ]}ˆ  |ˆ ¡V  qd S rN   )Ú
reduce_uri)rþ   Úu©Údefault_portr„   rL   rM   Ú	<genexpr>T  s    z/HTTPPasswordMgr.add_password.<locals>.<genexpr>)rÓ   rÔ   r1  Útuple)r„   Úrealmr  r   r1  Úreduced_urirL   r5  rM   Úadd_passwordM  s    


ÿzHTTPPasswordMgr.add_passwordc           	      C   s`   | j  |i ¡}dD ]H}|  ||¡}| ¡ D ].\}}|D ] }|  ||¡r6|      S q6q*qdS )Nr2  ©NN)r1  r£   r3  r   Ú	is_suburi)	r„   r9  ÚauthuriZdomainsr6  Úreduced_authuriZurisZauthinfor  rL   rL   rM   Úfind_user_passwordX  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 )	NrV   r   r:   r
  éP   i»  rÜ   z%s:%d)r   r   r£   )
r„   r  r6  Úpartsr  r  r\   rz   ÚportZdportrL   rL   rM   r3  b  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   FrV   )Ú	posixpathÚcommonprefixrd   )r„   ÚbaseÚtestÚcommonrL   rL   rM   r=  y  s    zHTTPPasswordMgr.is_suburiN)T)r©   rª   r«   r‡   r;  r@  r3  r=  rL   rL   rL   rM   r    H  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 rN   )r    r@  )r„   r9  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 rN   )ÚauthenticatedÚsuperr‡   ©r„   rÐ   Úkwargs©Ú	__class__rL   rM   r‡   ”  s    z%HTTPPasswordMgrWithPriorAuth.__init__Fc                    s<   |   ||¡ |d k	r&tƒ  d |||¡ tƒ  ||||¡ d S rN   )Úupdate_authenticatedrJ  r;  )r„   r9  r  r   r1  Úis_authenticatedrM  rL   rM   r;  ˜  s    z)HTTPPasswordMgrWithPriorAuth.add_passwordc                 C   s>   t |tƒr|g}dD ]$}|D ]}|  ||¡}|| j|< qqd S ©Nr2  )rÓ   rÔ   r3  rI  )r„   r  rP  r6  r4  r:  rL   rL   rM   rO  Ÿ  s    
z1HTTPPasswordMgrWithPriorAuth.update_authenticatedc                 C   sD   dD ]:}|   ||¡}| jD ]"}|  ||¡r| j|     S qqd S rQ  )r3  rI  r=  )r„   r>  r6  r?  r  rL   rL   rM   rP  ©  s
    
z-HTTPPasswordMgrWithPriorAuth.is_authenticated)F)F)r©   rª   r«   r‡   r;  rO  rP  Ú__classcell__rL   rL   rM  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 rN   )r    r1  r;  )r„   Zpassword_mgrrL   rL   rM   r‡   Æ  s    z!AbstractBasicAuthHandler.__init__c                 c   sp   d}t j |¡D ]6}| ¡ \}}}|dkr8t dtd¡ ||fV  d}q|sl|r^| ¡ d }nd}|d fV  d S )NF)ú"ú'zBasic Auth Realm was unquotedé   Tr   rr   )r#   ÚrxÚfinditerÚgroupsr?   r@   ÚUserWarningÚsplit)r„   ÚheaderZfound_challengeZmor  r	   r9  rL   rL   rM   Ú_parse_realmÌ  s     ÿ
z%AbstractBasicAuthHandler._parse_realmc           	      C   s~   |  |¡}|sd S d }|D ]H}|  |¡D ]8\}}| ¡ dkrB|}q(|d k	r(|  |||¡    S q(q|d k	rztd|f ƒ‚d S )NÚbasiczBAbstractBasicAuthHandler does not support the following scheme: %r)Zget_allr\  rx   Úretry_http_basic_authrB   )	r„   Úauthreqrz   rÙ   ri   Zunsupportedr[  r  r9  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 )Nr(  r+  r)  r  )r1  r@  r-  r.  r/  r0  ru   Úauth_headerr    rí   rG   rJ   )r„   rz   rÙ   r9  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 )NrP  ÚAuthorizationz{0}:{1}zBasic {})r¾   r1  rP  rt   r‘   r@  r‰   r/  r-  Zstandard_b64encoder0  r    Ústrip)r„   rÙ   r   r1  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 )NrP  rñ   rò   TF)r¾   r1  ró   rO  rt   )r„   rÙ   r½   rL   rL   rM   rõ     s
    z&AbstractBasicAuthHandler.http_response)N)r©   rª   r«   ÚreÚcompileÚIrV  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 )Núwww-authenticate)rt   r`  )r„   rÙ   rh   ró   rô   ri   rH   r½   rL   rL   rM   Úhttp_error_401$  s      ÿz#HTTPBasicAuthHandler.http_error_401N)r©   rª   r«   ra  rm  rL   rL   rL   rM   r$      s   c                   @   s   e Zd ZdZdd„ ZdS )r%   r*  c                 C   s   |j }|  d|||¡}|S ©Núproxy-authenticate)rz   r`  )r„   rÙ   rh   ró   rô   ri   r  r½   rL   rL   rM   Úhttp_error_407/  s      ÿz$ProxyBasicAuthHandler.http_error_407N)r©   rª   r«   ra  rp  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    r1  r;  ÚretriedÚnonce_countÚ
last_nonce)r„   r1  rL   rL   rM   r‡   I  s    
z"AbstractDigestAuthHandler.__init__c                 C   s
   d| _ d S rq  )rr  r‹   rL   rL   rM   Úreset_retry_countR  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 failedrV   r   Zdigestr]  zEAbstractDigestAuthHandler does not support the following scheme: '%s')r£   rr  r   rt   rZ  rx   Úretry_http_digest_authrB   )r„   ra  rz   rÙ   ri   r_  r  rL   rL   rM   r`  U  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ü   rV   z	Digest %sr  )rZ  Úparse_keqv_listÚfilterÚparse_http_listÚget_authorizationri   r£   ra  r    rí   rG   rJ   )r„   rÙ   rd  ÚtokenZ	challengeÚchalZauth_valZresprL   rL   rM   rw  i  s    z0AbstractDigestAuthHandler.retry_http_digest_authc                 C   s@   d| j |t ¡ f }| d¡tdƒ }t |¡ ¡ }|d d… S )Nz	%s:%s:%s:r)  é   é   )rs  ÚtimeÚctimer/  Ú_randombytesÚhashlibÚsha1Ú	hexdigest)r„   ÚnonceÚsÚbÚdigrL   rL   rM   Ú
get_cnonceu  s    z$AbstractDigestAuthHandler.get_cnoncec                 C   sÆ  z6|d }|d }|  d¡}|  dd¡}|  dd ¡}W n tk
rL   Y d S X |  |¡\}}	|d krhd 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�r\|| 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 )Nr9  r†  ÚqopÚ	algorithmÚMD5Úopaquez%s:%s:%sr(  rd  ú,rV   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_implsr1  r@  rt   rI   Úget_entity_digestr˜   r�   rZ  rt  rs  rŠ  r   )r„   rÙ   r}  r9  r†  r‹  rŒ  rŽ  ÚHÚKDr   rb  ZentdigZA1ZA2ZrespdigZncvalueZcnonceZnoncebitrF  rL   rL   rM   r{  €  s\    

þ


ÿÿz+AbstractDigestAuthHandler.get_authorizationc                    sD   |dkrdd„ ‰ n|dkr$dd„ ‰ nt d| ƒ‚‡ fdd„}ˆ |fS )Nr�  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 r•  )rƒ  r„  r/  r…  r–  rL   rL   rM   r%  Ã  r˜  z.Unsupported digest authentication algorithm %rc                    s   ˆ d| |f ƒS )Nr(  rL   )r‡  Úd©r“  rL   rM   r%  È  r˜  )rB   )r„   rŒ  r”  rL   rš  rM   r‘  ¾  s    

ÿz-AbstractDigestAuthHandler.get_algorithm_implsc                 C   s   d S rN   rL   )r„   rI   r}  rL   rL   rM   r’  Ë  s    z+AbstractDigestAuthHandler.get_entity_digest)N)r©   rª   r«   r‡   ru  r`  rw  rŠ  r{  r‘  r’  rL   rL   rL   rM   r&   >  s   
	>c                   @   s   e Zd ZdZdZdd„ ZdS )r'   re  éê  c                 C   s*   t |jƒd }|  d|||¡}|  ¡  |S )NrV   rl  )r   rt   r`  ru  ©r„   rÙ   rh   ró   rô   ri   rz   ÚretryrL   rL   rM   rm  Ú  s      ÿz$HTTPDigestAuthHandler.http_error_401N)r©   rª   r«   ra  rî   rm  rL   rL   rL   rM   r'   Ð  s   c                   @   s   e Zd ZdZdZdd„ ZdS )r(   úProxy-Authorizationr›  c                 C   s"   |j }|  d|||¡}|  ¡  |S rn  )rz   r`  ru  rœ  rL   rL   rM   rp  ç  s      ÿz%ProxyDigestAuthHandler.http_error_407N)r©   rª   r«   ra  rî   rp  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 rN   ©Ú_debuglevel)r„   Ú
debuglevelrL   rL   rM   r‡   ð  s    zAbstractHTTPHandler.__init__c                 C   s
   || _ d S rN   r   )r„   ÚlevelrL   rL   rM   Úset_http_debugleveló  s    z'AbstractHTTPHandler.set_http_debuglevelc                 C   s   t jj |j| ¡ ¡S rN   )rÝ   rä   ÚHTTPConnectionÚ_get_content_lengthrI   r˜   ©r„   ry   rL   rL   rM   r¦  ö  s    þz'AbstractHTTPHandler._get_content_lengthc                 C   s  |j }|stdƒ‚|jd k	r’|j}t|tƒr8d}t|ƒ‚| d¡sN| dd¡ | d¡s’| d¡s’|  |¡}|d k	r†| dt|ƒ¡ n| dd¡ |}| 	¡ r¸t
|jƒ\}}t|ƒ\}}	| d¡sÎ| d|¡ | jjD ]&\}
}|
 ¡ }
| |
¡sÖ| |
|¡ qÖ|S )	Núno host givenz\POST data should be bytes, an iterable of bytes, or a file object. It cannot be of type str.zContent-typeú!application/x-www-form-urlencodedr�   úTransfer-encodingZchunkedrs   )rz   r   rI   rÓ   rÔ   r¿   r‘   r    r¦  rœ   r   r�   r   rí   r±   r�   )r„   ry   rz   rI   rô   Zcontent_lengthZsel_hostr  ZselZsel_pathr_   r†   rL   rL   rM   Údo_request_û  sJ    


þ
ÿ
 ÿ ÿ

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	� z`z&|j| ¡ |j|jˆ | d
¡d� W n, tk
�r } zt|ƒ‚W 5 d }~X Y nX | ¡ }	W n   | ¡  ‚ Y nX |j�r>|j ¡  d |_| ¡ |	_|	j|	_|	S )Nr¨  rJ   c                    s   i | ]\}}|ˆ kr||“qS rL   rL   rý   ©ri   rL   rM   r  /  s    ÿ z/AbstractHTTPHandler.do_open.<locals>.<dictcomp>rÍ   Ú
Connectionc                 S   s   i | ]\}}|  ¡ |“qS rL   )Útitle)rþ   r_   rŸ   rL   rL   rM   r  <  s      rž  r¬  rª  )Zencode_chunked)rz   r   rJ   Zset_debuglevelr¡  rà   r|   Úupdateri   r   r~   Z
set_tunnelry   r˜   r�   rI   r‘   rq   ÚgetresponserÍ   Zsockr™   rH   Úreasonrô   )
r„   Z
http_classrÙ   Zhttp_conn_argsrz   rë   Ztunnel_headersZproxy_auth_hdrÚerrr$  rL   r¬  rM   r¹   !  sB    
ÿ


zAbstractHTTPHandler.do_openN)r   )r©   rª   r«   r‡   r¤  r¦  r«  r¹   rL   rL   rL   rM   rŸ  î  s
   
&rŸ  c                   @   s   e Zd Zdd„ ZejZdS )r)   c                 C   s   |   tjj|¡S rN   )r¹   rÝ   rä   r¥  ©r„   rÙ   rL   rL   rM   Ú	http_openf  s    zHTTPHandler.http_openN)r©   rª   r«   r´  rŸ  r«  rg  rL   rL   rL   rM   r)   d  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 rN   )rŸ  r‡   Ú_contextÚ_check_hostname)r„   r¢  r>   Úcheck_hostnamerL   rL   rM   r‡   o  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³  rL   rL   rM   Ú
https_opent  s     ÿzHTTPSHandler.https_open)r   NN)r©   rª   r«   r‡   r¸  rŸ  r«  rk  rL   rL   rL   rM   rE   m  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 rq  )Zhttp.cookiejarÚ	cookiejarZ	CookieJar)r„   r¹  rÝ   rL   rL   rM   r‡   }  s    
zHTTPCookieProcessor.__init__c                 C   s   | j  |¡ |S rN   )r¹  Zadd_cookie_headerr§  rL   rL   rM   rg  ƒ  s    z HTTPCookieProcessor.http_requestc                 C   s   | j  ||¡ |S rN   )r¹  Zextract_cookies)r„   ry   r½   rL   rL   rM   rõ   ‡  s    z!HTTPCookieProcessor.http_response)N)r©   rª   r«   r‡   rg  rõ   rk  rö   rL   rL   rL   rM   r   |  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   sN   i }| D ]@}|  dd¡\}}|d dkr@|d dkr@|dd… }|||< q|S )Nú=rV   r   rS  rS   )rZ  )ÚlZparsedZeltrÿ   r   rL   rL   rM   rx  “  s    
rx  c                 C   sž   g }d}d }}| D ]l}|r*||7 }d}q|rT|dkr>d}qn|dkrJd}||7 }q|dkrl|  |¡ d}q|dkrxd}||7 }q|r�|  |¡ dd„ |D ƒS )	Nrr   Fú\TrS  r�  c                 S   s   g | ]}|  ¡ ‘qS rL   )rf  )rþ   ÚpartrL   rL   rM   Ú
<listcomp>Æ  s     z#parse_http_list.<locals>.<listcomp>)ra   )r‡  Úresr½  Úescaper	   ZcurrL   rL   rM   rz  �  s4    	


rz  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:   r  rU  r
  Ú	localhostú-file:// scheme is supported only on localhost)r�   rz   Ú	get_namesr   Úopen_local_file)r„   rÙ   rH   rL   rL   rM   Ú	file_openÊ  s    &ÿ
zFileHandler.file_openNc                 C   s`   t jd krZz*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*   Únamesr8  rá   Úgethostbyname_exÚgethostnameÚgaierrorÚgethostbynamer‹   rL   rL   rM   rÃ  Õ  s    
ÿÿ
zFileHandler.get_namesc              
   C   sþ   dd l }dd l}|j}|j}t|ƒ}z¢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ƒ||ƒW S W n* tk
rð } zt|ƒ‚W 5 d }~X Y nX tdƒ‚d S )	Nr   T©Zusegmtz6Content-type: %s
Content-length: %d
Last-modified: %s
ú
text/plainúfile://Úrbzfile not on local host)Úemail.utilsÚ	mimetypesrz   r�   r4   r[   ÚstatÚst_sizeÚutilsÚ
formatdateÚst_mtimeÚ
guess_typeÚmessage_from_stringr   Ú_safe_gethostbynamerÃ  r   rG   rq   r   )r„   rÙ   ÚemailrÐ  rz   rf   Z	localfileÚstatsrm   ÚmodifiedÚmtyperi   rC  ZorigurlÚexprL   rL   rM   rÄ  à  s:    
ÿÿÿÿzFileHandler.open_local_file)r©   rª   r«   rÅ  rÆ  rÃ  rÄ  rL   rL   rL   rM   r*   È  s   
c                 C   s*   zt  | ¡W S  t jk
r$   Y d S X d S rN   )rá   rÊ  rÉ  )rz   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}zt
 |¡}W n* tk
r¸ } zt|ƒ‚W 5 d }~X Y nX t|jƒ\}	}
|	 d¡}ttt	|ƒƒ}|d d… |d  }}|�r|d �s|dd … }zÎ|  ||||||j¡}|�r6d�p8d}|
D ]2}t|ƒ\}}| ¡ d	k�r>|d
k�r>| ¡ }�q>| ||¡\}}d}| |j¡d }|�r¨|d| 7 }|d k	�rÈ|dk�rÈ|d| 7 }t |¡}t|||jƒW S  |jk
�r$ } z"td| ƒ}| t  ¡ d ¡‚W 5 d }~X Y nX d S )Nr   úftp error: no host givenrr   r
  rS   rV   rj  ÚDr“   ©ÚaÚArÇ   rj  r™  rß  zContent-type: %s
zContent-length: %d
úftp error: %rr:   )!ÚftplibrÐ  rz   r   r   ÚFTP_PORTrb   r   r   r
   rá   rÊ  rq   r   r�   rZ  r¦   ÚmapÚconnect_ftprJ   r   rx   ÚupperÚretrfilerÖ  rt   rÙ  r×  r   Ú
all_errorsÚwith_tracebackrÕ   Úexc_info)r„   rÙ   rä  rÐ  rz   rC  r   r1  rô   r\   ÚattrsÚdirsrO   Úfwr“   Úattrr†   rh   Úretrlenri   rÜ  rÝ  ÚexcrL   rL   rM   Úftp_open  s^    
ÿ
zFTPHandler.ftp_openc              	   C   s   t ||||||dd�S )NF)Ú
persistent)Ú
ftpwrapper)r„   r   r1  rz   rC  rî  rJ   rL   rL   rM   rç  7  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_connsr‹   rL   rL   rM   r‡   >  s
    zCacheFTPHandler.__init__c                 C   s
   || _ d S rN   )rù  )r„   ÚtrL   rL   rM   Ú
setTimeoutE  s    zCacheFTPHandler.setTimeoutc                 C   s
   || _ d S rN   )rú  )r„   r  rL   rL   rM   ÚsetMaxConnsH  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   r1  rz   rC  rî  rJ   r…   rL   rL   rM   rç  K  s    

 ÿ
zCacheFTPHandler.connect_ftpc                 C   sÂ   t   ¡ }| j|krPt| j ¡ ƒD ].\}}||k r | j|  ¡  | j|= | j|= q tt| j ¡ ƒƒ| _t	| jƒ| j
kr¾t| j ¡ ƒD ]&\}}|| jkr‚| j|= | j|=  qªq‚tt| j ¡ ƒƒ| _d S rN   )r€  rø  r¦   rJ   r   r÷  rÍ   ÚminÚvaluesrd   rú  )r„   rû  rÿ   r   rL   rL   rM   rÿ  V  s    


zCacheFTPHandler.check_cachec                 C   s0   | j  ¡ D ]}| ¡  q
| j  ¡  | j ¡  d S rN   )r÷  r  rÍ   ÚclearrJ   )r„   ÚconnrL   rL   rM   Úclear_cachej  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ú:rV   r�  z;base64iùÿÿÿútext/plain;charset=US-ASCIIz$Content-type: %s
Content-length: %d
)rt   rZ  r   Úendswithr-  ÚdecodebytesrÙ  r×  rd   r   ÚioÚBytesIO)r„   rÙ   rH   r  rI   Z	mediatyperi   rL   rL   rM   Ú	data_openq  s    



ÿzDataHandler.data_openN)r©   rª   r«   r  rL   rL   rL   rM   r-   p  s   rø   Únt)r4   r3   c                 C   s   t | ƒS rN   )r
   ©ÚpathnamerL   rL   rM   r4   —  s    c                 C   s   t | ƒS rN   )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   Nr¯   c                 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ÚclassrU  )Ú
stacklevelÚkey_fileÚ	cert_filez
User-Agent)ZAcceptz*/*)rN  r©   r?   r@   rA   r5   r&  r£   r  r  Úversionr±   Ú_URLopener__tempfilesr[   rp   Ú_URLopener__unlinkÚ	tempcacheÚftpcache)r„   r&  Zx509rô   rL   rL   rM   r‡   ²  s    
ÿzURLopener.__init__c                 C   s   |   ¡  d S rN   )rÍ   r‹   rL   rL   rM   Ú__del__Ì  s    zURLopener.__del__c                 C   s   |   ¡  d S rN   )Úcleanupr‹   rL   rL   rM   rÍ   Ï  s    zURLopener.closec              	   C   sV   | j rB| j D ](}z|  |¡ W q tk
r2   Y qX q| j d d …= | jrR| j ¡  d S rN   )r  r  rq   r  r  )r„   rO   rL   rL   rM   r  Ò  s    
zURLopener.cleanupc                 G   s   | j  |¡ d S rN   )r±   ra   )r„   rÐ   rL   rL   rM   Ú	addheaderà  s    zURLopener.addheaderc              
   C   sp  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 z0|d k�r t| |ƒ|ƒW S t| |ƒ||ƒW S W nV ttfk
�r0   ‚ Y n< tk
�rj } ztd	|ƒ t ¡ d
 ¡‚W 5 d }~X Y nX d S )Nz%/:=&?~#+!$,;'@()*[]|©r  rÎ  rO   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   rq   rë  rÕ   rì  )r„   rØ   rI   rf   ri   rh   ÚurltyperH   r  Ú	proxyhostrz   r�   r_   rô   rL   rL   rM   rG   æ  s<    




zURLopener.openc                 C   s   t |ƒ\}}tdd|ƒ‚d S )Nú	url errorzunknown url type©r   rq   )r„   rØ   rI   r“   rH   rL   rL   rM   r  
  s    zURLopener.open_unknownc                 C   s    t |ƒ\}}tdd| |ƒ‚d S )Nr!  zinvalid proxy for %sr"  )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šz0|  |¡}| ¡ }| ¡  tt|ƒd ƒ|fW S  t	k
r˜ }	 zW 5 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	�rT|| j|< d}d}d}d}d|
k�rzt|
d	 ƒ}|�rŒ||||ƒ | |¡}|�s �qÔ|t|ƒ7 }| |¡ |d7 }|�rŒ||||ƒ �qŒW 5 | ¡  X W 5 | ¡  X |dk�r||k �rtd
||f |ƒ‚|S )NrO   rV   rP   rr   rR   rS   r   rT   rU   rW   )r   r   r  r   rÄ  rZ   rÍ   r4   r   rq   rG   r   r   r[   r\   Úsplitextr^   Zmkstempr  ra   Úfdopenrb   rc   rd   re   r   )r„   rH   rf   rg   rI   r“   Zurl1rh   r§   rô   ri   rj   Zgarbager\   ÚsuffixÚfdrk   rl   rm   rc   rn   ro   rL   rL   rM   Úretrieve  sn    






ÿþ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< | jD ]\}}|||< �qX|d k	�r�d|d< | d|||¡ n|jd||d� z| ¡ }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 errorr¨  r)  zBasic %srž  re  rs   rÍ   r­  r©  zContent-Typer•   r–   r¬  z$http protocol error: bad status linerñ   rò   úhttp:)rÓ   rÔ   r   r   r
   r   rx   r,  rq   r-  r.  r/  r0  r±   ry   r°  rÝ   rä   ZBadStatusLiner   Zstatusr   rô   Ú
http_errorrh   r±  )r„   Zconnection_factoryrH   rI   Zuser_passwdZproxy_passwdrz   r�   Zrealhostr  r”   Z
proxy_authrd  Z	http_connri   r[  r†   r½   rL   rL   rM   Ú_open_generic_httpV  s~    
 

ÿ    þzURLopener._open_generic_httpc                 C   s   |   tjj||¡S rN   )r*  rÝ   rä   r¥  ©r„   rH   rI   rL   rL   rM   Ú	open_http²  s    zURLopener.open_httpc           
      C   sb   d| }t | |ƒrPt| |ƒ}|d kr6||||||ƒ}	n|||||||ƒ}	|	rP|	S |  |||||¡S )Nzhttp_error_%d)r¾   r—   rÞ   )
r„   rH   rh   ÚerrcodeÚerrmsgri   rI   r_   rƒ   rk   rL   rL   rM   r)  ¶  s    

 zURLopener.http_errorc                 C   s   |  ¡  t||||d ƒ‚d S rN   )rÍ   r   ©r„   rH   rh   r-  r.  ri   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„   rz   rL   rL   rM   Ú_https_connectionÌ  s    þzURLopener._https_connectionc                 C   s   |   | j||¡S rN   )r*  r0  r+  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:   r  rU  r
  é   z
localhost/rÂ  )rÓ   rÔ   r   rx   rB   rÄ  r�   rL   rL   rM   Ú	open_fileÕ  s
    
4
zURLopener.open_filec              
   C   s\  dd l }dd l}t|ƒ\}}t|ƒ}zt |¡}W n0 tk
rb } zt|j|j	ƒ‚W 5 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   TrË  z6Content-Type: %s
Content-Length: %d
Last-modified: %s
rÌ  rV   r
  rÍ  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   r[   rÑ  rq   r   Ústrerrorrf   rÒ  rÓ  rÔ  rÕ  rÖ  r×  r   rG   r   rá   rÊ  rÁ  ÚthishostrB   )r„   rH   rÙ  rÐ  rz   rO   Z	localnamerÚ  Úerm   rÛ  rÜ  ri   ZurlfilerC  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�rbt| jƒD ]*}||k�r6| j| }| j|= | ¡  �q6zä|| jk�r†t|||||
ƒ| j|< |�s’d}nd	}|	D ]2}t|ƒ\}}| ¡ d
k�rš|dk�rš| ¡ }�qš| j|  ||¡\}}| d| ¡d }d}|�r|d| 7 }|d k	�r,|dk�r,|d| 7 }t |¡}t||d| ƒW S  tƒ k
�r† } ztd| ƒ  t! "¡ d ¡‚W 5 d }~X Y nX d S )NzCftp error: proxy support for ftp protocol currently not implementedr   rÞ  rr   r
  rS   rV   rß  rj  r“   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å  rb   r   rZ  rþ  rd   r  ÚMAXFTPCACHEr¦   rÍ   rõ  r   rx   rè  ré  rÖ  rÙ  r×  r   Ú	ftperrorsrë  rÕ   rì  )r„   rH   rÐ  rz   r\   rC  r   r1  rä  rí  rî  rO   r…   rÿ   r   r“   rð  r†   rh   rñ  rÜ  ri   rÝ  rL   rL   rM   Úopen_ftpþ  st    
  

  

ÿ ÿ
zURLopener.open_ftpc           	   
   C   s<  t |tƒstdƒ‚z| 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�  rV   z
data errorzbad data URLr  ú;r   rº  rr   zDate: %sz%a, %d %b %Y %H:%M:%S GMTzContent-type: %sr-  r)  zlatin-1zContent-Length: %dÚ
)rÓ   rÔ   r   rZ  rB   rq   Úrfindra   r€  ÚstrftimeÚgmtimer-  r  r/  r0  r
   rd   rþ  rÙ  r×  r	  ÚStringIOr   )	r„   rH   rI   r“   Zsemir  rô   ri   ÚfrL   rL   rM   Ú	open_data8  s8    

ÿ




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   r0  r1  r3  rÄ  r9  rA  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ÚmaxtriesrK  rL   rL   rM   r‡   e  s    zFancyURLopener.__init__c                 C   s   t ||d| |ƒS )Nr(  )r   r/  rL   rL   rM   rÞ   k  s    z!FancyURLopener.http_error_defaultNc           	      C   sv   |  j d7  _ zZ| jrN| j | jkrNt| dƒr4| j}n| j}|||dd|ƒW ¢S |  ||||||¡}|W ¢S d| _ X d S )NrV   r   Úhttp_error_500rì   z)Internal Server Error: Redirect Recursion)rC  rD  r¾   rE  rÞ   Úredirect_internal)	r„   rH   rh   r-  r.  ri   rI   rÆ   rk   rL   rL   rM   r  o  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  z( Redirection to url '%s' is not allowed.)rÍ   r   r“   r   r  r   rG   )	r„   rH   rh   r-  r.  ri   rI   r  r  rL   rL   rM   rF  �  s"    


ÿ ýz FancyURLopener.redirect_internalc                 C   s   |   ||||||¡S rN   ©r  ©r„   rH   rh   r-  r.  ri   rI   rL   rL   rM   r  �  s    zFancyURLopener.http_error_301c                 C   s   |   ||||||¡S rN   rG  rH  rL   rL   rM   r  ¡  s    zFancyURLopener.http_error_303c                 C   s2   |d kr|   ||||||¡S |  |||||¡S d S rN   )r  rÞ   rH  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 )Nrl  ú![ 	]*([^ 	]+)[ 	]+realm="([^"]*)"r]  Zretry_Ú_basic_auth©r8   rÞ   rh  ÚmatchrX  rx   r“   r—   ©r„   rH   rh   r-  r.  ri   rI   r�  ZstuffrL  r  r9  r_   rL   rL   rM   rm  ¬  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 )Nro  rI  r]  Zretry_proxy_rJ  rK  rM  rL   rL   rM   rp  Å  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 )Núhttp://rÝ   r  rV   ú%s:%s@%srr   r  ©r   r&  r   rÁ   Úget_user_passwdr	   rG   ©r„   rH   r9  rI   rz   r�   r  r  r  r   ZproxyselectorrÇ   r   r1  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 )Núhttps://rš   r  rV   rO  rr   r  rP  rR  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  rV   rO  rr   r  rN  ©r   rÁ   rQ  r	   rG   ©
r„   rH   r9  rI   rz   r�   rÇ   r   r1  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  rV   rO  rr   r  rT  rV  rW  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  )rx   rB  Úprompt_user_passwd)r„   rz   r9  r  r…   r   r1  rL   rL   rM   rQ  	  s    


 zFancyURLopener.get_user_passwdc                 C   sX   dd l }z.td||f ƒ}|  d|||f ¡}||fW S  tk
rR   tƒ  Y dS X d S )Nr   zEnter username for %s at %s: z#Enter password for %s in %s at %s: r<  )ÚgetpassÚinputÚKeyboardInterruptÚprint)r„   rz   r9  rZ  r   r1  rL   rL   rM   rY  )	  s    ÿ
z!FancyURLopener.prompt_user_passwd)N)N)N)N)NF)NF)N)N)N)N)r   )r©   rª   r«   r‡   rÞ   r  rF  r  r  r  rm  rp  rS  rU  r^  rX  rQ  rY  rL   rL   rL   rM   r9   b  s&   



  ÿ
  ÿ





c                   C   s   t d krt d¡a t S )NrÁ  )Ú
_localhostrá   rÊ  rL   rL   rL   rM   rÁ  9	  s    
rÁ  c                   C   sP   t d krLztt t ¡ ¡d ƒa W n( tjk
rJ   tt d¡d ƒa Y nX t S )Nr:   rÁ  )Ú	_thishostr8  rá   rÇ  rÈ  rÉ  rL   rL   rL   rM   r5  A	  s    r5  c                  C   s   t d krdd l} | ja t S rq  )Ú
_ftperrorsrä  rê  )rä  rL   rL   rM   r8  L	  s    r8  c                   C   s   t d krt d¡a t S rŽ   )Ú
_noheadersrÙ  r×  rL   rL   rL   rM   Ú	noheadersU	  s    
rb  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| _|| _z|  ¡  W n   |  	¡  ‚ Y nX d S rq  )
r   r1  rz   rC  rî  rJ   ÚrefcountÚ	keepaliveÚinitrÍ   )r„   r   r1  rz   rC  rî  rJ   rô  rL   rL   rM   r‡   b	  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connectrz   rC  rJ   Zloginr   r1  rþ  rî  Úcwd)r„   rä  Z_targetrL   rL   rM   re  r	  s    
zftpwrapper.initc              
   C   s¶  dd l }|  ¡  |dkr"d}d}nd| }d}z| j |¡ W n* |jk
rh   |  ¡  | j |¡ Y nX d }|ræ|sæzd| }| j |¡\}}W nR |jk
rä } z2t|ƒd d… dkrÔt	d	| ƒ 
t ¡ d
 ¡‚W 5 d }~X Y nX |�s€| j d¡ |�rl| j ¡ }	zJz| j |¡ W n4 |jk
�rN } zt	d	| ƒ|‚W 5 d }~X Y nX W 5 | j |	¡ X d| }nd}| j |¡\}}d| _t| d¡| jƒ}
|  jd7  _| ¡  |
|fS )Nr   )r™  rß  zTYPE ArV   zTYPE zRETR rU  Z550rã  r:   zLIST ZLISTrÎ  )rä  Úendtransferr	  Zvoidcmdrê  re  ZntransfercmdZ
error_permrÔ   r   rë  rÕ   rì  Úpwdrg  rf  r   ZmakefileÚ
file_closerc  rÍ   )r„   rO   r“   rä  ÚcmdÚisdirr  rñ  r±  ri  ZftpobjrL   rL   rM   ré  {	  sP       
ÿ
$
zftpwrapper.retrfilec                 C   s
   d| _ d S rq  )rf  r‹   rL   rL   rM   rh  ¨	  s    zftpwrapper.endtransferc                 C   s   d| _ | jdkr|  ¡  d S )NFr   )rd  rc  Ú
real_closer‹   rL   rL   rM   rÍ   «	  s    
zftpwrapper.closec                 C   s2   |   ¡  |  jd8  _| jdkr.| js.|  ¡  d S )NrV   r   )rh  rc  rd  rm  r‹   rL   rL   rM   rj  °	  s    zftpwrapper.file_closec                 C   s2   |   ¡  z| j ¡  W n tƒ k
r,   Y nX d S rN   )rh  r	  rÍ   r8  r‹   rL   rL   rM   rm  ¶	  s
    zftpwrapper.real_close)NT)
r©   rª   r«   r‡   re  ré  rh  rÍ   rj  rm  rL   rL   rL   rM   rõ  _	  s     ÿ
	-rõ  c                  C   s´   i } t j ¡ D ]4\}}| ¡ }|r|dd … dkr|| |d d… < qdt jkrZ|  dd ¡ t j ¡ D ]J\}}|dd … dkrd| ¡ }|rš|| |d d… < qd|  |d d… d ¡ qd| S )NiúÿÿÿÚ_proxyZREQUEST_METHODrÝ   )r[   Úenvironr   rx   r¥   )r&  r_   r†   rL   rL   rM   Úgetproxies_environment¾	  s    	
rp  c                 C   s¼   |d krt ƒ }z|d }W n tk
r0   Y dS X |dkr>dS |  ¡ } t| ƒ\}}| d¡D ]Z}| ¡ }|r\| d¡}| ¡ }||ksŽ| |kr” dS d| }| |¡s°|  |¡r\ dS q\dS )NZnoFÚ*Tr�  Ú.)rp  r�  rx   r   rZ  rf  Úlstripr  )rz   r&  Zno_proxyÚhostonlyrC  r_   rL   rL   rM   Úproxy_bypass_environmentÝ	  s*    
ru  c              	   C   s0  ddl m } t| ƒ\}}dd„ }d| kr4|d r4dS d }| dd	¡D ]æ}|sNqDt d
|¡}|d k	�r|d krœzt |¡}||ƒ}W n tk
rš   Y qDY nX || d¡ƒ}	| d¡}
|
d krÖd| d¡ 	d¡d  }
nt
|
dd … ƒ}
|
dk sD|
dkrøqDd|
 }
||
? |	|
? k�r* dS qD|| |ƒrD dS qDd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 )
Nrr  r÷   r   é   rV   r  r:   r~  rU  )rZ  r¦   ræ  rb   rd   )ZipAddrrB  rL   rL   rM   Úip2num
  s
    
z,_proxy_bypass_macosx_sysconf.<locals>.ip2numrr  Zexclude_simpleTÚ
exceptionsrL   z(\d+(?:\.\d+)*)(/\d+)?rV   r:   r~  é    F)rv  r   r£   rh  rL  rá   rÊ  rq   ÚgroupÚcountrb   )rz   Úproxy_settingsrv  rt  rC  rx  ZhostIPr†   r  rF  ÚmaskrL   rL   rM   Ú_proxy_bypass_macosx_sysconf
  s>     




r  Údarwin)Ú_get_proxy_settingsÚ_get_proxiesc                 C   s   t ƒ }t| |ƒS rN   )r�  r  )rz   r}  rL   rL   rM   Úproxy_bypass_macosx_sysconfF
  s    rƒ  c                   C   s   t ƒ S rN   )r‚  rL   rL   rL   rM   Úgetproxies_macosx_sysconfJ
  s    r„  c                 C   s    t ƒ }|rt| |ƒS t| ƒS d S rN   )rp  ru  rƒ  ©rz   r&  rL   rL   rM   r,  T
  s    
r,  c                   C   s   t ƒ p
tƒ S rN   )rp  r„  rL   rL   rL   rM   r5   a
  s    c               
   C   s  i } zdd l }W n tk
r(   |  Y S X zÊ| |jd¡}| |d¡d }|rêt| |d¡d ƒ}d|kr¬| d¡D ]4}| dd¡\}}t d|¡s d	||f }|| |< qtn>|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   ú;Software\Microsoft\Windows\CurrentVersion\Internet SettingsÚProxyEnableZProxyServerrº  r:  rV   z(?:[^/:]+)://z%s://%srv  r(  rÝ   z	http://%sz
https://%srš   zftp://%sr	  )ÚwinregÚImportErrorÚOpenKeyÚHKEY_CURRENT_USERÚQueryValueExrÔ   rZ  rh  rL  ZCloserq   rB   r¿   )r&  rˆ  ÚinternetSettingsÚproxyEnableZproxyServerÚprÈ   ZaddressrL   rL   rM   Úgetproxies_registryf
  sF    
ÿÿÿÿÿ
r�  c                   C   s   t ƒ p
tƒ S rN   )rp  r�  rL   rL   rL   rM   r5   “
  s    c                 C   s|  zdd l }W n tk
r"   Y dS X z6| |jd¡}| |d¡d }t| |d¡d ƒ}W n tk
rp   Y dS X |rz|s~dS t| ƒ\}}|g} z t 	|¡}||kr®|  
|¡ W n tk
rÄ   Y nX z t |¡}||krä|  
|¡ W n tk
� rü   Y nX | d¡}|D ]j}	|	dk�r*d|k�r* dS |	 dd	¡}	|	 d
d¡}	|	 dd¡}	| D ] }
t |	|
tj¡�rR  dS �qR�qdS )Nr   r†  r‡  ZProxyOverrider:  z<local>rr  rV   z\.rq  z.*ú?)rˆ  r‰  rŠ  r‹  rŒ  rÔ   rq   r   rá   rÊ  ra   ZgetfqdnrZ  r  rh  rL  rj  )rz   rˆ  r�  rŽ  ZproxyOverrideZrawHostrC  ZaddrZfqdnrG  rŸ   rL   rL   rM   Úproxy_bypass_registryœ
  s`    ÿÿÿÿÿ





r’  c                 C   s    t ƒ }|rt| |ƒS t| ƒS d S rN   )rp  ru  r’  r…  rL   rL   rM   r,  Î
  s    
)NNN)N)}r-  rÄ   rÙ  rƒ  Zhttp.clientrÝ   r	  r[   rD  rh  rá   r  rÕ   r€  r^   rX   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  ÚASCIIrv   r{   r   r   r2   r   r/   r   r   r"  r   r    r!   r"   r#   r$   r%   Úurandomr‚  r&   r'   r(   rŸ  r)   r¾   rä   rE   ra   r   r.   rx  rz  r*   rØ  r+   r,   r-   r7  r_   Z
nturl2pathr4   r3   r  r8   r9   r^  rÁ  r_  r5  r`  r8  ra  rb  rõ  rp  ru  r  ÚplatformZ_scproxyr�  r‚  rƒ  r„  r,  r5   r�  r’  rL   rL   rL   rM   Ú<module>T   s  P
                      ò   ÿU
?m $q!+@
o v

+3:5!   @ W

_
%A

-	2
