£Á°èZ¨Ä…–K§‚«“ô4“ÒÙ´dîfUÙÃÅ WKbyÊ¦•êŽ…È®FÒ¿ÊÎóCozá¬S@6{Í:›œêZÌ:Š•_%:¢¾¾~;‘Ã~èŠ©ÊÇí`ÔÑ©úë™µ'5I¿fš×WO%ø9¾«¾DK|€ùÍD”Ýs]nHÕ¶ê×Ó¼ãžªéUWŸÈË%DÒÕ¬ï‘]/Åcx  ‰ï2ß]ä6G[]S£ÔÏ¯rs{úëóµmÒï#UQxo·õÞCe]"±/aÙ&Eã4ú9Jé_ÞåëdãöKë)AÞ                  ¯¹ægƒÛowÐø^d™ý½ßB7áyMä9ÜÖUã
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
<html>
B
    YI~d             !   @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlZd dlmZmZmZ d dlmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' d dl(m)Z)m*Z* yd dl+Z+W n e,k
r   dZ-Y nX dZ-ddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'g!Z.d(ej/dd)  Z0da1de
j2fddddd*d+dZ3d,d Z4g Z5d}d-d$Z6d.d% Z7e	8d/e	j9Z:d0d1 Z;G d2d dZ<G d3d dZ=d4d  Z>G d5d	 d	Z?G d6d de?Z@G d7d
 d
e?ZAG d8d de?ZBd9d: ZCG d;d de?ZDG d<d dZEG d=d deEZFG d>d deFZGG d?d dZHG d@d deHe?ZIG dAd deHe?ZJejKZLG dBd dZMG dCd de?eMZNG dDd de?eMZOG dEdF dFe?ZPG dGd dePZQeRejSdHr&G dIdJ dJePZTe.UdJ G dKd de?ZVG dLd de?ZWdMdN ZXdOdP ZYG dQd de?ZZdRdS Z[G dTd de?Z\G dUd de\Z]G dVd de?Z^dWZ_ej`dXk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   3/opt/alt/python37/lib64/python3.7/urllib/request.pyr0      s*    <




c             C   s   | a d S )N)rF   )rK   rL   rL   rM   r1      s    c          
   C   s2  t | \}}tt| |}| }|dkrB|sBtj||fS |rRt|d}nt	j
dd}|j}t| | ||f}	d}
d}d}d}d|krt|d	 }|r|||
| xB||
}|sP |t|7 }|| |d
7 }|r|||
| qW W d Q R X W d Q R X |dkr.||k r.td||f |	|	S )NfilewbF)deletei    r   zcontent-lengthzContent-Length   z1retrieval incomplete: got only %i out of %i bytes)r   
contextlibclosingr0   infoospathnormpathrG   tempfileZNamedTemporaryFilename_url_tempfilesappendintreadlenwriter   )rH   filename
reporthookrI   Zurl_typerW   fpheaderstfpresultbssizer^   blocknumblockrL   rL   rM   r6      sD    


$c           	   C   sH   x0t D ](} yt|  W q tk
r,   Y qX qW t d d = trDd ad S )N)r[   rV   unlinkOSErrorrF   )Z	temp_filerL   rL   rM   r7   $  s    


z:\d+$c             C   s<   | j }t|d }|dkr&| dd}td|d}| S )NrR    Host)full_urlr   
get_header_cut_port_resublower)requestrH   hostrL   rL   rM   request_host3  s    rv   c               @   s   e Zd Zdi dddfddZedd Zejdd Zejdd Zed	d
 Zejdd
 Zejdd
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zd#ddZdd  Zd!d" ZdS )$r   NFc       	      C   sp   || _ i | _i | _d | _|| _d | _x | D ]\}}| || q.W |d krVt| }|| _	|| _
|rl|| _d S )N)ro   rd   unredirected_hdrs_datarI   _tunnel_hostitems
add_headerrv   origin_req_hostunverifiablemethod)	selfrH   rI   rd   r|   r}   r~   keyvaluerL   rL   rM   __init__E  s    zRequest.__init__c             C   s   | j rd| j| j S | jS )Nz{}#{})fragmentformat	_full_url)r   rL   rL   rM   ro   W  s    zRequest.full_urlc             C   s(   t || _t| j\| _| _|   d S )N)r   r   r   r   _parse)r   rH   rL   rL   rM   ro   ]  s    
c             C   s   d | _ d | _d| _d S )Nrm   )r   r   selector)r   rL   rL   rM   ro   d  s    c             C   s   | j S )N)rx   )r   rL   rL   rM   rI   j  s    zRequest.datac             C   s(   || j kr$|| _ | dr$| d d S )NzContent-length)rx   
has_headerremove_header)r   rI   rL   rL   rM   rI   n  s    

c             C   s
   d | _ d S )N)rI   )r   rL   rL   rM   rI   x  s    c             C   sN   t | j\| _}| jd kr(td| j t|\| _| _| jrJt| j| _d S )Nzunknown url type: %r)	r   r   typerB   ro   r   ru   r   r
   )r   restrL   rL   rM   r   |  s    
zRequest._parsec             C   s   | j d k	rdnd}t| d|S )NPOSTGETr~   )rI   getattr)r   Zdefault_methodrL   rL   rM   
get_method  s    zRequest.get_methodc             C   s   | j S )N)ro   )r   rL   rL   rM   get_full_url  s    zRequest.get_full_urlc             C   s2   | j dkr| js| j| _n|| _ | j| _|| _d S )Nhttps)r   ry   ru   ro   r   )r   ru   r   rL   rL   rM   	set_proxy  s
    
zRequest.set_proxyc             C   s   | j | jkS )N)r   ro   )r   rL   rL   rM   	has_proxy  s    zRequest.has_proxyc             C   s   || j | < d S )N)rd   
capitalize)r   r   valrL   rL   rM   r{     s    zRequest.add_headerc             C   s   || j | < d S )N)rw   r   )r   r   r   rL   rL   rM   add_unredirected_header  s    zRequest.add_unredirected_headerc             C   s   || j kp|| jkS )N)rd   rw   )r   header_namerL   rL   rM   r     s    
zRequest.has_headerc             C   s   | j || j||S )N)rd   getrw   )r   r   defaultrL   rL   rM   rp     s    zRequest.get_headerc             C   s    | j |d  | j|d  d S )N)rd   poprw   )r   r   rL   rL   rM   r     s    zRequest.remove_headerc             C   s"   | j  }|| j t| S )N)rw   copyupdaterd   listrz   )r   hdrsrL   rL   rM   header_items  s    
zRequest.header_items)N)__name__
__module____qualname__r   propertyro   setterdeleterrI   r   r   r   r   r   r{   r   r   rp   r   r   rL   rL   rL   rM   r   C  s(   

c               @   sN   e Zd Zdd Zdd Zdd Zdd Zd	ejfd
dZ	dddZ
dd Zd	S )r   c             C   s6   dt  }d|fg| _g | _i | _i | _i | _i | _d S )NzPython-urllib/%sz
User-agent)__version__
addheadershandlershandle_openhandle_errorprocess_responseprocess_request)r   Zclient_versionrL   rL   rM   r     s    zOpenerDirector.__init__c          	   C   sZ  t |dstdt| d}xt|D ]}|dkr:q*|d}|d | }||d d  }|dr|d| d }||d d  }yt|}W n tk
r   Y nX | j	|i }	|	| j|< n>|dkr|}| j
}	n*|d	kr|}| j}	n|d
kr*|}| j}	nq*|	|g }
|
r&t|
| n
|
| d}q*W |rVt| j| ||  d S )N
add_parentz%expected BaseHandler instance, got %rF)redirect_requestdo_open
proxy_open_rR   errorrG   responsert   T)hasattr	TypeErrorr   dirfind
startswithr]   rB   r   r   r   r   r   
setdefaultbisectZinsortr\   r   r   )r   handlerZaddedmethiprotocolZ	conditionjkindlookupr   rL   rL   rM   add_handler  sJ    



