???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................3
i~             )   @   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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j0dd)  Z1da2de
j3fddddd*d+dZ4d,d Z5g Z6d}d-d$Z7d.d% Z8e	j9d/e	j:Z;d0d1 Z<G d2d dZ=G d3d dZ>d4d  Z?G d5d	 d	Z@G d6d de@ZAG d7d
 d
e@ZBG d8d de@ZCd9d: ZDG d;d de@ZEG d<d dZFG d=d deFZGG d>d deGZHG d?d dZIG d@d deIe@ZJG dAd deIe@ZKejLZMG dBd dZNG dCd de@eNZOG dDd de@eNZPG dEdF dFe@ZQG dGd deQZReSejTdHr.G dIdJ dJeQZUe/jVdJ G dKd de@ZWG dLd de@ZXdMdN ZYdOdP ZZG dQd de@Z[dRdS Z\G dTd de@Z]G dUd de]Z^G dVd de@Z_dWZ`ejadXkrd dYlbmcZcmdZd ndZd" Zcd[d! Zdi ZeG d\d& d&ZfG d]d' d'efZgdahd^d_ Zidajd`da Zkdaldbdc Zmdanddde ZoG dfdg dgZpdhdi Zqd~djdkZrdldm Zsejtdnkrd dolumvZvmwZw dpdq Zxdrds Zydtdu Zzdvd# Z{n6ejadXkrdwdx Z|dyd# Z{dzd{ Z}d|du ZzneqZ{erZzd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 }|j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}	|	j| ||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.6/urllib/request.pyr0      s*    <




c             C   s   | a d S )N)rF   )rK   rL   rL   rM   r1      s    c             C   s4  t | \}}tjt| |}|j }|dkrD| rDtjj||fS |rTt|d}nt	j
dd}|j}tj| | ||f}	d}
d}d}d}d	|krt|d
 }|r|||
| xB|j|
}|sP |t|7 }|j| |d7 }|r|||
| qW W d Q R X W d Q R X |dkr0||k r0td||f |	|	S )NfilewbF)deletei         r   zcontent-lengthzContent-Lengthz1retrieval incomplete: got only %i out of %i bytesi    )r   
contextlibclosingr0   infoospathnormpathrG   tempfileZNamedTemporaryFilename_url_tempfilesappendintreadlenwriter   )rH   filename
reporthookrI   Zurl_typerX   fpheaderstfpresultbssizer_   blocknumblockrL   rL   rM   r6      sD    


$c              C   sH   x0t D ](} ytj|  W q tk
r,   Y qX qW t d d = trDd ad S )N)r\   rW   unlinkOSErrorrF   )Z	temp_filerL   rL   rM   r7   %  s    


z:\d+$c             C   s<   | j }t|d }|dkr&| jdd}tjd|d}|j S )NrR    Host)full_urlr   
get_header_cut_port_resublower)requestrH   hostrL   rL   rM   request_host4  s    rw   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 |j D ]\}}| j|| q.W |d krVt| }|| _	|| _
|rl|| _d S )N)rp   re   unredirected_hdrs_datarI   _tunnel_hostitems
add_headerrw   origin_req_hostunverifiablemethod)	selfrH   rI   re   r}   r~   r   keyvaluerL   rL   rM   __init__F  s    zRequest.__init__c             C   s   | j rdj| j| j S | jS )Nz{}#{})fragmentformat	_full_url)r   rL   rL   rM   rp   X  s    zRequest.full_urlc             C   s(   t || _t| j\| _| _| j  d S )N)r   r   r   r   _parse)r   rH   rL   rL   rM   rp   ^  s    
c             C   s   d | _ d | _d| _d S )Nrn   )r   r   selector)r   rL   rL   rM   rp   e  s    c             C   s   | j S )N)ry   )r   rL   rL   rM   rI   k  s    zRequest.datac             C   s(   || j kr$|| _ | jdr$| jd d S )NzContent-length)ry   
has_headerremove_header)r   rI   rL   rL   rM   rI   o  s    

c             C   s
   d | _ d S )N)rI   )r   rL   rL   rM   rI   y  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   rp   r   rv   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)rp   )r   rL   rL   rM   get_full_url  s    zRequest.get_full_urlc             C   s4   | j dkr| j r| j| _n|| _ | j| _|| _d S )Nhttps)r   rz   rv   rp   r   )r   rv   r   rL   rL   rM   	set_proxy  s
    
zRequest.set_proxyc             C   s   | j | jkS )N)r   rp   )r   rL   rL   rM   	has_proxy  s    zRequest.has_proxyc             C   s   || j |j < d S )N)re   
capitalize)r   r   valrL   rL   rM   r|     s    zRequest.add_headerc             C   s   || j |j < d S )N)rx   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)re   rx   )r   header_namerL   rL   rM   r     s    
zRequest.has_headerc             C   s   | j j|| jj||S )N)re   getrx   )r   r   defaultrL   rL   rM   rq     s    zRequest.get_headerc             C   s    | j j|d  | jj|d  d S )N)re   poprx   )r   r   rL   rL   rM   r     s    zRequest.remove_headerc             C   s"   | j j }|j| j t|j S )N)rx   copyupdatere   listr{   )r   hdrsrL   rL   rM   header_items  s    
zRequest.header_items)N)__name__
__module____qualname__r   propertyrp   setterdeleterrI   r   r   r   r   r   r|   r   r   rq   r   r   rL   rL   rL   rM   r   D  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*|jd}|d | }||d d  }|jd	r|jd| d }||d d  }yt|}W n tk
r   Y nX | jj	|i }	|	| j|< n>|d
kr|}| j
}	n*|dkr|}| j}	n|dkr*|}| j}	nq*|	j|g }
|
r&tj|
| n
|
j| d}q*W |rVtj| j| |j|  d S )N
add_parentz%expected BaseHandler instance, got %rFredirect_requestdo_open
proxy_open_rR   errorrG   responseru   T)r   r   r   )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<   |j |f }x*|D ]"}t||}|| }|d k	r|S qW d S )N)r   r   )	r   chainr   	meth_nameargsr   r   funcrg   rL   rL   rM   _call_chain  s    

