???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................U
    e5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* 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rd 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rd doltmuZumvZv dpdq Zwdrds Zxdtdu Zydvd# Zzn6ej`dXkrdwdx 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rt
  a}	nt}	|	| ||S )Nr   zJcafile, capath and cadefault are deprecated, use a custom context instead.r:   zDYou can't pass both context and any of cafile, capath, and cadefaultzSSL support not available)r;   r<   )r>   )warningswarnDeprecationWarning
ValueError	_have_sslsslZcreate_default_contextZPurposeZSERVER_AUTHHTTPSHandlerr2   _openeropen)
urldatatimeoutr;   r<   r=   r>   r?   Zhttps_handleropener rL   &/usr/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rt|d	 }|r|||
| ||
}|sq|t|7 }|| |d
7 }|r|||
| qW 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rd S t|d	r|j }	|_|	|d
| jkst|	| 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	rt|\}}	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rd 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   sN   ||krdS |d |d kr dS |d }|dd  dkr@|d7 }|d  |S )NTr   FrV   rS   r
  )r   )r   basetestprefixrL   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_authenticatedrH  r;  )r   r9  r  r   r1  is_authenticatedrK  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  rG  )r   r  rN  r6  r4  r:  rL   rL   rM   rM    s    
z1HTTPPasswordMgrWithPriorAuth.update_authenticatedc                 C   sD   dD ]:}|  ||}| jD ]"}| ||r| j|     S qqd S rO  )r3  rG  r=  )r   r>  r6  r?  r  rL   rL   rM   rN    s
    
z-HTTPPasswordMgrWithPriorAuth.is_authenticated)F)F)r   r   r   r   r;  rM  rN  __classcell__rL   rL   rK  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_allrZ  rx   retry_http_basic_authrB   )	r   authreqrz   r   ri   ZunsupportedrY  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 )NrN  Authorizationz{0}:{1}zBasic {})r   r1  rN  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 )NrN  r   r   TF)r   r1  r   rM  rt   )r   r   r   rL   rL   rM   r     s
    z&AbstractBasicAuthHandler.http_response)N)r   r   r   recompileIrT  r   rZ  r^  r\  re  r   https_requestr   rL   rL   rL   rM   r#     s   