zOpenerDirector.add_handlerc             C   s   d S )NrL   )r   rL   rL   rM   close  s    zOpenerDirector.closec       	      G   s<   | |d}x*|D ]"}t||}|| }|d k	r|S qW d S )NrL   )r   r   )	r   chainr   	meth_nameargsr   r   funcrf   rL   rL   rM   _call_chain  s    

zOpenerDirector._call_chainNc       
      C   s   t |trt||}n|}|d k	r(||_||_|j}|d }x(| j|g D ]}t||}||}qLW | 	||}	|d }x*| j
|g D ]}t||}|||	}	qW |	S )NZ_requestZ	_response)
isinstancestrr   rI   rJ   r   r   r   r   _openr   )
r   fullurlrI   rJ   reqr   r   Z	processorr   r   rL   rL   rM   rG     s"    


zOpenerDirector.openc             C   sP   |  | jdd|}|r|S |j}|  | j||d |}|r>|S |  | jdd|S )Nr   Zdefault_openr   unknownunknown_open)r   r   r   )r   r   rI   rf   r   rL   rL   rM   r     s    


zOpenerDirector._openc             G   s~   |dkr,| j d }|d }d| }d}|}n| j }|d }d}|||f| }| j| }|r^|S |rz|dd	f| }| j| S d S )
N)httpr   r   r:   zhttp_error_%srR   _errorr   r   http_error_default)r   r   )r   protor   dictr   Zhttp_errZ	orig_argsrf   rL   rL   rM   r   &  s     

zOpenerDirector.error)N)r   r   r   r   r   r   r   socket_GLOBAL_DEFAULT_TIMEOUTrG   r   r   rL   rL   rL   rM   r     s   /
c           	   G   s   t  }ttttttttt	g	}t
tjdr2|t t }xN|D ]F}x@| D ]8}t|trlt||r|| qHt||rH|| qHW q>W x|D ]}|| qW x|D ]}||  qW x&| D ]}t|tr| }|| qW |S )NHTTPSConnection)r   r   r.   r)   r   r   r+   r*   r/   r-   r   r   clientr\   rE   setr   r   
issubclassaddremover   )r   rK   Zdefault_classesskipklassZcheckhrL   rL   rM   r2   ?  s0    	









c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	r   i  c             C   s
   || _ d S )N)parent)r   r   rL   rL   rM   r   f  s    zBaseHandler.add_parentc             C   s   d S )NrL   )r   rL   rL   rM   r   i  s    zBaseHandler.closec             C   s   t |dsdS | j|jk S )Nhandler_orderT)r   r   )r   otherrL   rL   rM   __lt__m  s    
zBaseHandler.__lt__N)r   r   r   r   r   r   r   rL   rL   rL   rM   r   c  s   c               @   s   e Zd ZdZdd ZeZdS )r/   i  c             C   sH   |j |j|   }}}d|  kr,dk sDn | jd|||||}|S )N   i,  r   )codemsgrU   r   r   )r   rt   r   r   r   r   rL   rL   rM   http_responsez  s
    z HTTPErrorProcessor.http_responseN)r   r   r   r   r   https_responserL   rL   rL   rM   r/   v  s   c               @   s   e Zd Zdd ZdS )r   c             C   s   t |j||||d S )N)r   ro   )r   r   rc   r   r   r   rL   rL   rM   r     s    z*HTTPDefaultErrorHandler.http_error_defaultN)r   r   r   r   rL   rL   rL   rM   r     s   c               @   s4   e Zd ZdZdZdd Zdd Ze Z ZZ	dZ
dS )	r      
   c       	         st   |  }|dkr|dks:|dkr(|dks:t|j|||||dd}d  fdd	|j D }t|||jd
dS )N)i-  i.  i/  i3  )r   ZHEAD)i-  i.  i/  r    z%20)zcontent-lengthzcontent-typec                s"   i | ]\}}|   kr||qS rL   )rs   ).0kv)CONTENT_HEADERSrL   rM   
<dictcomp>  s    z8HTTPRedirectHandler.redirect_request.<locals>.<dictcomp>T)rd   r|   r}   )r   r   ro   replacerd   rz   r   r|   )	r   r   rc   r   r   rd   newurlmZ
newheadersrL   )r   rM   r     s    
z$HTTPRedirectHandler.redirect_requestc       
      C   sL  d|kr|d }nd|kr$|d }nd S t |}|jdkrRt||d||f |||jsn|jrnt|}d|d< t|}t|dtj	d}t
|j|}| ||||||}|d k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   ftprm   z+%s - Redirection to url '%s' is not allowed/r:   z
iso-8859-1)encodingsaferedirect_dictr   rR   )rJ   )r   schemer   rW   Znetlocr   r   r	   stringZpunctuationr   ro   r   r   r   r   max_repeatsr_   max_redirectionsinf_msgr^   r   r   rG   rJ   )
r   r   rc   r   r   rd   r   urlpartsnewZvisitedrL   rL   rM   http_error_302  s@    



z"HTTPRedirectHandler.http_error_302zoThe HTTP server returned a redirect error that would lead to an infinite loop.
The last 30x error message was:
N)r   r   r   r   r   r   r  http_error_301http_error_303http_error_307r   rL   rL   rL   rM   r     s   &<c       	      C   s   t | \}}|ds d }| }n:|ds6td|  |dd}|dkrNd }|d| }t|\}}|d k	r|t|\}}nd  }}||||fS )Nr   z//zproxy URL with no authority: %rr:   rQ   )r   r   rB   r   r   r   )	proxyr   Zr_scheme	authorityendZuserinfohostportuserpasswordrL   rL   rM   _parse_proxy  s    

r  c               @   s"   e Zd ZdZdddZdd ZdS )r   d   Nc             C   sL   |d krt  }|| _x2| D ]&\}}t| d| ||| jfdd qW d S )Nz%s_openc             S   s   || ||S )NrL   )rr  r   r   rL   rL   rM   <lambda>$  s    z'ProxyHandler.__init__.<locals>.<lambda>)r5   proxiesrz   setattrr   )r   r  r   rH   rL   rL   rM   r     s    
zProxyHandler.__init__c             C   s   |j }t|\}}}}|d kr"|}|jr6t|jr6d S |rv|rvdt|t|f }	t|	 d}
|	dd|
  t|}|
|| ||ks|dkrd S | jj||jdS d S )Nz%s:%sasciizProxy-authorizationzBasic r   )rJ   )r   r  ru   proxy_bypassr
   base64	b64encodeencodedecoder{   r   r   rG   rJ   )r   r   r  r   Z	orig_typeZ
proxy_typer
  r  r	  Z	user_passZcredsrL   rL   rM   r   '  s     zProxyHandler.proxy_open)N)r   r   r   r   r   r   rL   rL   rL   rM   r     s   