zOpenerDirector._call_chainNc       
      C   s   t |trt||}n|}|d k	r(||_||_|j}|d }x(| jj|g D ]}t||}||}qLW | j	||}	|d }x*| j
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 | jdd|}|r|S |j}| j | j||d |}|r>|S | j | jdd|S )Nr   Zdefault_openr   unknownunknown_open)r   r   r   )r   r   rI   rg   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:   zhttp_error_%srR   Z_errorr   r   http_error_default)r   r   )r   r   )r   protor   dictr   Zhttp_errZ	orig_argsrg   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|jt t }xN|D ]F}x@| D ]8}t|trlt||r|j| qHt||rH|j| qHW q>W x|D ]}|j| qW x|D ]}|j|  qW x&| D ]}t|tr| }|j| 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   g  s    zBaseHandler.add_parentc             C   s   d S )NrL   )r   rL   rL   rM   r   j  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__n  s    
zBaseHandler.__lt__N)r   r   r   r   r   r   r   rL   rL   rL   rM   r   d  s   c               @   s   e Zd ZdZdd ZeZdS )r/   i  c             C   sJ   |j |j|j   }}}d|  ko*dk n  sF| jjd|||||}|S )N   i,  r   )codemsgrV   r   r   )r   ru   r   r   r   r   rL   rL   rM   http_response{  s
    z HTTPErrorProcessor.http_responseN)r   r   r   r   r   https_responserL   rL   rL   rM   r/   w  s   c               @   s   e Zd Zdd ZdS )r   c             C   s   t |j||||d S )N)r   rp   )r   r   rd   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       	         sx   |j  }|dkr|dkp&|dko&|dks:t|j|||||jdd	}d t fdd|jj D }t|||jddS )N-  .  /  3  r   HEADr    z%20content-lengthcontent-typec             3   s&   | ]\}}|j   kr||fV  qd S )N)rt   ).0kv)CONTENT_HEADERSrL   rM   	<genexpr>  s    z7HTTPRedirectHandler.redirect_request.<locals>.<genexpr>T)re   r}   r~   )r   r   r   r   )r   r   )r   r   r   )r   r   )	r   r   rp   replacer   re   r{   r   r}   )	r   r   rd   r   r   re   newurlmZ
newheadersrL   )r   rM   r     s    
z$HTTPRedirectHandler.redirect_requestc       
      C   sN  d|kr|d }nd|kr$|d }nd S t |}|jdkrRt||d||f |||j rp|jrpt|}d|d	< t|}t|d
tj	d}t
|j|}| j||||||}|d krd S t|dr|j }	|_|	j|d| jkst|	| jkrt|j|| j| ||ni  }	 |_|_|	j|dd |	|< |j  |j  | jj||jdS )Nlocationurir   r   ftprn   z+%s - Redirection to url '%s' is not allowed/r:   z
iso-8859-1)encodingsaferedirect_dictr   rR   )rJ   )r   r   r   rn   )r   schemer   rX   Znetlocr   r   r	   stringZpunctuationr   rp   r   r   r  r   max_repeatsr`   max_redirectionsinf_msgr_   r   r   rG   rJ   )
r   r   rd   r   r   re   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 | \}}|jds d }| }n:|jds6td|  |jdd}|dkrNd }|d| }t|\}}|d k	r|t|\}}nd  }}||||fS )Nr   z//zproxy URL with no authority: %rr:   rR   rS   )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|j 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   proxiesr{   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j|	j jd}
|j	dd|
  t|}|j
|| ||ks|dkrd S | jj||jdS d S )Nz%s:%sasciizProxy-authorizationzBasic r   )rJ   )r   r  rv   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   F  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 )NTFc                s   g | ]}j | qS rL   )
reduce_uri)r   u)default_portr   rL   rM   
<listcomp>Q  s    z0HTTPPasswordMgr.add_password.<locals>.<listcomp>)TF)r   r   r  tuple)r   realmr   r  r  reduced_urirL   )r"  r   rM   add_passwordI  s    



zHTTPPasswordMgr.add_passwordc       	      C   s`   | j j|i }xLdD ]D}| j||}x2|j D ]&\}}x|D ]}| j||r<|S q<W q.W qW dS )NTF)TF)NN)r  r   r   r{   	is_suburi)	r   r%  authuriZdomainsr"  reduced_authuriZurisZauthinfor   rL   rL   rM   find_user_passwordT  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j|}	|	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  rX   rv   portZdportrL   rL   rM   r   ^  s     zHTTPPasswordMgr.reduce_uric             C   sR   ||krdS |d |d kr dS t j|d |d f}t|t|d krNdS dS )NTr   FrR   )	posixpathcommonprefixr`   )r   basetestcommonrL   rL   rM   r(  u  s    zHTTPPasswordMgr.is_suburiN)T)r   r   r   r   r'  r+  r   r(  rL   rL   rL   rM   r    D  s
   

c               @   s   e Zd Zdd ZdS )r!   c             C   s0   t j| ||\}}|d k	r"||fS t j| 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<   | j || |d k	r&t jd ||| t j|||| d S )N)update_authenticatedr5  r'  )r   r%  r   r  r  is_authenticated)r7  rL   rM   r'    s    z)HTTPPasswordMgrWithPriorAuth.add_passwordc             C   sF   t |tr|g}x0dD ](}x"|D ]}| j||}|| j|< q W qW d S )NTF)TF)r   r   r   r4  )r   r   r9  r"  r!  r&  rL   rL   rM   r8    s    