c                   @   s   e Zd ZdZdd ZdS )r$   rc  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   r_  rk  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   r_  rn  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 ro  )rp  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   rp  r   rt   rX  rx   retry_http_digest_authrB   )r   r_  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  )rX  parse_keqv_listfilterparse_http_listget_authorizationri   r   r_  r   r   rG   rJ   )r   r   rb  tokenZ	challengechalZauth_valZresprL   rL   rM   ru  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)        )rq  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rd 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(  rb  ,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   rX  rr  rq  r  r   )r   r   r{  r9  r  r  r  r  HKDr   r`  ZentdigZA1ZA2ZrespdigZncvalueZcnonceZnoncebitrD  rL   rL   rM   ry    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   rs  r^  ru  r  ry  r  r  rL   rL   rL   rM   r&   >  s   
	>c                   @   s   e Zd ZdZdZdd ZdS )r'   rc    c                 C   s*   t |jd }| d|||}|   |S )NrV   rj  )r   rt   r^  rs  r   r   rh   r   r   ri   rz   retryrL   rL   rM   rk    s      z$HTTPDigestAuthHandler.http_error_401N)r   r   r   r_  r   rk  rL   rL   rL   rM   r'     s   c                   @   s   e Zd ZdZdZdd ZdS )r(   Proxy-Authorizationr  c                 C   s"   |j }| d|||}|   |S rl  )rz   r^  rs  r  rL   rL   rM   rn    s      z%ProxyDigestAuthHandler.http_error_407N)r   r   r   r_  r   rn  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 |}|	 rt
|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
ri }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  re  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  ri  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 ro  )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   re    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   re  r   ri  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   rQ  rS   )rX  )lZparsedZeltr   r   rL   rL   rM   rv    s    
rv  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\TrQ  r  c                 S   s   g | ]}|  qS rL   )rd  )r   partrL   rL   rM   
<listcomp>  s     z#parse_http_list.<locals>.<listcomp>)ra   )r  resr  escaper	   ZcurrL   rL   rM   rx    s4    	


rx  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  rS  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|}zt|}|j}|jj	|j
dd}	||d }
|d|
pbd||	f }|r~t|\}}|r|st||  kr|rd| | }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   rh  Dr   aAr   rh  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   rX  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rt| j D ]&\}}|| jkr| j|= | j|=  qqt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   rX  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rd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classrS  )
stacklevelkey_file	cert_filez
User-Agent)ZAcceptz*/*)rL  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rz0| |}| }|  tt|d |fW S  t	k
r }	 zW 5 d }	~	X Y nX | 
||}z<| }
|rt
|d}nrt|\}}t|pd\}}t|pd\}}t|pd\}}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|||| qW 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|
\}}
|rt|\}}|rd|	||
f }t|r|}|stdd|rt|}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	rd|d< |d||| n|jd||d z| }W n" tjjk
r   tdY nX d|j  krd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  rc  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_authrb  Z	http_connri   rY  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(  r.  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  rS  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|pd|	|
f }|s|}|d d dkrd| }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	
|}|sd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rt|||||
| j|< |sd}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  rh  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   rX  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rd	||d  kr||d d  }|d | }nd
}g }|dt	dt
t   |d|  |dkrt|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   rX  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   r.  r/  r1  r  r7  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maxtriesrI  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)rA  rB  r   rC  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   rD    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   rE  rF  rL   rL   rM   r    s    zFancyURLopener.http_error_303c                 C   s2   |d kr|  ||||||S | |||||S d S rN   )r  r   rF  rL   rL   rM   r    s    zFancyURLopener.http_error_307Fc                 C   s   d|krt | ||||| |d }td|}	|	sHt | ||||| |	 \}
}|
 dkrtt | ||||| |st | ||||| d| j d }|d krt| |||S t| ||||S d S )Nrj  ![ 	]*([^ 	]+)[ 	]+realm="([^"]*)"r[  Zretry__basic_authr8   r   rf  matchrV  rx   r   r   r   rH   rh   r+  r,  ri   rI   r  ZstuffrJ  r  r9  r_   rL   rL   rM   rk    s:    
  
  
  zFancyURLopener.http_error_401c                 C   s   d|krt | ||||| |d }td|}	|	sHt | ||||| |	 \}
}|
 dkrtt | ||||| |st | ||||| d| j d }|d krt| |||S t| ||||S d S )Nrm  rG  r[  Zretry_proxy_rH  rI  rK  rL   rL   rM   rn    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   rM  rr   r  rN  rP  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   rM  rr   r  rL  r   r   rO  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   rM  rr   r  rR  rT  rU  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   r@  prompt_user_passwd)r   rz   r9  r  r   r   r1  rL   rL   rM   rO  	  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  rX  r   r1  rL   rL   rM   rW  )	  s    
z!FancyURLopener.prompt_user_passwd)N)N)N)N)NF)NF)N)N)N)N)r   )r   r   r   r   r   r  rD  r  r  r  rk  rn  rQ  rS  r\  rV  rO  rW  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   r3  A	  s    r3  c                  C   s   t d krdd l} | ja t S ro  )
_ftperrorsr  r  )r  rL   rL   rM   r6  L	  s    r6  c                   C   s   t d krtda t S r   )
_noheadersr  r  rL   rL   rL   rM   	noheadersU	  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| _|| _z|   W n   | 	   Y nX d S ro  )
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   rc  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|szd| }| j|\}}W nR |jk
r } z2t|d d dkrt	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 rS  Z550r  r:   zLIST ZLISTr  )r  endtransferr	  Zvoidcmdr  rc  ZntransfercmdZ
error_permr   r   r  r   r  pwdre  rd  r   Zmakefile
file_closera  r   )r   rO   r   r  cmdisdirr  r  r  rg  ZftpobjrL   rL   rM   r  {	  sP       

$
zftpwrapper.retrfilec                 C   s
   d| _ d S ro  )rd  r   rL   rL   rM   rf  	  s    zftpwrapper.endtransferc                 C   s   d| _ | jdkr|   d S )NFr   )rb  ra  
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   )rf  ra  rb  rk  r   rL   rL   rM   rh  	  s    zftpwrapper.file_closec                 C   s2   |    z| j  W n t k
r,   Y nX d S rN   )rf  r	  r   r6  r   rL   rL   rM   rk  	  s
    zftpwrapper.real_close)NT)
r   r   r   r   rc  r  rf  r   rh  rk  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    	
rn  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  .)rn  r  rx   r   rX  rd  lstripr  )rz   r&  Zno_proxyhostonlyrC  r_   rL   rL   rM   proxy_bypass_environment	  s*    
rs  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rzt|}||}W n tk
r   Y qDY nX ||d}	|d}
|
d krd|d	dd  }
nt
|
dd  }
|
dk sD|
dkrqDd|
 }
||
? |	|
? 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 )
Nrp  r   r      rV   r}  r:   r|  rS  )rX  r   r  rb   rd   )ZipAddrrB  rL   rL   rM   ip2num
  s
    
z,_proxy_bypass_macosx_sysconf.<locals>.ip2numrp  Zexclude_simpleT
exceptionsrL   z(\d+(?:\.\d+)*)(/\d+)?rV   r:   r|      F)rt  r   r   rf  rJ  r   r  rq   groupcountrb   )rz   proxy_settingsrt  rr  rC  rv  ZhostIPr   r  rD  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   )rn  rs  r  rz   r&  rL   rL   rM   r,  T
  s    
r,  c                   C   s   t  p
t S rN   )rn  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 }|rt||dd }d|kr|dD ]4}|dd\}}td|sd	||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  r8  rV   z(?:[^/:]+)://z%s://%srt  r&  r   z	http://%sz
https://%sr   zftp://%sr	  )winregImportErrorOpenKeyHKEY_CURRENT_USERQueryValueExr   rX  rf  rJ  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   )rn  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ProxyOverrider8  z<local>rp  rV   z\.ro  z.*?)r  r  r  r  r  r   rq   r   r   r  ra   ZgetfqdnrX  r  rf  rJ  rh  )rz   r  r  r  ZproxyOverrideZrawHostrC  ZaddrZfqdnrE  r   rL   rL   rM   proxy_bypass_registry
  s`    





r  c                 C   s    t  }|rt| |S t| S d S rN   )rn  rs  r  r  rL   rL   rM   r,  
  s    
)NNN)N)}r-  r   r  r  Zhttp.clientr   r  r[   	posixpathrf  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   rg  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.   rv  rx  r*   r  r+   r,   r-   r5  r_   Z
nturl2pathr4   r3   r  r8   r9   r\  r  r]  r3  r^  r6  r_  r`  r  rn  rs  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