c               @   s6   e Zd Zdd Zdd Zdd Zddd	Zd
d ZdS )r    c             C   s
   i | _ d S )N)passwd)r   rL   rL   rM   r   E  s    zHTTPPasswordMgr.__init__c                s`   t |tr|g}|jkr$i j|< x6dD ]. t fdd|D }||fj| |< q*W d S )N)TFc             3   s   | ]} | V  qd S )N)
reduce_uri)r   u)default_portr   rL   rM   	<genexpr>P  s    z/HTTPPasswordMgr.add_password.<locals>.<genexpr>)r   r   r  tuple)r   realmr   r
  r  reduced_urirL   )r  r   rM   add_passwordH  s    



zHTTPPasswordMgr.add_passwordc       	      C   s`   | j |i }xLdD ]D}| ||}x2| D ]&\}}x|D ]}| ||r<|S q<W q.W qW dS )N)TF)NN)r  r   r  rz   	is_suburi)	r   r  authuriZdomainsr  reduced_authuriZurisZauthinfor   rL   rL   rM   find_user_passwordS  s    

z"HTTPPasswordMgr.find_user_passwordTc       
      C   s   t |}|d r.|d }|d }|d p*d}nd }|}d}t|\}}|r~|d kr~|d k	r~ddd|}	|	d k	r~d||	f }||fS )	NrR   r   r:   r   P   i  )r   r   z%s:%d)r   r   r   )
r   r   r  partsr   r  rW   ru   portZdportrL   rL   rM   r  ]  s     zHTTPPasswordMgr.reduce_uric             C   sN   ||krdS |d |d kr dS |d }|dd  dkr@|d7 }|d  |S )NTr   FrR   rQ   r   )r   )r   basetestprefixrL   rL   rM   r!  t  s    zHTTPPasswordMgr.is_suburiN)T)r   r   r   r   r   r$  r  r!  rL   rL   rL   rM   r    C  s
   

c               @   s   e Zd Zdd ZdS )r!   c             C   s0   t | ||\}}|d k	r"||fS t | d |S )N)r    r$  )r   r  r"  r
  r  rL   rL   rM   r$    s
    
z2HTTPPasswordMgrWithDefaultRealm.find_user_passwordN)r   r   r   r$  rL   rL   rL   rM   r!     s   c                   s<   e Zd Z fddZd
 fdd	ZdddZdd	 Z  ZS )r"   c                s   i | _ t j|| d S )N)authenticatedsuperr   )r   r   kwargs)	__class__rL   rM   r     s    z%HTTPPasswordMgrWithPriorAuth.__init__Fc                s<   |  || |d k	r&t d ||| t |||| d S )N)update_authenticatedr,  r   )r   r  r   r
  r  is_authenticated)r.  rL   rM   r     s    z)HTTPPasswordMgrWithPriorAuth.add_passwordc             C   sF   t |tr|g}x0dD ](}x"|D ]}| ||}|| j|< q W qW d S )N)TF)r   r   r  r+  )r   r   r0  r  r  r  rL   rL   rM   r/    s    


z1HTTPPasswordMgrWithPriorAuth.update_authenticatedc             C   sD   x>dD ]6}|  ||}x$| jD ]}| ||r| j| S qW qW d S )N)TF)r  r+  r!  )r   r"  r  r#  r   rL   rL   rM   r0    s
    
z-HTTPPasswordMgrWithPriorAuth.is_authenticated)F)F)r   r   r   r   r   r/  r0  __classcell__rL   rL   )r.  rM   r"     s   

c               @   sT   e Zd ZedejZdddZdd Zdd Z	d	d
 Z
dd Zdd ZeZeZdS )r#   z1(?:^|,)[ 	]*([^ 	,]+)[ 	]+realm=(["']?)([^"']*)\2Nc             C   s"   |d krt  }|| _| jj| _d S )N)r    r  r   )r   Zpassword_mgrrL   rL   rM   r     s    z!AbstractBasicAuthHandler.__init__c             c   st   d}xFt j|D ]6}| \}}}|dkr:tdtd ||fV  d}qW |sp|rb| d }nd}|d fV  d S )NF)"'zBasic Auth Realm was unquoted   Tr   rm   )r#   rxfinditergroupsr?   r@   UserWarningsplit)r   headerZfound_challengemor   r	   r  rL   rL   rM   _parse_realm  s    
z%AbstractBasicAuthHandler._parse_realmc       	      C   s~   | |}|sd S d }xL|D ]D}x>| |D ]0\}}| dkrF|}q,|d k	r,| |||S q,W qW |d k	rztd|f d S )NbasiczBAbstractBasicAuthHandler does not support the following scheme: %r)Zget_allr<  rs   retry_http_basic_authrB   )	r   authreqru   r   rd   Zunsupportedr:  r   r  rL   rL   rM   http_error_auth_reqed  s    

z.AbstractBasicAuthHandler.http_error_auth_reqedc             C   s|   | j ||\}}|d k	rtd||f }dt| d }|| jd |krTd S || j| | j	j
||jdS d S d S )Nz%s:%szBasic r  )rJ   )r  r$  r  r  r  r  rp   auth_headerr   r   rG   rJ   )r   ru   r   r  r
  pwrawauthrL   rL   rM   r>    s    z.AbstractBasicAuthHandler.retry_http_basic_authc             C   st   t | jdr| j|js|S |dsp| jd |j\}}d|| }t	|
 }|dd|  |S )Nr0  Authorizationz{0}:{1}zBasic {})r   r  r0  ro   r   r$  r   r  r  Zstandard_b64encoder  r   strip)r   r   r
  r  ZcredentialsZauth_strrL   rL   rM   http_request  s    
z%AbstractBasicAuthHandler.http_requestc             C   sL   t | jdrHd|j  kr"dk r8n n| j|jd n| j|jd |S )Nr0  r   i,  TF)r   r  r   r/  ro   )r   r   r   rL   rL   rM   r     s
    z&AbstractBasicAuthHandler.http_response)N)r   r   r   recompileIr5  r   r<  r@  r>  rG  r   https_requestr   rL   rL   rL   rM   r#     s   