z1HTTPPasswordMgrWithPriorAuth.update_authenticatedc             C   sD   x>dD ]6}| j ||}x$| jD ]}| j||r| j| S qW qW d S )NTF)TF)r   r4  r(  )r   r)  r"  r*  r   rL   rL   rM   r9    s
    
z-HTTPPasswordMgrWithPriorAuth.is_authenticated)F)F)r   r   r   r   r'  r8  r9  __classcell__rL   rL   )r7  rM   r"     s   

c               @   sT   e Zd Zej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j|D ]6}|j \}}}|d	kr:tjdtd ||fV  d}qW |sp|rb|j d }nd}|d fV  d S )
NF"'zBasic Auth Realm was unquoted   Tr   rn   )r;  r<  )r#   rxfinditergroupsr?   r@   UserWarningsplit)r   headerZfound_challengeZmor  r	   r%  rL   rL   rM   _parse_realm  s    
z%AbstractBasicAuthHandler._parse_realmc       	      C   s~   |j |}|sd S d }xL|D ]D}x>| j|D ]0\}}|j dkrF|}q,|d k	r,| j|||S q,W qW |d k	rztd|f d S )NbasiczBAbstractBasicAuthHandler does not support the following scheme: %r)Zget_allrD  rt   retry_http_basic_authrB   )	r   authreqrv   r   re   ZunsupportedrC  r  r%  rL   rL   rM   http_error_auth_reqed  s    

z.AbstractBasicAuthHandler.http_error_auth_reqedc             C   s|   | j j||\}}|d k	rtd||f }dtj|j jd }|j| jd |krTd S |j| j| | j	j
||jdS d S d S )Nz%s:%szBasic r  )rJ   )r  r+  r  r  r  r  rq   auth_headerr   r   rG   rJ   )r   rv   r   r%  r  pwrawauthrL   rL   rM   rF    s    z.AbstractBasicAuthHandler.retry_http_basic_authc             C   sx   t | jd s| jj|j r"|S |jdst| jjd |j\}}dj||j }tj	|j
 }|jddj|j  |S )Nr9  Authorizationz{0}:{1}zBasic {})r   r  r9  rp   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o dk n  r8| jj|jd n| jj|jd |S )Nr9  r   i,  TF)r   r  r   r8  rp   )r   r   r   rL   rL   rM   r     s
    z&AbstractBasicAuthHandler.http_response)N)r   r   r   recompileIr>  r   rD  rH  rF  rO  r   https_requestr   rL   rL   rL   rM   r#     s   
c               @   s   e Zd ZdZdd ZdS )r$   rM  c             C   s   |j }| jd|||}|S )Nzwww-authenticate)rp   rH  )r   r   rd   r   r   re   rH   r   rL   rL   rM   http_error_401   s    
z#HTTPBasicAuthHandler.http_error_401N)r   r   r   rI  rT  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 }| jd|||}|S )Nzproxy-authenticate)rv   rH  )r   r   rd   r   r   re   r  r   rL   rL   rM   http_error_407+  s    
z$ProxyBasicAuthHandler.http_error_407N)r   r   r   rI  rU  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   E  s    
z"AbstractDigestAuthHandler.__init__c             C   s
   d| _ d S )Nr   )rV  )r   rL   rL   rM   reset_retry_countN  s    z+AbstractDigestAuthHandler.reset_retry_countc             C   s|   |j |d }| jdkr*t|jdd|d n|  jd7  _|rx|j d }|j dkr`| j||S |j dkrxtd| d S )	N   i  zdigest auth failedrR   r   ZdigestrE  zEAbstractDigestAuthHandler does not support the following scheme: '%s')r   rV  r   rp   rB  rt   retry_http_digest_authrB   )r   rI  rv   r   re   rG  r  rL   rL   rM   rH  Q  s    


z/AbstractDigestAuthHandler.http_error_auth_reqedc             C   sz   |j dd\}}ttd t|}| j||}|rvd| }|jj| jd |krRd S |j| j| | j	j
||jd}|S d S )Nr   rR   z	Digest %s)rJ   )rB  parse_keqv_listfilterparse_http_listget_authorizationre   r   rI  r   r   rG   rJ   )r   r   rL  tokenZ	challengechalZauth_valZresprL   rL   rM   r[  e  s    z0AbstractDigestAuthHandler.retry_http_digest_authc             C   s@   d| j |tj f }|jdtd }tj|j }|d d S )Nz	%s:%s:%s:r  rQ      )rW  timeZctimer  _randombyteshashlibsha1	hexdigest)r   noncesbdigrL   rL   rM   
get_cnonceq  s    z$AbstractDigestAuthHandler.get_cnoncec             C   s  y6|d }|d }|j d}|j dd}|j dd }W n tk
rJ   d S X | j|\}}	|d krfd S | jj||j\}
}|
d krd S |jd k	r| j|j|}nd }d|
||f }d|j |j	f }|d	kr.|| j
kr|  jd
7  _nd
| _|| _
d| j }| j|}d||||||f }|	|||}n2|d krT|	||d|||f }ntd| d|
|||j	|f }|r|d| 7 }|r|d| 7 }|d| 7 }|r|d||f 7 }|S )Nr%  rh  qop	algorithmMD5opaquez%s:%s:%sz%s:%srL  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+  rp   rI   get_entity_digestr   r   rX  rW  rl  r   )r   r   ra  r%  rh  rm  rn  rp  HKDr  rJ  ZentdigZA1ZA2ZncvalueZcnonceZnoncebitZrespdigr1  rL   rL   rM   r_  |  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 )Nro  c             S   s   t j| jdj S )Nr  )re  Zmd5r  rg  )xrL   rL   rM   r    s    z?AbstractDigestAuthHandler.get_algorithm_impls.<locals>.<lambda>ZSHAc             S   s   t j| jdj S )Nr  )re  rf  r  rg  )rv  rL   rL   rM   r    s    z.Unsupported digest authentication algorithm %rc                s    d| |f S )Nz%s:%srL   )ri  d)rt  rL   rM   r    s    )rB   )r   rn  ru  rL   )rt  rM   rr    s    

z-AbstractDigestAuthHandler.get_algorithm_implsc             C   s   d S )NrL   )r   rI   ra  rL   rL   rM   rs    s    z+AbstractDigestAuthHandler.get_entity_digest)N)r   r   r   r   rY  rH  r[  rl  r_  rr  rs  rL   rL   rL   rM   r&   :  s   
	<c               @   s   e Zd ZdZdZdd ZdS )r'   rM  i  c             C   s*   t |jd }| jd|||}| j  |S )NrR   zwww-authenticate)r   rp   rH  rY  )r   r   rd   r   r   re   rv   retryrL   rL   rM   rT    s
    
z$HTTPDigestAuthHandler.http_error_401N)r   r   r   rI  r   rT  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 }| jd|||}| j  |S )Nzproxy-authenticate)rv   rH  rY  )r   r   rd   r   r   re   rv   rx  rL   rL   rM   rU    s
    
z%ProxyDigestAuthHandler.http_error_407N)r   r   r   rI  r   rU  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)rz  )r   levelrL   rL   rM   set_http_debuglevel  s    z'AbstractHTTPHandler.set_http_debuglevelc             C   s   t jjj|j|j S )N)r   r   HTTPConnection_get_content_lengthrI   r   )r   ru   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||jdsN|jdd |jd r|jd r| j|}|d k	r|jdt| n|jdd |}|j	 rt
|j\}}t|\}}	|jds|jd| x2| jjD ]&\}
}|
j }
|j|
s|j|
| 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chunkedro   )rv   r   rI   r   r   r   r   r   r  r   r   r   r   r   r   r   )r   ru   rv   rI   r   Zcontent_lengthZsel_hostr  ZselZsel_pathr[   r   rL   rL   rM   do_request_  s>    





zAbstractHTTPHandler.do_request_c       
         s\  |j }|std||fd|ji|}|j| j t|j  jt fdd|jj	 D  d d< tdd  j	 D  |j
ri }d}| kr | ||<  |= |j|j
|d	 y`y&|j|j |j|j |jd
d W n, tk
r
 } zt|W Y d d }~X nX |j }	W n   |j   Y nX |jrF|jj  d |_|j |	_|	j|	_|	S )Nzno host givenrJ   c             3   s"   | ]\}}| kr||fV  qd S )NrL   )r   r   r   )re   rL   rM   r   )  s    z.AbstractHTTPHandler.do_open.<locals>.<genexpr>r   