c               @   s   e Zd ZdZdd ZdS )r$   rE  c             C   s   |j }| d|||}|S )Nzwww-authenticate)ro   r@  )r   r   rc   r   r   rd   rH   r   rL   rL   rM   http_error_401  s    
z#HTTPBasicAuthHandler.http_error_401N)r   r   r   rA  rL  rL   rL   rL   rM   r$     s   c               @   s   e Zd ZdZdd ZdS )r%   zProxy-authorizationc             C   s   |j }| d|||}|S )Nzproxy-authenticate)ru   r@  )r   r   rc   r   r   rd   r  r   rL   rL   rM   http_error_407*  s    
z$ProxyBasicAuthHandler.http_error_407N)r   r   r   rA  rM  rL   rL   rL   rM   r%   &  s   c               @   sN   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dS )r&   Nc             C   s4   |d krt  }|| _| jj| _d| _d| _d | _d S )Nr   )r    r  r   retriednonce_count
last_nonce)r   r  rL   rL   rM   r   D  s    
z"AbstractDigestAuthHandler.__init__c             C   s
   d| _ d S )Nr   )rN  )r   rL   rL   rM   reset_retry_countM  s    z+AbstractDigestAuthHandler.reset_retry_countc             C   s|   | |d }| jdkr*t|jdd|d n|  jd7  _|rx| d }| dkr`| ||S | dkrxtd| d S )	N   i  zdigest auth failedrR   r   Zdigestr=  zEAbstractDigestAuthHandler does not support the following scheme: '%s')r   rN  r   ro   r9  rs   retry_http_digest_authrB   )r   rA  ru   r   rd   r?  r   rL   rL   rM   r@  P  s    


z/AbstractDigestAuthHandler.http_error_auth_reqedc             C   sz   | dd\}}ttd t|}| ||}|rvd| }|j| jd |krRd S || j| | j	j
||jd}|S d S )Nr   rR   z	Digest %s)rJ   )r9  parse_keqv_listfilterparse_http_listget_authorizationrd   r   rA  r   r   rG   rJ   )r   r   rD  tokenZ	challengechalZauth_valZresprL   rL   rM   rS  d  s    z0AbstractDigestAuthHandler.retry_http_digest_authc             C   s@   d| j |t f }|dtd }t| }|d d S )Nz	%s:%s:%s:r        )rO  timeZctimer  _randombyteshashlibsha1	hexdigest)r   noncesbdigrL   rL   rM   
get_cnoncep  s    z$AbstractDigestAuthHandler.get_cnoncec             C   s  y6|d }|d }| d}| dd}| dd }W n tk
rJ   d S X | |\}}	|d krfd S | j||j\}
}|
d krd S |jd k	r| |j|}nd }d|
||f }d| |j	f }|d kr|	||d|||f }n~d	|
d
krZ|| jkr|  jd7  _nd| _|| _d| j }| |}d|||d	||f }|	|||}ntd| d|
|||j	|f }|r|d| 7 }|r|d| 7 }|d| 7 }|r|d||f 7 }|S )Nr  ra  qop	algorithmMD5opaquez%s:%s:%sz%s:%srD  ,rR   z%08xz%s:%s:%s:%s:%szqop '%s' is not supported.z>username="%s", realm="%s", nonce="%s", uri="%s", response="%s"z, opaque="%s"z, digest="%s"z, algorithm="%s"z, qop=auth, nc=%s, cnonce="%s")r   KeyErrorget_algorithm_implsr  r$  ro   rI   get_entity_digestr   r   r9  rP  rO  re  r   )r   r   rY  r  ra  rf  rg  ri  HKDr
  rB  ZentdigZA1ZA2ZrespdigZncvalueZcnonceZnoncebitr(  rL   rL   rM   rW  {  sV    





z+AbstractDigestAuthHandler.get_authorizationc                sD   |dkrdd  n|dkr$dd  nt d|  fdd} |fS )Nrh  c             S   s   t | d S )Nr  )r^  Zmd5r  r`  )xrL   rL   rM   r        z?AbstractDigestAuthHandler.get_algorithm_impls.<locals>.<lambda>ZSHAc             S   s   t | d S )Nr  )r^  r_  r  r`  )rp  rL   rL   rM   r    rq  z.Unsupported digest authentication algorithm %rc                s    d| |f S )Nz%s:%srL   )rb  d)rn  rL   rM   r    rq  )rB   )r   rg  ro  rL   )rn  rM   rl    s    

z-AbstractDigestAuthHandler.get_algorithm_implsc             C   s   d S )NrL   )r   rI   rY  rL   rL   rM   rm    s    z+AbstractDigestAuthHandler.get_entity_digest)N)r   r   r   r   rQ  r@  rS  re  rW  rl  rm  rL   rL   rL   rM   r&   9  s   
	>c               @   s   e Zd ZdZdZdd ZdS )r'   rE  i  c             C   s*   t |jd }| d|||}|   |S )NrR   zwww-authenticate)r   ro   r@  rQ  )r   r   rc   r   r   rd   ru   retryrL   rL   rM   rL    s
    
z$HTTPDigestAuthHandler.http_error_401N)r   r   r   rA  r   rL  rL   rL   rL   rM   r'     s   c               @   s   e Zd ZdZdZdd ZdS )r(   zProxy-Authorizationi  c             C   s"   |j }| d|||}|   |S )Nzproxy-authenticate)ru   r@  rQ  )r   r   rc   r   r   rd   ru   rs  rL   rL   rM   rM    s
    
z%ProxyDigestAuthHandler.http_error_407N)r   r   r   rA  r   rM  rL   rL   rL   rM   r(     s   c               @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )AbstractHTTPHandlerr   c             C   s
   || _ d S )N)_debuglevel)r   
debuglevelrL   rL   rM   r     s    zAbstractHTTPHandler.__init__c             C   s
   || _ d S )N)ru  )r   levelrL   rL   rM   set_http_debuglevel  s    z'AbstractHTTPHandler.set_http_debuglevelc             C   s   t jj|j| S )N)r   r   HTTPConnection_get_content_lengthrI   r   )r   rt   rL   rL   rM   rz    s    z'AbstractHTTPHandler._get_content_lengthc             C   s  |j }|std|jd k	r|j}t|tr8d}t||dsN|dd |ds|ds| |}|d k	r|dt| n|dd |}|	 rt
|j\}}t|\}}	|ds|d| x2| jjD ]&\}
}|
 }
||
s||
| qW |S )	Nzno host givenz\POST data should be bytes, an iterable of bytes, or a file object. It cannot be of type str.zContent-typez!application/x-www-form-urlencodedzContent-lengthzTransfer-encodingZchunkedrn   )ru   r   rI   r   r   r   r   r   rz  r   r   r   r   r   r   r   )r   rt   ru   rI   r   Zcontent_lengthZsel_hostr   ZselZsel_pathrZ   r   rL   rL   rM   do_request_  s>    







zAbstractHTTPHandler.do_request_c       
   
      sT  |j }|std||fd|ji|}|| j t|j   fdd|j	 D  d d< dd  	 D  |j
ri }d}| kr | ||<  |= |j|j
|d	 y`y&|j| |j|j |d
d W n, tk
r } zt|W d d }~X Y nX | }	W n   |   Y nX |jr>|j  d |_| |	_|	j|	_|	S )Nzno host givenrJ   c                s   i | ]\}}| kr||qS rL   rL   )r   r   r   )rd   rL   rM   r   *  s    z/AbstractHTTPHandler.do_open.<locals>.<dictcomp>r   
Connectionc             S   s   i | ]\}}||  qS rL   )title)r   rZ   r   rL   rL   rM   r   7  s    zProxy-Authorization)rd   zTransfer-encoding)Zencode_chunked)ru   r   rJ   Zset_debuglevelru  r   rw   r   rd   rz   ry   Z
set_tunnelrt   r   r   rI   r   rl   getresponser   Zsockr   rH   reasonr   )
r   Z
http_classr   Zhttp_conn_argsru   r   Ztunnel_headersZproxy_auth_hdrerrr  rL   )rd   rM   r     s@    


zAbstractHTTPHandler.do_openN)r   )r   r   r   r   rx  rz  r{  r   rL   rL   rL   rM   rt    s
   
&rt  c               @   s   e Zd Zdd ZejZdS )r)   c             C   s   |  tjj|S )N)r   r   r   ry  )r   r   rL   rL   rM   	http_opena  s    zHTTPHandler.http_openN)r   r   r   r  rt  r{  rG  rL   rL   rL   rM   r)   _  s   r   c               @   s$   e Zd ZdddZdd ZejZdS )rE   r   Nc             C   s   t | | || _|| _d S )N)rt  r   _context_check_hostname)r   rv  r>   check_hostnamerL   rL   rM   r   j  s    zHTTPSHandler.__init__c             C   s   | j tjj|| j| jdS )N)r>   r  )r   r   r   r   r  r  )r   r   rL   rL   rM   
https_openo  s    zHTTPSHandler.https_open)r   NN)r   r   r   r   r  rt  r{  rK  rL   rL   rL   rM   rE   h  s   
rE   c               @   s.   e Zd ZdddZdd Zdd ZeZeZdS )	r   Nc             C   s$   dd l }|d kr|j }|| _d S )Nr   )Zhttp.cookiejar	cookiejarZ	CookieJar)r   r  r   rL   rL   rM   r   x  s    
zHTTPCookieProcessor.__init__c             C   s   | j | |S )N)r  Zadd_cookie_header)r   rt   rL   rL   rM   rG  ~  s    z HTTPCookieProcessor.http_requestc             C   s   | j || |S )N)r  Zextract_cookies)r   rt   r   rL   rL   rM   r     s    z!HTTPCookieProcessor.http_response)N)r   r   r   r   rG  r   rK  r   rL   rL   rL   rM   r   w  s
   