Connectionc             s   s   | ]\}}|j  |fV  qd S )N)title)r   r[   r   rL   rL   rM   r   6  s    zProxy-Authorization)re   zTransfer-encoding)Zencode_chunked)rv   r   rJ   Zset_debuglevelrz  r   rx   r   re   r{   rz   Z
set_tunnelru   r   r   rI   r   rm   getresponser   Zsockr   rH   reasonr   )
r   Z
http_classr   Zhttp_conn_argsrv   r   Ztunnel_headersZproxy_auth_hdrerrr  rL   )re   rM   r     s@    
"

zAbstractHTTPHandler.do_openN)r   )r   r   r   r   r}  r  r  r   rL   rL   rL   rM   ry    s
   
&ry  c               @   s   e Zd Zdd ZejZdS )r)   c             C   s   | j tjj|S )N)r   r   r   r~  )r   r   rL   rL   rM   	http_open`  s    zHTTPHandler.http_openN)r   r   r   r  ry  r  rO  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 j| | || _|| _d S )N)ry  r   _context_check_hostname)r   r{  r>   check_hostnamerL   rL   rM   r   i  s    zHTTPSHandler.__init__c             C   s   | j tjj|| j| jdS )N)r>   r  )r   r   r   r   r  r  )r   r   rL   rL   rM   
https_openn  s    zHTTPSHandler.https_open)r   NN)r   r   r   r   r  ry  r  rS  rL   rL   rL   rM   rE   g  s   
rE   c               @   s.   e Zd ZdddZdd Zdd ZeZeZdS )	r   Nc             C   s$   dd l }|d kr|jj }|| _d S )Nr   )Zhttp.cookiejar	cookiejarZ	CookieJar)r   r  r   rL   rL   rM   r   w  s    
zHTTPCookieProcessor.__init__c             C   s   | j j| |S )N)r  Zadd_cookie_header)r   ru   rL   rL   rM   rO  }  s    z HTTPCookieProcessor.http_requestc             C   s   | j j|| |S )N)r  Zextract_cookies)r   ru   r   rL   rL   rM   r     s    z!HTTPCookieProcessor.http_response)N)r   r   r   r   rO  r   rS  r   rL   rL   rL   rM   r   v  s
   
c               @   s   e Zd Zdd ZdS )r.   c             C   s   |j }td| d S )Nzunknown url type: %s)r   r   )r   r   r   rL   rL   rM   r     s    zUnknownHandler.unknown_openN)r   r   r   r   rL   rL   rL   rM   r.     s   c             C   sR   i }xH| D ]@}|j dd\}}|d dkrB|d dkrB|dd }|||< q
W |S )N=rR   r   r;  rS   rS   )rB  )lZparsedZeltr   r   rL   rL   rM   r\    s    
r\  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|j | d}q|dkrzd}||7 }qW |r|j | dd |D S )	Nrn   F\Tr;  ,c             S   s   g | ]}|j  qS rL   )rN  )r   partrL   rL   rM   r#    s    z#parse_http_list.<locals>.<listcomp>)r]   )ri  resr  escaper	   ZcurrL   rL   rM   r^    s4    	


r^  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| j krXtdn
| j|S d S )Nr:   z//r=  r   	localhostz-file:// scheme is supported only on localhost)r   rv   	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jdd tjtj d  t _W n$ tjk
rX   tj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	|j
dd}	|j|d }
|jd|
pbd||	f }|r~t|\}}| s| rt|| j kr|rd| | }nd| }tt|d||S W n* tk
r } zt|W Y d d }~X 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	mimetypesrv   r   r4   rW   statst_sizeutils
formatdatest_mtime
guess_typemessage_from_stringr   _safe_gethostbynamer  r   rG   rm   r   )r   r   emailr  rv   rb   Z	localfilestatsri   modifiedmtypere   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 j| S  t jk
r    d S X d S )N)r   r  r  )rv   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
j|}W n* tk
r } zt|W Y d d }~X nX t|j\}	}
|	jd}ttt	|}|d d |d  }}|r|d  r|dd  }y| j||||||j}|r8dp:d}x:|
D ]2}t|\}}|j dkrB|dkrB|j }qBW |j||\}}d}|j|jd }|r|d| 7 }|d k	r|dkr|d| 7 }tj|}t|||jS  |jk
r( } z$td| }|jtj  d W Y d d }~X nX d S )Nr   zftp error: no host givenrn   r   rR   rR  Dr   aAr   rw  zContent-type: %s
zContent-length: %d
zftp error: %rr:   rS   rS   )r  r  r   rR  rw  r  )!ftplibr  rv   r   r   FTP_PORTr^   r   r   r
   r   r  rm   r   r   rB  r   mapconnect_ftprJ   r   rt   upperretrfiler  rp   r  r  r   
all_errorswith_tracebacksysexc_info)r   r   r  r  rv   r.  r  r  r   rX   attrsdirsrN   fwr   attrr   rd   retrlenre   r  r  excrL   rL   rM   ftp_open  s\    



zFTPHandler.ftp_openc          	   C   s   t ||||||ddS )NF)
persistent)
ftpwrapper)r   r  r  rv   r.  r  rJ   rL   rL   rM   r  1  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   <   rb  )cacherJ   soonestdelay	max_conns)r   rL   rL   rM   r   8  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   setMaxConnsB  s    zCacheFTPHandler.setMaxConnsc             C   sr   |||dj ||f}|| jkr4tj | j | j|< n,t||||||| j|< tj | j | j|< | j  | j| S )Nr   )joinr  rc  r  rJ   r  check_cache)r   r  r  rv   r.  r  rJ   r   rL   rL   rM   r  E  s    

zCacheFTPHandler.connect_ftpc             C   s   t j  }| j|krTx@t| jj D ].\}}||k r"| j| j  | j|= | j|= q"W tt| jj | _t	| j| j
krx6t| jj D ]$\}}|| jkr| j|= | j|= P qW tt| jj | _d S )N)rc  r  r   rJ   r{   r  r   minvaluesr`   r  )r   r  r   r   rL   rL   rM   r  P  s    