c               @   s   e Zd Zdd ZdS )r.   c             C   s   |j }td| d S )Nzunknown url type: %s)r   r   )r   r   r   rL   rL   rM   r     s    zUnknownHandler.unknown_openN)r   r   r   r   rL   rL   rL   rM   r.     s   c             C   sR   i }xH| D ]@}| dd\}}|d dkrB|d dkrB|dd }|||< q
W |S )N=rR   r   r2  rQ   )r9  )lZparsedZeltr   r   rL   rL   rM   rT    s    
rT  c             C   s   g }d}d }}xt| D ]l}|r,||7 }d}q|rV|dkr@d}qn|dkrLd}||7 }q|dkrn| | d}q|dkrzd}||7 }qW |r| | dd |D S )	Nrm   F\Tr2  rj  c             S   s   g | ]}|  qS rL   )rF  )r   partrL   rL   rM   
<listcomp>  s    z#parse_http_list.<locals>.<listcomp>)r\   )rb  Zresr  escaper	   ZcurrL   rL   rM   rV    s4    	


rV  c               @   s(   e Zd Zdd ZdZdd Zdd ZdS )r*   c             C   s\   |j }|d d dkrN|dd dkrN|jrN|jdkrN|j|  krXtdn
| |S d S )Nr:   z//r4  r   	localhostz-file:// scheme is supported only on localhost)r   ru   	get_namesr   open_local_file)r   r   rH   rL   rL   rM   	file_open  s    &

zFileHandler.file_openNc             C   s`   t jd krZy*ttdd tt d  t _W n$ tjk
rX   tdft _Y nX t jS )Nr  r:   )r*   namesr  r   gethostbyname_exgethostnamegaierrorgethostbyname)r   rL   rL   rM   r    s    
zFileHandler.get_namesc          
   C   s   dd l }dd l}|j}|j}t|}yt|}|j}|jj	|j
dd}	||d }
|d|
pbd||	f }|r~t|\}}|r|st||  kr|rd| | }nd| }tt|d||S W n* tk
r } zt|W d d }~X Y nX tdd S )	Nr   T)usegmtz6Content-type: %s
Content-length: %d
Last-modified: %s
z
text/plainzfile://rbzfile not on local host)email.utils	mimetypesru   r   r4   rV   statst_sizeutils
formatdatest_mtime
guess_typemessage_from_stringr   _safe_gethostbynamer  r   rG   rl   r   )r   r   emailr  ru   ra   Z	localfilestatsrh   modifiedmtyperd   r'  ZorigurlexprL   rL   rM   r    s0    
zFileHandler.open_local_file)r   r   r   r  r  r  r  rL   rL   rL   rM   r*     s   
c             C   s&   y
t | S  t jk
r    d S X d S )N)r   r  r  )ru   rL   rL   rM   r    s    
r  c               @   s   e Zd Zdd Zdd ZdS )r+   c          
   C   s,  dd l }dd l}|j}|s"tdt|\}}|d kr>|j}nt|}t|\}}|rdt|\}}nd }t	|}|pvd}|p~d}yt
|}W n* tk
r } zt|W d d }~X Y nX t|j\}	}
|	d}ttt	|}|d d |d  }}|r|d s|dd  }y| ||||||j}|r6dp8d}x:|
D ]2}t|\}}| d	kr@|d
kr@| }q@W |||\}}d}||jd }|r|d| 7 }|d k	r|dkr|d| 7 }t|}t|||jS  |jk
r& } z"td| }|t  d W d d }~X Y nX d S )Nr   zftp error: no host givenrm   r   rQ   rR   rJ  Dr   )aAr   rJ  rr  r  zContent-type: %s
zContent-length: %d
zftp error: %rr:   )!ftplibr  ru   r   r   FTP_PORTr]   r   r   r
   r   r  rl   r   r   r9  r   mapconnect_ftprJ   r   rs   upperretrfiler  ro   r  r  r   
all_errorswith_tracebacksysexc_info)r   r   r  r  ru   r'  r
  r  r   rW   attrsdirsrN   fwr   attrr   rc   retrlenrd   r  r  excrL   rL   rM   ftp_open  s\    



zFTPHandler.ftp_openc          	   C   s   t ||||||ddS )NF)
persistent)
ftpwrapper)r   r
  r  ru   r'  r  rJ   rL   rL   rM   r  2  s    zFTPHandler.connect_ftpN)r   r   r   r  r  rL   rL   rL   rM   r+     s   5c               @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )r,   c             C   s"   i | _ i | _d| _d| _d| _d S )Nr   <   r[  )cacherJ   soonestdelay	max_conns)r   rL   rL   rM   r   9  s
    zCacheFTPHandler.__init__c             C   s
   || _ d S )N)r  )r   trL   rL   rM   
setTimeout@  s    zCacheFTPHandler.setTimeoutc             C   s
   || _ d S )N)r  )r   r   rL   rL   rM   setMaxConnsC  s    zCacheFTPHandler.setMaxConnsc             C   sr   |||d ||f}|| jkr4t | j | j|< n,t||||||| j|< t | j | j|< |   | j| S )Nr   )joinr  r\  r  rJ   r  check_cache)r   r
  r  ru   r'  r  rJ   r   rL   rL   rM   r  F  s    

zCacheFTPHandler.connect_ftpc             C   s   t   }| j|krTx@t| j D ].\}}||k r"| j|   | j|= | j|= q"W tt| j | _t	| j| j
krx6t| j D ]$\}}|| jkr| j|= | j|= P qW tt| j | _d S )N)r\  r  r   rJ   rz   r  r   minvaluesr_   r  )r   r  r   r   rL   rL   rM   r  Q  s    

zCacheFTPHandler.check_cachec             C   s4   x| j  D ]}|  qW | j   | j  d S )N)r  r  r   clearrJ   )r   connrL   rL   rM   clear_cachee  s    
zCacheFTPHandler.clear_cacheN)	r   r   r   r   r  r  r  r  r  rL   rL   rL   rM   r,   6  s   c               @   s   e Zd Zdd ZdS )r-   c             C   s~   |j }|dd\}}|dd\}}t|}|drNt|}|d d }|sVd}td|t|f }t	t
|||S )N:rR   rj  z;base64iztext/plain;charset=US-ASCIIz$Content-type: %s
Content-length: %d
)ro   r9  r   endswithr  decodebytesr  r  r_   r   ioBytesIO)r   r   rH   r   rI   Z	mediatyperd   rL   rL   rM   	data_openl  s    


zDataHandler.data_openN)r   r   r   r  rL   rL   rL   rM   r-   k  s   r   nt)r4   r3   c             C   s   t | S )N)r
   )pathnamerL   rL   rM   r4     s    c             C   s   t | S )N)r	   )r  rL   rL   rM   r3     s    c               @   s   e Zd ZdZde Zd)ddZdd Zdd Zd	d
 Z	dd Z
d*ddZd+ddZd,ddZd-ddZdd Zd.ddZd/ddZdd Zerdd Zd0dd Zd!d" Zd#d$ Zd%d& Zd1d'd(ZdS )2r8   NzPython-urllib/%sc             K   sz   dd| j ji }tj|tdd |d kr.t }|| _|d| _|d| _	d| j
fdg| _g | _tj| _d | _t| _d S )	NzW%(class)s style of invoking requests is deprecated. Use newer urlopen functions/methodsclassr4  )
stacklevelkey_file	cert_filez
User-Agent)ZAcceptz*/*)r.  r   r?   r@   rA   r5   r  r   r  r  versionr   _URLopener__tempfilesrV   rk   _URLopener__unlink	tempcacheftpcache)r   r  Zx509r   rL   rL   rM   r     s    zURLopener.__init__c             C   s   |    d S )N)r   )r   rL   rL   rM   __del__  s    zURLopener.__del__c             C   s   |    d S )N)cleanup)r   rL   rL   rM   r     s    zURLopener.closec          	   C   sZ   | j rFx2| j D ](}y| | W q tk
r4   Y qX qW | j d d = | jrV| j  d S )N)r  r  rl   r  r  )r   rN   rL   rL   rM   r    s    
zURLopener.cleanupc             G   s   | j | d S )N)r   r\   )r   r   rL   rL   rM   	addheader  s    zURLopener.addheaderc          
   C   sl  t t|}t|dd}| jrL|| jkrL| j| \}}t|d}t|||S t|\}}|s`d}|| jkr| j| }t|\}}	t|	\}
}|
|f}nd }d| }|| _	|
dd}t| |r|dkr|r| |||S | ||S y,|d k rt| ||S t| |||S W nV ttfk
r,    Y n< tk
rf } ztd	|t d
 W d d }~X Y nX d S )Nz%/:=&?~#+!$,;'@()*[]|)r   r  rN   Zopen_-r   r  zsocket errorr:   )r   r   r	   r  rG   r   r   r  r   r   r   r   open_unknown_proxyopen_unknownr   r   r   rl   r  r  r  )r   r   rI   ra   rd   rc   urltyperH   r  	proxyhostru   r   rZ   r   rL   rL   rM   rG     s<    