zCacheFTPHandler.check_cachec             C   s4   x| j j D ]}|j  qW | j j  | jj  d S )N)r  r  r   clearrJ   )r   connrL   rL   rM   clear_cached  s    
zCacheFTPHandler.clear_cacheN)	r   r   r   r   r  r  r  r  r  rL   rL   rL   rM   r,   5  s   c               @   s   e Zd Zdd ZdS )r-   c             C   s~   |j }|jdd\}}|jdd\}}t|}|jdrNtj|}|d d }|sVd}tjd|t|f }t	t
j|||S )	N:rR   r  z;base64   ztext/plain;charset=US-ASCIIz$Content-type: %s
Content-length: %d
i)rp   rB  r   endswithr  decodebytesr  r  r`   r   ioBytesIO)r   r   rH   r  rI   Z	mediatypere   rL   rL   rM   	data_openk  s    


zDataHandler.data_openN)r   r   r   r  rL   rL   rL   rM   r-   j  s   r   nt)r4   r3   c             C   s   t | S )N)r
   )pathnamerL   rL   rM   r4     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 }|| _|jd| _|jd| _	d| j
fd
g| _g | _tj| _d | _t| _d S )NzW%(class)s style of invoking requests is deprecated. Use newer urlopen functions/methodsclassr=  )
stacklevelkey_file	cert_filez
User-AgentAccept*/*)r  r  )r7  r   r?   r@   rA   r5   r  r   r  r  versionr   _URLopener__tempfilesrW   rl   _URLopener__unlink	tempcacheftpcache)r   r  Zx509r   rL   rL   rM   r     s    zURLopener.__init__c             C   s   | j   d S )N)r   )r   rL   rL   rM   __del__  s    zURLopener.__del__c             C   s   | j   d S )N)cleanup)r   rL   rL   rM   r     s    zURLopener.closec             C   sZ   | j rFx2| j D ](}y| j| W q tk
r4   Y qX qW | j d d = | jrV| jj  d S )N)r  r  rm   r  r  )r   rN   rL   rL   rM   r    s    
zURLopener.cleanupc             G   s   | j j| d S )N)r   r]   )r   r   rL   rL   rM   	addheader  s    zURLopener.addheaderc             C   sn  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| }|| _	|j
dd}t| | s|dkr|r| j|||S | j||S y,|d kr t| ||S t| |||S W nV ttfk
r.    Y n< tk
rh } ztd	|jtj d
 W Y d d }~X 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   rm   r  r  r  )r   r   rI   rb   re   rd   urltyperH   r  	proxyhostrv   r   r[   r   rL   rL   rM   rG     s<    




zURLopener.openc             C   s   t |\}}tdd|d S )Nz	url errorzunknown url type)r   rm   )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   rm   )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| sH|dkry.| j|}|j }|j  tt|d |fS  t	k
r }	 zW Y d d }	~	X nX | j
||}zH|j }
|rt
|d}n|dd l}t|\}}t|pd\}}t|pd\}}t|p d\}}tjj|d }|j|\}}| jj| tj|d}z||
f}| jd k	r^|| j|< d}d}d}d}d|
krt|
d	 }|r|||| xH|j|}|sP |t|7 }|j| |d7 }|r|||| qW W d |j  X W d |j  X |dkr"||k r"td
||f ||S )NrN   rR   rO   r   rn   i   rQ   zcontent-lengthzContent-Lengthz1retrieval incomplete: got only %i out of %i bytesi    rS   )r   r   r  r   r  rV   r   r4   r   rm   rG   rZ   r   r   rW   rX   splitextZmkstempr  r]   fdopenr^   r_   r`   ra   r   )r   rH   rb   rc   rI   r   Zurl1rd   r   r   re   rf   rZ   ZgarbagerX   suffixfdrg   rh   ri   r_   rj   rk   rL   rL   rM   retrieve  sl    






zURLopener.retrievec             C   s(  d }d }t |tr<t|\}}|r6t|\}}t|}|}nt|\}}t|\}}t|\}	}
|
}d }|	j dkrvd }n:t|
\}}
|rt|\}}|rd|	||
f }t|r|}|stdd|rt|}t	j
|j jd}nd }|rt|}t	j
|j jd}nd }||}i }|r*d| |d< |r<d| |d< |rJ||d	< d
|d< x| jD ]\}}|||< qZW |d k	rd|d< |jd||| n|jd||d y|j }W n" tjjk
r   tdY nX d|j  kodk n  rt||jd| |jS | j||j|j|j|j|S d S )Nr   z	%s://%s%sz
http errorzno host givenr  zBasic %szProxy-AuthorizationrM  ro   r   r  z!application/x-www-form-urlencodedzContent-Typer   r   )re   z$http protocol error: bad status liner   i,  zhttp:)r   r   r   r   r
   r   rt   r  rm   r  r  r  r  r   ru   r  r   r   ZBadStatusLiner   Zstatusr   r   
http_errorrd   r  )r   Zconnection_factoryrH   rI   Zuser_passwdZproxy_passwdrv   r   Zrealhostr  r   Z
proxy_authrL  Z	http_connre   rC  r   r   rL   rL   rM   _open_generic_httpQ  sr    
 

zURLopener._open_generic_httpc             C   s   | j tjj||S )N)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 | j|||||S )Nzhttp_error_%d)r   r   r   )
r   rH   rd   errcodeerrmsgre   rI   r[   r   rg   rL   rL   rM   r    s    

 zURLopener.http_errorc             C   s   |j   t||||d d S )N)r   r   )r   rH   rd   r  r  re   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   rv   rL   rL   rM   _https_connection  s    zURLopener._https_connectionc             C   s   | j | 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 j dkrPtdn
| j|S d S )	NzEfile error: proxy support for file protocol currently not implementedr:   z//r=  r      z
localhost/z-file:// scheme is supported only on localhost)r   r   r   rt   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j|}W n0 tk
rb } zt|j|j	W Y d d }~X nX |j
}	|jj|jdd}
|j|d }|jd|pd|	|
f }|s|}|d d dkrd| }tt|d	||S t|\}}| otj|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   rW   r  rm   r   strerrorrb   r  r  r  r  r  r  r   rG   r   r   r  r  thishostrB   )r   rH   r  r  rv   rN   Z	localnamer  eri   r  r  re   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	j
|}|sdd l}|j}nt|}t|\}}	t|}|jd}
|
d d |
d  }
}|
o|
d   r|
dd  }
|
r|
d  rd|
d< |||dj|
f}t| jtkrlx8t| jD ]*}||kr>| j| }| j|= |j  q>W y|| jkrt|||||
| j|< |sd}nd}x:|	D ]2}t|\}}|j d	kr|dkr|j }qW | j| j||\}}|jd| d }d}|r|d| 7 }|d k	r:|dkr:|d| 7 }tj|}t||d| S  t k
r } z td| j t!j" d W Y d d }~X nX d S )NzCftp error: proxy support for ftp protocol currently not implementedr   zftp error: no host givenrn   r   rR   r  rR  r   r  r  r   rw  zftp:zContent-Type: %s
zContent-Length: %d
zftp error %rr:   rS   rS   )r  r  r   rR  rw  r  )#r   r   r   r  r   r   r   r   r
   r   r  r  r  r^   r   rB  r  r`   r  MAXFTPCACHEr   r   r  r   rt   r  r  r  r  r  r   	ftperrorsr  r  r  )r   rH   r  rv   rX   r.  r  r  r  r  r  rN   r   r   r   r   r  r   rd   r  r  re   r  rL   rL   rM   open_ftp  sp    
  

  

 


zURLopener.open_ftpc       	      C   s<  t |tstdy|jdd\}}W n tk
rD   tddY nX |sNd}|jd}|dkrd	||d  kr||d d  }|d | }nd
}g }|jdtj	dtj
tj   |jd|  |dkrtj|jdjd}nt|}|jdt|  |jd
 |j| dj|}tj|}tj|}t|||S )NzEdata error: proxy support for data protocol currently not implementedr  rR   z
data errorzbad data URLztext/plain;charset=US-ASCII;r   r  rn   zDate: %sz%a, %d %b %Y %H:%M:%S GMTzContent-type: %sr  r  zlatin-1zContent-Length: %d
)r   r   r   rB  rB   rm   rfindr]   rc  ZstrftimeZgmtimer  r  r  r  r
   r`   r  r  r  r  StringIOr   )	r   rH   rI   r   Zsemir   r   re   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,   

$