zURLopener.openc             C   s   t |\}}tdd|d S )Nz	url errorzunknown url type)r   rl   )r   r   rI   r   rH   rL   rL   rM   r    s    zURLopener.open_unknownc             C   s    t |\}}tdd| |d S )Nz	url errorzinvalid proxy for %s)r   rl   )r   r  r   rI   r   rH   rL   rL   rM   r  
  s    zURLopener.open_unknown_proxyc          
   C   s  t t|}| jr&|| jkr&| j| S t|\}}|d kr|rF|dkry.| |}| }|  tt|d |fS  t	k
r }	 zW d 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	rR|| j|< d}d}d}d}d|
krxt|
d	 }|r|||| xH||}|sP |t|7 }|| |d7 }|r|||| qW W d |  X W d |  X |dkr||k rtd
||f ||S )NrN   rR   rO   rm   i    rQ   r   zcontent-lengthzContent-Lengthz1retrieval incomplete: got only %i out of %i bytes)r   r   r  r   r  rU   r   r4   r   rl   rG   r   r   rV   rW   splitextrY   Zmkstempr  r\   fdopenr]   r^   r_   r`   r   )r   rH   ra   rb   rI   r   Zurl1rc   r   r   rd   re   ZgarbagerW   suffixfdrf   rg   rh   r^   ri   rj   rL   rL   rM   retrieve  sj    






zURLopener.retrievec             C   s(  d }d }t |tr<t|\}}|r6t|\}}t|}|}nt|\}}t|\}}t|\}	}
|
}d }|	 dkrvd }n:t|
\}}
|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< x| jD ]\}}|||< qZW |d k	rd|d< |d||| n|jd||d y| }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 errorzno host givenr  zBasic %szProxy-AuthorizationrE  rn   r   r|  z!application/x-www-form-urlencodedzContent-Typer   r   )rd   z$http protocol error: bad status liner   i,  zhttp:)r   r   r   r   r
   r   rs   r  rl   r  r  r  r  r   rt   r~  r   r   ZBadStatusLiner   statusr   r   
http_errorrc   r  )r   Zconnection_factoryrH   rI   Zuser_passwdZproxy_passwdru   r   Zrealhostr  r   Z
proxy_authrD  Z	http_connrd   r:  r   r   rL   rL   rM   _open_generic_httpQ  sr    
 

zURLopener._open_generic_httpc             C   s   |  tjj||S )N)r  r   r   ry  )r   rH   rI   rL   rL   rM   	open_http  s    zURLopener.open_httpc       
      C   sb   d| }t | |rPt| |}|d kr6||||||}	n|||||||}	|	rP|	S | |||||S )Nzhttp_error_%d)r   r   r   )
r   rH   rc   errcodeerrmsgrd   rI   rZ   r~   rf   rL   rL   rM   r    s    

 zURLopener.http_errorc             C   s   |   t||||d d S )N)r   r   )r   rH   rc   r  r  rd   rL   rL   rM   r     s    zURLopener.http_error_defaultc             C   s   t jj|| j| jdS )N)r  r  )r   r   r   r  r  )r   ru   rL   rL   rM   _https_connection  s    zURLopener._https_connectionc             C   s   |  | j||S )N)r  r  )r   rH   rI   rL   rL   rM   
open_https  s    zURLopener.open_httpsc             C   s^   t |tstd|d d dkrP|dd dkrP|dd  dkrPtdn
| |S d S )	NzEfile error: proxy support for file protocol currently not implementedr:   z//r4  r      z
localhost/z-file:// scheme is supported only on localhost)r   r   r   rs   rB   r  )r   rH   rL   rL   rM   	open_file  s
    
4
zURLopener.open_filec          
   C   s\  dd l }dd l}t|\}}t|}yt|}W n0 tk
rb } zt|j|j	W d d }~X Y nX |j
}	|jj|jdd}
||d }|d|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   T)r  z6Content-Type: %s
Content-Length: %d
Last-modified: %s
z
text/plainrR   r   zfile://r  r:   z./zAlocal file url may start with / or file:. Unknown url of type: %sz#local file error: not on local host)r  r  r   r4   rV   r  rl   r   strerrorra   r  r  r  r  r  r  r   rG   r   r   r  r  thishostrB   )r   rH   r  r  ru   rN   Z	localnamer  erh   r  r  rd   Zurlfiler'  rL   rL   rM   r    s:     
zURLopener.open_local_filec          
   C   s  t |tstddd l}t|\}}|s2tdt|\}}t|\}}|r\t|\}}nd }t|}t|ppd}t|p|d}t	
|}|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rfx8t| jD ]*}||kr8| j| }| j|= |  q8W y|| jkrt|||||
| j|< |sd}nd	}x:|	D ]2}t|\}}| d
kr|dkr| }qW | j| ||\}}|d| d }d}|r|d| 7 }|d k	r4|dkr4|d| 7 }t|}t||d| S  t k
r } ztd|  t!" d W d d }~X Y nX d S )NzCftp error: proxy support for ftp protocol currently not implementedr   zftp error: no host givenrm   r   rQ   rR   r  rJ  r   )r  r  r   rJ  rr  r  zftp:zContent-Type: %s
zContent-Length: %d
zftp error %rr:   )#r   r   r   r  r   r   r   r   r
   r   r  r  r  r]   r   r9  r  r_   r  MAXFTPCACHEr   r   r  r   rs   r  r  r  r  r  r   	ftperrorsr  r  r  )r   rH   r  ru   rW   r'  r
  r  r  r  r  rN   r   r   r   r   r  r   rc   r  r  rd   r  rL   rL   rM   open_ftp  sp    
  

  

 


zURLopener.open_ftpc       	   
   C   s<  t |tstdy|dd\}}W n tk
rD   tddY nX |sNd}|d}|dk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 implementedrj  rR   z
data errorzbad data URLztext/plain;charset=US-ASCII;r   r  rm   zDate: %sz%a, %d %b %Y %H:%M:%S GMTzContent-type: %sr  r  zlatin-1zContent-Length: %d
)r   r   r   r9  rB   rl   rfindr\   r\  ZstrftimeZgmtimer  r  r  r  r
   r_   r  r  r  r  StringIOr   )	r   rH   rI   r   Zsemir   r   rd   frL   rL   rM   	open_data3  s6    






zURLopener.open_data)N)N)N)N)NNN)N)N)N)N)r   r   r   r  r   r  r   r  r   r  r  rG   r  r  r  r  r  r  r   rC   r  r  r  r  r  r  rL   rL   rL   rM   r8     s,   

$


A\


	 :c               @   s   e Zd Zdd Zdd Zd"ddZdd	 Zd#d
dZd$ddZd%ddZ	d&ddZ
d'ddZd(ddZd)ddZd*ddZd+ddZd,ddZd d! ZdS )-r9   c             O   s(   t j| f|| i | _d| _d| _d S )Nr   r   )r8   r   
auth_cachetriesmaxtries)r   r   r-  rL   rL   rM   r   `  s    zFancyURLopener.__init__c             C   s   t ||d| |S )Nzhttp:)r   )r   rH   rc   r  r  rd   rL   rL   rM   r   f  s    z!FancyURLopener.http_error_defaultNc       	      C   sn   |  j d7  _ zR| jrJ| j | jkrJt| dr4| j}n| j}|||dd|S | ||||||}|S d| _ X d S )NrR   http_error_500i  z)Internal Server Error: Redirect Recursionr   )r  r  r   r  r   redirect_internal)	r   rH   rc   r  r  rd   rI   r   rf   rL   rL   rM   r  j  s    
zFancyURLopener.http_error_302c       	      C   sx   d|kr|d }nd|kr$|d }nd S |   t| jd | |}t|}|jdkrnt|||d|  ||| |S )Nr   r   r  )r   r   r   rm   z( Redirection to url '%s' is not allowed.)r   r   r   r   r   r   rG   )	r   rH   rc   r  r  rd   rI   r   r   rL   rL   rM   r  |  s    


z FancyURLopener.redirect_internalc             C   s   |  ||||||S )N)r  )r   rH   rc   r  r  rd   rI   rL   rL   rM   r    s    zFancyURLopener.http_error_301c             C   s   |  ||||||S )N)r  )r   rH   rc   r  r  rd   rI   rL   rL   rM   r    s    zFancyURLopener.http_error_303c             C   s2   |d kr|  ||||||S | |||||S d S )N)r  r   )r   rH   rc   r  r  rd   rI   rL   rL   rM   r    s    zFancyURLopener.http_error_307Fc             C   s   d|krt | ||||| |d }td|}	|	sHt | ||||| |	 \}
}|
 dkrtt | ||||| |st | ||||| d| j d }|d krt| |||S t| ||||S d S )Nzwww-authenticatez![ 	]*([^ 	]+)[ 	]+realm="([^"]*)"r=  Zretry__basic_auth)r8   r   rH  matchr7  rs   r   r   )r   rH   rc   r  r  rd   rI   rs  stuffr  r   r  rZ   rL   rL   rM   rL    s&    





zFancyURLopener.http_error_401c             C   s   d|krt | ||||| |d }td|}	|	sHt | ||||| |	 \}
}|
 dkrtt | ||||| |st | ||||| d| j d }|d krt| |||S t| ||||S d S )Nzproxy-authenticatez![ 	]*([^ 	]+)[ 	]+realm="([^"]*)"r=  Zretry_proxy_r  )r8   r   rH  r  r7  rs   r   r   )r   rH   rc   r  r  rd   rI   rs  r  r  r   r  rZ   rL   rL   rM   rM    s&    





zFancyURLopener.http_error_407c             C   s   t |\}}d| | }| jd }t|\}}	t |	\}	}
|	dd }|	|d  }	| |	||\}}|sr|srd S dt|ddt|dd|	f }	d|	 |
 | jd< |d kr| |S | ||S d S )Nzhttp://r   @rR   z%s:%s@%srm   )r   )r   r  r   r   get_user_passwdr	   rG   )r   rH   r  rI   ru   r   r   r  r  r  proxyselectorr   r
  r  rL   rL   rM   retry_proxy_http_basic_auth  s     
 
z*FancyURLopener.retry_proxy_http_basic_authc             C   s   t |\}}d| | }| jd }t|\}}	t |	\}	}
|	dd }|	|d  }	| |	||\}}|sr|srd S dt|ddt|dd|	f }	d|	 |
 | jd< |d kr| |S | ||S d S )Nzhttps://r   r  rR   z%s:%s@%srm   )r   )r   r  r   r   r	  r	   rG   )r   rH   r  rI   ru   r   r   r  r  r  r
  r   r
  r  rL   rL   rM   retry_proxy_https_basic_auth  s     
 
z+FancyURLopener.retry_proxy_https_basic_authc       
      C   s   t |\}}|dd }||d  }| |||\}}|sD|sDd S dt|ddt|dd|f }d| | }	|d kr| |	S | |	|S d S )Nr  rR   z%s:%s@%srm   )r   zhttp://)r   r   r	  r	   rG   )
r   rH   r  rI   ru   r   r   r
  r  r   rL   rL   rM   r>    s     
z$FancyURLopener.retry_http_basic_authc       
      C   s   t |\}}|dd }||d  }| |||\}}|sD|sDd S dt|ddt|dd|f }d| | }	|d kr| |	S | |	|S d S )Nr  rR   z%s:%s@%srm   )r   zhttps://)r   r   r	  r	   rG   )
r   rH   r  rI   ru   r   r   r
  r  r   rL   rL   rM   retry_https_basic_auth	  s     