B\


	 :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   r6  rL   rL   rM   r   `  s    zFancyURLopener.__init__c             C   s   t ||d| |S )Nzhttp:)r   )r   rH   rd   r  r  re   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 | j||||||}|S d| _ X d S )NrR   http_error_500i  z)Internal Server Error: Redirect Recursionr   )r	  r
  r   r  r   redirect_internal)	r   rH   rd   r  r  re   rI   r   rg   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 |j   t| jd | |}t|}|jd	krnt|||d|  ||| j|S )
Nr   r   r  r   r   r   rn   z( Redirection to url '%s' is not allowed.)r   r   r   rn   )r   r   r   r   r  r   rG   )	r   rH   rd   r  r  re   rI   r   r  rL   rL   rM   r  |  s    


z FancyURLopener.redirect_internalc             C   s   | j ||||||S )N)r	  )r   rH   rd   r  r  re   rI   rL   rL   rM   r
    s    zFancyURLopener.http_error_301c             C   s   | j ||||||S )N)r	  )r   rH   rd   r  r  re   rI   rL   rL   rM   r    s    zFancyURLopener.http_error_303c             C   s2   |d kr| j ||||||S | j|||||S d S )N)r	  r   )r   rH   rd   r  r  re   rI   rL   rL   rM   r    s    zFancyURLopener.http_error_307Fc             C   s   d|krt j| ||||| |d }tjd|}	|	sHt j| ||||| |	j \}
}|
j dkrtt j| ||||| |st j| ||||| d| j d }|d krt| |||S t| ||||S d S )Nzwww-authenticatez![ 	]*([^ 	]+)[ 	]+realm="([^"]*)"rE  Zretry__basic_auth)r8   r   rP  matchr@  rt   r   r   )r   rH   rd   r  r  re   rI   rx  stuffr  r  r%  r[   rL   rL   rM   rT    s&    





zFancyURLopener.http_error_401c             C   s   d|krt j| ||||| |d }tjd|}	|	sHt j| ||||| |	j \}
}|
j dkrtt j| ||||| |st j| ||||| d| j d }|d krt| |||S t| ||||S d S )Nzproxy-authenticatez![ 	]*([^ 	]+)[ 	]+realm="([^"]*)"rE  Zretry_proxy_r  )r8   r   rP  r  r@  rt   r   r   )r   rH   rd   r  r  re   rI   rx  r  r  r  r%  r[   rL   rL   rM   rU    s&    





zFancyURLopener.http_error_407c             C   s   t |\}}d| | }| jd }t|\}}	t |	\}	}
|	jdd }|	|d  }	| j|	||\}}|pl|srd S dt|ddt|dd|	f }	d|	 |
 | jd< |d kr| j|S | j||S d S )Nzhttp://r   @rR   z%s:%s@%srn   )r   )r   r  r   r   get_user_passwdr	   rG   )r   rH   r%  rI   rv   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 |	\}	}
|	jdd }|	|d  }	| j|	||\}}|pl|srd S dt|ddt|dd|	f }	d|	 |
 | jd< |d kr| j|S | j||S d S )Nzhttps://r   r  rR   z%s:%s@%srn   )r   )r   r  r   r   r  r	   rG   )r   rH   r%  rI   rv   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 |\}}|jdd }||d  }| j|||\}}|p>|sDd S dt|ddt|dd|f }d| | }	|d kr| j|	S | j|	|S d S )Nr  rR   z%s:%s@%srn   )r   zhttp://)r   r   r  r	   rG   )
r   rH   r%  rI   rv   r   r   r  r  r   rL   rL   rM   rF    s     
z$FancyURLopener.retry_http_basic_authc       
      C   s   t |\}}|jdd }||d  }| j|||\}}|p>|sDd S dt|ddt|dd|f }d| | }	|d kr| j|	S | j|	|S d S )Nr  rR   z%s:%s@%srn   )r   zhttps://)r   r   r  r	   rG   )
r   rH   r%  rI   rv   r   r   r  r  r   rL   rL   rM   retry_https_basic_auth	  s     
z%FancyURLopener.retry_https_basic_authr   c             C   s`   |d |j   }|| jkr2|r(| j|= n
| j| S | j||\}}|sJ|rX||f| j|< ||fS )Nr  )rt   r  prompt_user_passwd)r   rv   r%  r  r   r  r  rL   rL   rM   r  	  s    


 zFancyURLopener.get_user_passwdc             C   sT   dd l }y,td||f }|j 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   rv   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  rT  rU  r  r  rF  r  r  r  rL   rL   rL   rM   r9   ]  s"   



 
 





c               C   s   t d krtjda t S )Nr  )
_localhostr   r  rL   rL   rL   rM   r  4	  s    
r  c               C   sP   t d krLyttjtj d a W n( tjk
rJ   ttj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jda t S )Nrn   )
_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| j  W n   | j	   Y nX d S )Nr   )
r  r  rv   r.  r  rJ   refcount	keepaliveinitr   )r   r  r  rv   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j| j	| j
 dj| j}| jj| d S )Nr   r   )r  busyZFTPr   Zconnectrv   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 }| j  |dkr"d}d}nd| }d}y| jj| W n* |jk