z%FancyURLopener.retry_https_basic_authr   c             C   s`   |d |   }|| jkr2|r(| j|= n
| j| S | ||\}}|sJ|rX||f| j|< ||fS )Nr  )rs   r   prompt_user_passwd)r   ru   r  r  r   r
  r  rL   rL   rM   r	  	  s    


 zFancyURLopener.get_user_passwdc             C   sT   dd l }y,td||f }| d|||f }||fS  tk
rN   t  dS X d S )Nr   zEnter username for %s at %s: z#Enter password for %s in %s at %s: )NN)getpassinputKeyboardInterruptprint)r   ru   r  r  r
  r  rL   rL   rM   r  $	  s    z!FancyURLopener.prompt_user_passwd)N)N)N)N)NF)NF)N)N)N)N)r   )r   r   r   r   r   r  r  r  r  r  rL  rM  r  r  r>  r  r	  r  rL   rL   rL   rM   r9   ]  s"   



 
 





c               C   s   t d krtda t S )Nr  )
_localhostr   r  rL   rL   rL   rM   r  4	  s    
r  c               C   sP   t d krLyttt d a W n( tjk
rJ   ttdd a Y nX t S )Nr:   r  )	_thishostr  r   r  r  r  rL   rL   rL   rM   r  <	  s    r  c              C   s   t d krdd l} | ja t S )Nr   )
_ftperrorsr  r  )r  rL   rL   rM   r  G	  s    r  c               C   s   t d krtda t S )Nrm   )
_noheadersr  r  rL   rL   rL   rM   	noheadersP	  s    
r  c               @   sF   e Zd ZdddZdd Zdd Zd	d
 Zdd Zdd Zdd Z	dS )r  NTc             C   sX   || _ || _|| _|| _|| _|| _d| _|| _y|   W n   | 	   Y nX d S )Nr   )
r
  r  ru   r'  r  rJ   refcount	keepaliveinitr   )r   r
  r  ru   r'  r  rJ   r  rL   rL   rM   r   ]	  s    zftpwrapper.__init__c             C   s\   dd l }d| _| | _| j| j| j| j | j| j	| j
 d| j}| j| d S )Nr   r   )r  busyZFTPr   Zconnectru   r'  rJ   Zloginr
  r  r  r  cwd)r   r  Z_targetrL   rL   rM   r  m	  s    
zftpwrapper.initc          
   C   s  dd l }|   |dkr"d}d}nd| }d}y| j| W n* |jk
rh   |   | j| Y nX d }|r|syd| }| j|\}}W nR |jk
r } z2t|d d dkrt	d	| 
t d
 W d d }~X Y nX |s| jd |rl| j }	zJy| j| W n4 |jk
rN } zt	d	| |W d d }~X Y nX W d | j|	 X d| }nd}| j|\}}d| _t|d| j}
|  jd7  _|  |
|fS )Nr   )rr  r  zTYPE ArR   zTYPE zRETR r4  Z550zftp error: %rr:   zLIST ZLISTr  )r  endtransferr   Zvoidcmdr  r  ZntransfercmdZ
error_permr   r   r  r  r  pwdr  r  r   Zmakefile
file_closer  r   )r   rN   r   r  cmdisdirr  r  r  r  ZftpobjrL   rL   rM   r  v	  sN        
$
zftpwrapper.retrfilec             C   s
   d| _ d S )Nr   )r  )r   rL   rL   rM   r  	  s    zftpwrapper.endtransferc             C   s   d| _ | jdkr|   d S )NFr   )r  r  
real_close)r   rL   rL   rM   r   	  s    
zftpwrapper.closec             C   s2   |    |  jd8  _| jdkr.| js.|   d S )NrR   r   )r  r  r  r"  )r   rL   rL   rM   r  	  s    zftpwrapper.file_closec             C   s2   |    y| j  W n t k
r,   Y nX d S )N)r  r   r   r  )r   rL   rL   rM   r"  	  s
    zftpwrapper.real_close)NT)
r   r   r   r   r  r  r  r   r  r"  rL   rL   rL   rM   r  Z	  s    
	-r  c              C   s   i } xBt j D ]4\}}| }|r|dd  dkr|| |d d < qW dt jkr^| dd  xXt j D ]J\}}|dd  dkrj| }|r|| |d d < qj| |d d d  qjW | S )Ni_proxyZREQUEST_METHODr   )rV   environrz   rs   r   )r  rZ   r   rL   rL   rM   getproxies_environment	  s    	
r%  c             C   s   |d krt  }y|d }W n tk
r.   dS X |dkr<dS |  } t| \}}xd|dD ]V}| }|r\|d}| }||ks| |krdS d| }||s| |r\dS q\W dS )NnoF*Trj  .)r%  rk  rs   r   r9  rF  lstripr  )ru   r  Zno_proxyhostonlyr'  rZ   rL   rL   rM   proxy_bypass_environment	  s*    
r+  c          	   C   s  ddl m } t| \}}dd }d| kr4|d r4dS d }x|dd	D ]}|sPqFtd
|}|d k	r|d kryt|}||}W n tk
r   wFY nX ||d}	|d}
|
d krd|d	dd  }
nt
|
dd  }
d|
 }
||
? |	|
? krdS qF|| |rFdS qFW dS )Nr   )fnmatchc             S   sh   |  d}ttt|}t|dkr<|ddddg d d }|d d> |d d> B |d d> B |d	 B S )
Nr(  r   r      rR   r[  r:   rZ  r4  )r9  r   r  r]   r_   )ZipAddrr&  rL   rL   rM   ip2num
  s
    
z,_proxy_bypass_macosx_sysconf.<locals>.ip2numr(  Zexclude_simpleT
exceptionsrL   z(\d+(?:\.\d+)*)(/\d+)?rR   r:   rZ      F)r,  r   r   rH  r  r   r  rl   groupcountr]   )ru   proxy_settingsr,  r*  r'  r.  ZhostIPr   r   r(  maskrL   rL   rM   _proxy_bypass_macosx_sysconf	  s:     



r5  darwin)_get_proxy_settings_get_proxiesc             C   s   t  }t| |S )N)r7  r5  )ru   r3  rL   rL   rM   proxy_bypass_macosx_sysconf<
  s    r9  c               C   s   t  S )N)r8  rL   rL   rL   rM   getproxies_macosx_sysconf@
  s    r:  c             C   s    t  }|rt| |S t| S d S )N)r%  r+  r9  )ru   r  rL   rL   rM   r  J
  s    
r  c               C   s   t  p
t S )N)r%  r:  rL   rL   rL   rM   r5   W
  s    c           
   C   s  i } ydd l }W n tk
r$   | S X y||jd}||dd }|rt||dd }d|krx|dD ]4}|dd\}}td|sd	||f }|| |< qrW n>|d d
 dkr|| d< n$d| | d< d| | d< d| | d< |	  W n t
ttfk
r   Y nX | S )Nr   z;Software\Microsoft\Windows\CurrentVersion\Internet SettingsProxyEnableZProxyServerr  r  rR   z(?:[^/:]+)://z%s://%srR  zhttp:r   z	http://%sz
https://%sr   zftp://%sr   )winregImportErrorOpenKeyHKEY_CURRENT_USERQueryValueExr   r9  rH  r  ZCloserl   rB   r   )r  r<  internetSettingsproxyEnableZproxyServerpr   ZaddressrL   rL   rM   getproxies_registry\
  s8    

rD  c               C   s   t  p
t S )N)r%  rD  rL   rL   rL   rM   r5   
  s    c             C   sx  ydd l }W n tk
r    dS X y6||jd}||dd }t||dd }W n tk
rl   dS X |rv|szdS t| \}}|g} y t	|}||kr| 
| W n tk
r   Y nX y t|}||kr| 
| W n tk
r   Y nX |d}xp|D ]h}	|	dkr$d|kr$dS |	dd	}	|	d
d}	|	dd}	x$| D ]}
t|	|
tjrNdS qNW qW dS )Nr   z;Software\Microsoft\Windows\CurrentVersion\Internet Settingsr;  ZProxyOverrider  z<local>r(  rR   z\.r'  z.*?)r<  r=  r>  r?  r@  r   rl   r   r   r  r\   Zgetfqdnr9  r   rH  r  rJ  )ru   r<  rA  rB  ZproxyOverrideZrawHostr'  ZaddrZfqdnr)  r   rL   rL   rM   proxy_bypass_registry
  sR    







rF  c             C   s    t  }|rt| |S t| S d S )N)r%  r+  rF  )ru   r  rL   rL   rM   r  
  s    
)NNN)N)}r  r   r  r^  Zhttp.clientr   r  rV   	posixpathrH  r   r   r  r\  rY   rS   r?   Zurllib.errorr   r   r   Zurllib.parser   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   Zurllib.responser   r   rD   r=  rC   __all__version_infor   rF   r   r0   r1   r[   r6   r7   rI  ASCIIrq   rv   r   r   r2   r   r/   r   r   r  r   r    r!   r"   r#   r$   r%   urandomr]  r&   r'   r(   rt  r)   r   r   rE   r\   r   r.   rT  rV  r*   r  r+   r,   r-   r  rZ   Z
nturl2pathr4   r3   r  r8   r9   r  r  r  r  r  r  r  r  r  r%  r+  r5  platformZ_scproxyr7  r8  r9  r:  r  r5   rD  rF  rL   rL   rL   rM   <module>T   s   P
T
?n $q*@
o v

+3:5!   @ W

_
%<

-	2