rh   | j  | jj| Y nX d }|r| ryd| }| jj|\}}W nR |jk
r } z4t|d d d	krt	d
| j
tj d W Y d d }~X nX |s| jjd |rn| jj }	zJy| jj| W n4 |jk
rP } zt	d
| |W Y d d }~X nX W d | jj|	 X d| }nd}| jj|\}}d| _t|jd| j}
|  jd7  _|j  |
|fS )Nr   rw  r  zTYPE ArR   zTYPE zRETR r=  Z550zftp error: %rr:   zLIST ZLISTr  )rw  r  )r  endtransferr   Zvoidcmdr  r"  ZntransfercmdZ
error_permr   r   r  r  r  pwdr$  r#  r   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| j  d S )NFr   )r!  r   
real_close)r   rL   rL   rM   r   	  s    
zftpwrapper.closec             C   s4   | j   |  jd8  _| jdkr0| j r0| j  d S )NrR   r   )r%  r   r!  r+  )r   rL   rL   rM   r(  	  s    zftpwrapper.file_closec             C   s2   | j   y| j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j D ]4\}}|j }|r|dd  dkr|| |d d < qW dt jkr^| jdd  xXt jj D ]J\}}|dd  dkrj|j }|r|| |d d < qj| j|d d	 d  qjW | S )
N   _proxyZREQUEST_METHODr   iiiii)rW   environr{   rt   r   )r  r[   r   rL   rL   rM   getproxies_environment	  s    	
r/  c             C   s   |d krt  }y|d }W n tk
r.   dS X |dkr<dS t| \}}dd |jdD }xP|D ]H}|rb|jd}tj|}d	| }tj||tjstj|| tjrbdS qbW dS )
Nnor   *rR   c             S   s   g | ]}|j  qS rL   )rN  )r   r  rL   rL   rM   r#  	  s    z,proxy_bypass_environment.<locals>.<listcomp>r  .z
(.+\.)?%s$)	r/  rq  r   rB  lstriprP  r  r  rR  )rv   r  Zno_proxyhostonlyr.  Zno_proxy_listr[   patternrL   rL   rM   proxy_bypass_environment	  s&    


r6  c             C   s  ddl m } t| \}}dd }d| kr4|d r4dS d }x|jdf D ]}|sPqFtjd	|}|d k	r|d krytj|}||}W n tk
r   wFY nX ||jd
}	|jd}
|
d krd|jd
j	dd
  }
nt
|
d
d  }
d|
 }
||
? |	|
? krdS qF|| |rFdS qFW dS )Nr   )fnmatchc             S   sh   | j 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 )
Nr2  r   r      rR   rb  r:   rQ   r=  )rB  r   r  r^   r`   )ZipAddrr-  rL   rL   rM   ip2num
  s
    
z,_proxy_bypass_macosx_sysconf.<locals>.ip2numr2  Zexclude_simpleT
exceptionsz(\d+(?:\.\d+)*)(/\d+)?rR   r:   rQ       F)r7  r   r   rP  r  r   r  rm   groupcountr^   )rv   proxy_settingsr7  r4  r.  r9  ZhostIPr   r   r1  maskrL   rL   rM   _proxy_bypass_macosx_sysconf	  s:     



r@  darwin)_get_proxy_settings_get_proxiesc             C   s   t  }t| |S )N)rB  r@  )rv   r>  rL   rL   rM   proxy_bypass_macosx_sysconf:
  s    rD  c               C   s   t  S )N)rC  rL   rL   rL   rM   getproxies_macosx_sysconf>
  s    rE  c             C   s    t  }|rt| |S t| S d S )N)r/  r6  rD  )rv   r  rL   rL   rM   r  H
  s    
r  c               C   s   t  p
t S )N)r/  rE  rL   rL   rL   rM   r5   U
  s    c              C   s  i } ydd l }W n tk
r$   | S X y|j|jd}|j|dd }|rt|j|dd }d|krx|jdD ]4}|jdd\}}tjd|sd	||f }|| |< qrW n>|d d
 dkr|| d< n$d| | d< d| | d< d| | d< |j	  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://%srZ  zhttp:r   z	http://%sz
https://%sr   zftp://%sr   )winregImportErrorOpenKeyHKEY_CURRENT_USERQueryValueExr   rB  rP  r  ZCloserm   rB   r   )r  rG  internetSettingsproxyEnableZproxyServerpr   ZaddressrL   rL   rM   getproxies_registryZ
  s8    

rO  c               C   s   t  p
t S )N)r/  rO  rL   rL   rL   rM   r5   
  s    c          &   C   s~  ydd l }W n tk
r    dS X y6|j|jd}|j|dd }t|j|dd }W n tk
rl   dS X | sz| r~dS t| \}}|g} y tj	|}||kr| j
| W n tk
r   Y nX y tj|}||kr| j
| W n tk
 r   Y nX |jd}xp|D ]h}	|	dkr*d|kr*dS |	jdd	}	|	jd
d}	|	jdd}	x$| D ]}
tj|	|
tjrTdS qTW qW dS )Nr   z;Software\Microsoft\Windows\CurrentVersion\Internet SettingsrF  ZProxyOverrider  z<local>r2  rR   z\.r1  z.*?)rG  rH  rI  rJ  rK  r   rm   r   r   r  r]   ZgetfqdnrB  r   rP  r  rR  )rv   rG  rL  rM  ZproxyOverrideZrawHostr.  ZaddrZfqdnr2  r   rL   rL   rM   proxy_bypass_registry
  sR    







rQ  c             C   s    t  }|rt| |S t| S d S )N)r/  r6  rQ  )rv   r  rL   rL   rM   r  
  s    
)NNN)N)~r  r   r  re  Zhttp.clientr   r  rW   r/  rP  r   r  r  rc  collectionsrZ   rT   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   rH  rC   __all__version_infor   rF   r   r0   r1   r\   r6   r7   rQ  ASCIIrr   rw   r   r   r2   r   r/   r   r   r  r   r    r!   r"   r#   r$   r%   urandomrd  r&   r'   r(   ry  r)   r   r   rE   r]   r   r.   r\  r^  r*   r  r+   r,   r-   r  r[   Z
nturl2pathr4   r3   r  r8   r9   r  r  r  r  r  r   r  r  r  r/  r6  r@  platformZ_scproxyrB  rC  rD  rE  r  r5   rO  rQ  rL   rL   rL   rM   <module>T   s   P
T
?n $q*@
o v

+3:5!   A W

_
#<

-	2
