a
    ze                    @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlZd dlmZmZmZ d dlmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' d dl(m)Z)m*Z* zd dl+Z+W n e,y   dZ-Y n0 dZ-g d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:dd Z;G dd dZ<G dd dZ=dd Z>G dd dZ?G dd de?Z@G d d! d!e?ZAG d"d# d#e?ZBd$d% ZCG d&d' d'e?ZDG d(d) d)ZEG d*d+ d+eEZFG d,d- d-eFZGG d.d/ d/ZHG d0d1 d1eHe?ZIG d2d3 d3eHe?ZJejKZLG d4d5 d5ZMG d6d7 d7e?eMZNG d8d9 d9e?eMZOG d:d; d;e?ZPG d<d= d=ePZQeRejSd>rG d?d@ d@ePZTe.Ud@ G dAdB dBe?ZVG dCdD dDe?ZWdEdF ZXdGdH ZYG dIdJ dJe?ZZdKdL Z[G dMdN dNe?Z\G dOdP dPe\Z]G dQdR dRe?Z^dSZ_ej`dTkrd dUlambZbmcZc ndVdW ZbdXdY Zci ZdG dZd[ 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rHd doltmuZumvZv dpdq Zwdrds Zxdtdu Zydvdw Zzn6ej`dTkrvdxdy Z{dzdw Zzd{d| 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 ur2tdts>tdtjtjj||d}t	|d}t
|}	n0|r~t	|d}t
|}	ntd u rt
  a}	nt}	|	| ||S )Nr   zJcafile, capath and cadefault are deprecated, use a custom context instead.r:   zDYou can't pass both context and any of cafile, capath, and cadefaultzSSL support not available)r;   r<   )r>   )warningswarnDeprecationWarning
ValueError	_have_sslsslZcreate_default_contextZPurposeZSERVER_AUTHHTTPSHandlerr2   _openeropen)
urldatatimeoutr;   r<   r=   r>   r?   Zhttps_handleropener rL   $/usr/lib/python3.9/urllib/request.pyr0      s0    4




r0   c                 C   s   | a d S N)rF   )rK   rL   rL   rM   r1      s    r1   c              	   C   sl  t | \}}tt| |}| }|dkrR|sRtj||fW  d    S |rbt|d}nt	j
dd}|j}t| | ||f}	d}
d}d}d}d|v rt|d	 }|r|||
| ||
}|sҐq|t|7 }|| |d
7 }|r|||
| qW d    n1 s0    Y  W d    n1 s80    Y  |dkrh||k rhtd||f |	|	S )NfilewbF)delete    r   content-lengthContent-Length   1retrieval incomplete: got only %i out of %i bytes)r   
contextlibclosingr0   infoospathnormpathrG   tempfileNamedTemporaryFilename_url_tempfilesappendintreadlenwriter   )rH   filename
reporthookrI   Zurl_typer\   fpheaderstfpresultbssizerd   blocknumblockrL   rL   rM   r6      sH    


Nr6   c               	   C   sB   t D ]&} zt|  W q ty(   Y q0 qt d d = tr>d ad S rN   )ra   r[   unlinkOSErrorrF   )Z	temp_filerL   rL   rM   r7     s    
r7   z:\d+$c                 C   s<   | j }t|d }|dkr&| dd}td|d}| S )NrV    Host)full_urlr   
get_header_cut_port_resublower)requestrH   hostrL   rL   rM   request_host+  s    r|   c                   @   s   e Zd Zdi dddfddZedd Zejdd Zejdd Zed	d
 Zejdd
 Zejdd
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zd#ddZdd  Zd!d" ZdS )$r   NFc           	      C   sl   || _ i | _i | _d | _|| _d | _| D ]\}}| || q,|d u rRt| }|| _	|| _
|rh|| _d S rN   )ru   rj   unredirected_hdrs_datarI   _tunnel_hostitems
add_headerr|   origin_req_hostunverifiablemethod)	selfrH   rI   rj   r   r   r   keyvaluerL   rL   rM   __init__=  s    zRequest.__init__c                 C   s   | j rd| j| j S | jS )Nz{}#{})fragmentformat	_full_urlr   rL   rL   rM   ru   O  s    zRequest.full_urlc                 C   s(   t || _t| j\| _| _|   d S rN   )r   r   r   r   _parser   rH   rL   rL   rM   ru   U  s    
c                 C   s   d | _ d | _d| _d S Nrs   )r   r   selectorr   rL   rL   rM   ru   \  s    c                 C   s   | j S rN   )r~   r   rL   rL   rM   rI   b  s    zRequest.datac                 C   s(   || j kr$|| _ | dr$| d d S )NContent-length)r~   
has_headerremove_header)r   rI   rL   rL   rM   rI   f  s    

c                 C   s
   d | _ d S rN   )rI   r   rL   rL   rM   rI   p  s    c                 C   sN   t | j\| _}| jd u r(td| j t|\| _| _| jrJt| j| _d S )Nzunknown url type: %r)	r   r   typerB   ru   r   r{   r   r
   )r   restrL   rL   rM   r   t  s    
zRequest._parsec                 C   s   | j d urdnd}t| d|S )NPOSTGETr   )rI   getattr)r   Zdefault_methodrL   rL   rM   
get_method|  s    zRequest.get_methodc                 C   s   | j S rN   )ru   r   rL   rL   rM   get_full_url  s    zRequest.get_full_urlc                 C   s2   | j dkr| js| j| _n|| _ | j| _|| _d S )Nhttps)r   r   r{   ru   r   )r   r{   r   rL   rL   rM   	set_proxy  s
    
zRequest.set_proxyc                 C   s   | j | jkS rN   )r   ru   r   rL   rL   rM   	has_proxy  s    zRequest.has_proxyc                 C   s   || j | < d S rN   )rj   
capitalizer   r   valrL   rL   rM   r     s    zRequest.add_headerc                 C   s   || j | < d S rN   )r}   r   r   rL   rL   rM   add_unredirected_header  s    zRequest.add_unredirected_headerc                 C   s   || j v p|| jv S rN   )rj   r}   r   header_namerL   rL   rM   r     s    
zRequest.has_headerc                 C   s   | j || j||S rN   )rj   getr}   )r   r   defaultrL   rL   rM   rv     s    zRequest.get_headerc                 C   s    | j |d  | j|d  d S rN   )rj   popr}   r   rL   rL   rM   r     s    zRequest.remove_headerc                 C   s   i | j | j}t| S rN   )r}   rj   listr   )r   hdrsrL   rL   rM   header_items  s    zRequest.header_items)N)__name__
__module____qualname__r   propertyru   setterdeleterrI   r   r   r   r   r   r   r   r   rv   r   r   rL   rL   rL   rM   r   ;  s6   





	

r   c                   @   sN   e Zd Zdd Zdd Zdd Zdd Zd	ejfd
dZ	dddZ
dd Zd	S )r   c                 C   s6   dt  }d|fg| _g | _i | _i | _i | _i | _d S )NPython-urllib/%sz
User-agent)__version__
addheadershandlershandle_openhandle_errorprocess_responseprocess_request)r   Zclient_versionrL   rL   rM   r     s    zOpenerDirector.__init__c              	   C   sR  t |dstdt| d}t|D ]}|dv r6q&|d}|d | }||d d  }|dr|d| d }||d d  }zt|}W n ty   Y n0 | 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&|rNt| j| ||  d S )N
add_parentz%expected BaseHandler instance, got %rF)redirect_requestdo_open
proxy_open_rV   errorrG   responserz   T)hasattr	TypeErrorr   dirfind
startswithrc   rB   r   r   r   r   r   
setdefaultbisectinsortrb   r   r   )r   handlerZaddedmethiprotocolZ	conditionjkindlookupr   rL   rL   rM   add_handler  sL    



zOpenerDirector.add_handlerc                 C   s   d S rN   rL   r   rL   rL   rM   close  s    zOpenerDirector.closec           	      G   s<   | |d}|D ]&}t||}|| }|d ur|  S qd S )NrL   )r   r   )	r   chainr   	meth_nameargsr   r   funcrl   rL   rL   rM   _call_chain  s    
zOpenerDirector._call_chainNc           
      C   s   t |trt||}n|}|d ur(||_||_|j}|d }| j|g D ]}t||}||}qJt	
d|j|j|j|  | ||}	|d }| j|g D ]}t||}|||	}	q|	S )NZ_requestzurllib.RequestZ	_response)
isinstancestrr   rI   rJ   r   r   r   r   sysauditru   rj   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   rl   r   rL   rL   rM   r     s     

zOpenerDirector._openc                 G   s~   |dv r,| j d }|d }d| }d}|}n| j }|d }d}|||f| }| j| }|r^|S |rz|dd	f| }| j| S d S )
Nhttpr   r   r:   zhttp_error_%srV   _errorr   r   http_error_default)r   r   )r   protor   dictr   Zhttp_errZ	orig_argsrl   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   /
r   c               	   G   s   t  }ttttttttt	g	}t
tjdr2|t t }|D ]B}| D ]8}t|trht||r||| qDt||rD|| qDq<|D ]}|| q|D ]}||  q| D ]}t|tr| }|| q|S )NHTTPSConnection)r   r   r.   r)   r   r   r+   r*   r/   r-   r   r   clientrb   rE   setr   r   
issubclassaddremover   )r   rK   Zdefault_classesskipklasscheckhrL   rL   rM   r2   7  s2    	




r2   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	r     c                 C   s
   || _ d S rN   )parent)r   r   rL   rL   rM   r   ^  s    zBaseHandler.add_parentc                 C   s   d S rN   rL   r   rL   rL   rM   r   a  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__e  s    
zBaseHandler.__lt__N)r   r   r   r   r   r   r   rL   rL   rL   rM   r   [  s   r   c                   @   s   e Zd ZdZdd ZeZdS )r/   i  c                 C   sH   |j |j|   }}}d|  kr,dk sDn | jd|||||}|S )N   ,  r   )codemsgrZ   r   r   )r   rz   r   r   r   r   rL   rL   rM   http_responser  s    z HTTPErrorProcessor.http_responseN)r   r   r   r   r   https_responserL   rL   rL   rM   r/   n  s   r/   c                   @   s   e Zd Zdd ZdS )r   c                 C   s   t |j||||d S rN   )r   ru   )r   r   ri   r   r   r   rL   rL   rM   r     s    z*HTTPDefaultErrorHandler.http_error_defaultN)r   r   r   r   rL   rL   rL   rM   r     s   r   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v r|dv s:|dv r(|dks:t|j|||||dd}d  fdd	|j D }t|||jd
dS )N)-  .  /  i3  )r   ZHEAD)r   r   r   r    z%20)rT   zcontent-typec                    s"   i | ]\}}|   vr||qS rL   )ry   .0kvZCONTENT_HEADERSrL   rM   
<dictcomp>  s   z8HTTPRedirectHandler.redirect_request.<locals>.<dictcomp>T)rj   r   r   )r   r   ru   replacerj   r   r   r   )	r   r   ri   r   r   rj   newurlmZ
newheadersrL   r  rM   r     s    
z$HTTPRedirectHandler.redirect_requestc           
      C   sL  d|v r|d }nd|v r$|d }nd S t |}|jdvrRt||d||f |||jsn|jrnt|}d|d< t|}t|dtj	d}t
|j|}| ||||||}|d u 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   ftprs   z+%s - Redirection to url '%s' is not allowed/r:   z
iso-8859-1)encodingsaferedirect_dictr   rV   rJ   )r   schemer   r\   netlocr   r   r	   stringpunctuationr   ru   r   r   r  r   max_repeatsre   max_redirectionsinf_msgrd   r   r   rG   rJ   )
r   r   ri   r   r   rj   r  urlpartsnewZvisitedrL   rL   rM   http_error_302  sH    



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   &<r   c           
      C   s   t | \}}|ds d }| }nZ|ds6td|  d|v rV|d}|d|}n|dd}|dkrnd }|d| }t|\}}|d urt|\}}	nd  }}	|||	|fS )Nr  //zproxy URL with no authority: %r@r:   rS   )r   r   rB   r   r   r   )
proxyr  Zr_scheme	authorityZhost_separatorenduserinfohostportuserpasswordrL   rL   rM   _parse_proxy  s$    


r)  c                   @   s"   e Zd ZdZdddZdd ZdS )r   d   Nc                 C   sP   |d u rt  }|| _| D ].\}}| }t| d| ||| jfdd qd S )Nz%s_openc                 S   s   || ||S rN   rL   )rr"  r   r   rL   rL   rM   <lambda>!  s    z'ProxyHandler.__init__.<locals>.<lambda>)r5   proxiesr   ry   setattrr   )r   r-  r   rH   rL   rL   rM   r     s    
zProxyHandler.__init__c                 C   s   |j }t|\}}}}|d u r"|}|jr6t|jr6d S |rv|rvdt|t|f }	t|	 d}
|	dd|
  t|}|
|| ||ks|dkrd S | jj||jdS d S )N%s:%sasciiProxy-authorizationBasic r   r  )r   r)  r{   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   
r   c                   @   s6   e Zd Zdd Zdd Zdd Zddd	Zd
d ZdS )r    c                 C   s
   i | _ d S rN   )passwdr   rL   rL   rM   r   B  s    zHTTPPasswordMgr.__init__c                    s\   t |tr|g}|jvr$i j|< dD ]. t fdd|D }||fj| |< q(d S )NTFc                 3   s   | ]} | V  qd S rN   )
reduce_uri)r  udefault_portr   rL   rM   	<genexpr>L  s   z/HTTPPasswordMgr.add_password.<locals>.<genexpr>)r   r   r8  tuple)r   realmr  r'  r8  reduced_urirL   r<  rM   add_passwordE  s    


zHTTPPasswordMgr.add_passwordc           	      C   s`   | j |i }dD ]H}| ||}| D ].\}}|D ] }| ||r6|      S q6q*qdS )Nr9  NN)r8  r   r:  r   	is_suburi)	r   r@  authuriZdomainsr=  reduced_authuriZurisZauthinfor  rL   rL   rM   find_user_passwordP  s    z"HTTPPasswordMgr.find_user_passwordTc           
      C   s   t |}|d r.|d }|d }|d p*d}nd }|}d}t|\}}|r~|d u r~|d ur~ddd|}	|	d ur~d||	f }||fS )	NrV   r   r:   r  P   i  r   z%s:%d)r   r   r   )
r   r  r=  partsr  r#  r\   r{   portZdportrL   rL   rM   r:  Z  s$    zHTTPPasswordMgr.reduce_uric                 C   sN   ||krdS |d |d kr dS |d }|dd  dkr@|d7 }|d  |S )NTr   FrV   rS   r  )r   )r   basetestprefixrL   rL   rM   rD  q  s    zHTTPPasswordMgr.is_suburiN)T)r   r   r   r   rB  rG  r:  rD  rL   rL   rL   rM   r    @  s
   

r    c                   @   s   e Zd Zdd ZdS )r!   c                 C   s0   t | ||\}}|d ur"||fS t | d |S rN   )r    rG  )r   r@  rE  r'  r(  rL   rL   rM   rG    s    z2HTTPPasswordMgrWithDefaultRealm.find_user_passwordN)r   r   r   rG  rL   rL   rL   rM   r!     s   r!   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|i | d S rN   )authenticatedsuperr   r   r   kwargs	__class__rL   rM   r     s    z%HTTPPasswordMgrWithPriorAuth.__init__Fc                    s<   |  || |d ur&t d ||| t |||| d S rN   )update_authenticatedrO  rB  )r   r@  r  r'  r8  is_authenticatedrR  rL   rM   rB    s    z)HTTPPasswordMgrWithPriorAuth.add_passwordc                 C   s>   t |tr|g}dD ]$}|D ]}| ||}|| j|< qqd S Nr9  )r   r   r:  rN  )r   r  rU  r=  r;  rA  rL   rL   rM   rT    s    
z1HTTPPasswordMgrWithPriorAuth.update_authenticatedc                 C   sD   dD ]:}|  ||}| jD ]"}| ||r| j|     S qqd S rV  )r:  rN  rD  )r   rE  r=  rF  r  rL   rL   rM   rU    s
    
z-HTTPPasswordMgrWithPriorAuth.is_authenticated)F)F)r   r   r   r   rB  rT  rU  __classcell__rL   rL   rR  rM   r"     s   

r"   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 u rt  }|| _| jj| _d S rN   )r    r8  rB  )r   Zpassword_mgrrL   rL   rM   r     s    z!AbstractBasicAuthHandler.__init__c                 c   sp   d}t j|D ]6}| \}}}|dvr8tdtd ||fV  d}q|sl|r^| d }nd}|d fV  d S )NF)"'zBasic Auth Realm was unquoted   Tr   rs   )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 }|D ]H}| |D ]8\}}| dkrB|}q(|d ur(| |||    S q(q|d urztd|f d S )NbasiczBAbstractBasicAuthHandler does not support the following scheme: %r)Zget_allrb  ry   retry_http_basic_authrB   )	r   authreqr{   r   rj   Zunsupportedr`  r  r@  rL   rL   rM   http_error_auth_reqed  s    
z.AbstractBasicAuthHandler.http_error_auth_reqedc                 C   s|   | j ||\}}|d urtd||f }dt| d }|| jd |krTd S || j| | j	j
||jdS d S d S )Nr/  r2  r0  r  )r8  rG  r4  r5  r6  r7  rv   auth_headerr   r   rG   rJ   )r   r{   r   r@  r'  pwrawauthrL   rL   rM   rd    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 )NrU  Authorizationz{0}:{1}zBasic {})r   r8  rU  ru   r   rG  r   r6  r4  Zstandard_b64encoder7  r   strip)r   r   r'  r8  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 )NrU  r   r   TF)r   r8  r   rT  ru   )r   r   r   rL   rL   rM   r     s
    z&AbstractBasicAuthHandler.http_response)N)r   r   r   recompileIr[  r   rb  rf  rd  rm  r   https_requestr   rL   rL   rL   rM   r#     s   
r#   c                   @   s   e Zd ZdZdd ZdS )r$   rk  c                 C   s   |j }| d|||}|S )Nwww-authenticate)ru   rf  )r   r   ri   r   r   rj   rH   r   rL   rL   rM   http_error_401  s
    z#HTTPBasicAuthHandler.http_error_401N)r   r   r   rg  rs  rL   rL   rL   rM   r$     s   r$   c                   @   s   e Zd ZdZdd ZdS )r%   r1  c                 C   s   |j }| d|||}|S Nproxy-authenticate)r{   rf  )r   r   ri   r   r   rj   r#  r   rL   rL   rM   http_error_407'  s
    z$ProxyBasicAuthHandler.http_error_407N)r   r   r   rg  rv  rL   rL   rL   rM   r%   #  s   r%   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 u rt  }|| _| jj| _d| _d| _d | _d S Nr   )r    r8  rB  retriednonce_count
last_nonce)r   r8  rL   rL   rM   r   A  s    
z"AbstractDigestAuthHandler.__init__c                 C   s
   d| _ d S rw  )rx  r   rL   rL   rM   reset_retry_countJ  s    z+AbstractDigestAuthHandler.reset_retry_countc                 C   s|   | |d }| jdkr*t|jdd|d n|  jd7  _|rx| d }| dkr`| ||S | dkrxtd| d S )	N   i  zdigest auth failedrV   r   digestrc  zEAbstractDigestAuthHandler does not support the following scheme: '%s')r   rx  r   ru   r_  ry   retry_http_digest_authrB   )r   rg  r{   r   rj   re  r  rL   rL   rM   rf  M  s    

z/AbstractDigestAuthHandler.http_error_auth_reqedc                 C   sz   | dd\}}ttd t|}| ||}|rvd| }|j| jd |krRd S || j| | j	j
||jd}|S d S )Nr   rV   z	Digest %sr  )r_  parse_keqv_listfilterparse_http_listget_authorizationrj   r   rg  r   r   rG   rJ   )r   r   rj  tokenZ	challengechalZauth_valZresprL   rL   rM   r~  a  s    z0AbstractDigestAuthHandler.retry_http_digest_authc                 C   s@   d| j |t f }|dtd }t| }|d d S )Nz	%s:%s:%s:r0        )ry  timectimer6  _randombyteshashlibsha1	hexdigest)r   noncesbdigrL   rL   rM   
get_cnoncem  s    z$AbstractDigestAuthHandler.get_cnoncec                 C   s  z6|d }|d }| d}| dd}| dd }W n tyJ   Y d S 0 | |\}}	|d u rfd S | j||j\}
}|
d u rd S |jd ur| |j|}nd }d|
||f }d| |j	f }|d u r|	||d|||f }n~d	|
d
v 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@  r  qop	algorithmMD5opaquez%s:%s:%sr/  rj  ,rV   z%08xz%s:%s:%s:%s:%szqop '%s' is not supported.z>username="%s", realm="%s", nonce="%s", uri="%s", response="%s"z, opaque="%s"z, digest="%s"z, algorithm="%s"z, qop=auth, nc=%s, cnonce="%s")r   KeyErrorget_algorithm_implsr8  rG  ru   rI   get_entity_digestr   r   r_  rz  ry  r  r   )r   r   r  r@  r  r  r  r  HKDr'  rh  ZentdigZA1ZA2ZrespdigZncvalueZcnonceZnoncebitrK  rL   rL   rM   r  x  s\    




z+AbstractDigestAuthHandler.get_authorizationc                    sD   |dkrdd  n|dkr$dd  nt d|  fdd} |fS )Nr  c                 S   s   t | d S Nr0  )r  md5r6  r  xrL   rL   rM   r,        z?AbstractDigestAuthHandler.get_algorithm_impls.<locals>.<lambda>ZSHAc                 S   s   t | d S r  )r  r  r6  r  r  rL   rL   rM   r,    r  z.Unsupported digest authentication algorithm %rc                    s    d| |f S )Nr/  rL   )r  dr  rL   rM   r,    r  )rB   )r   r  r  rL   r  rM   r    s    

z-AbstractDigestAuthHandler.get_algorithm_implsc                 C   s   d S rN   rL   )r   rI   r  rL   rL   rM   r    s    z+AbstractDigestAuthHandler.get_entity_digest)N)r   r   r   r   r{  rf  r~  r  r  r  r  rL   rL   rL   rM   r&   6  s   
	>r&   c                   @   s   e Zd ZdZdZdd ZdS )r'   rk    c                 C   s*   t |jd }| d|||}|   |S )NrV   rr  )r   ru   rf  r{  r   r   ri   r   r   rj   r{   retryrL   rL   rM   rs    s    z$HTTPDigestAuthHandler.http_error_401N)r   r   r   rg  r   rs  rL   rL   rL   rM   r'     s   r'   c                   @   s   e Zd ZdZdZdd ZdS )r(   Proxy-Authorizationr  c                 C   s"   |j }| d|||}|   |S rt  )r{   rf  r{  r  rL   rL   rM   rv    s    z%ProxyDigestAuthHandler.http_error_407N)r   r   r   rg  r   rv  rL   rL   rL   rM   r(     s   r(   c                   @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )AbstractHTTPHandlerr   c                 C   s
   || _ d S rN   _debuglevel)r   
debuglevelrL   rL   rM   r     s    zAbstractHTTPHandler.__init__c                 C   s
   || _ d S rN   r  )r   levelrL   rL   rM   set_http_debuglevel  s    z'AbstractHTTPHandler.set_http_debuglevelc                 C   s   t jj|j| S rN   )r   r   HTTPConnection_get_content_lengthrI   r   r   rz   rL   rL   rM   r    s    z'AbstractHTTPHandler._get_content_lengthc                 C   s  |j }|std|jd ur|j}t|tr8d}t||dsN|dd |ds|ds| |}|d ur|dt| n|dd |}|	 rt
|j\}}t|\}}	|ds|d| | jjD ]&\}
}|
 }
||
s||
| q|S )	Nno host givenz\POST data should be bytes, an iterable of bytes, or a file object. It cannot be of type str.zContent-type!application/x-www-form-urlencodedr   Transfer-encodingZchunkedrt   )r{   r   rI   r   r   r   r   r   r  r   r   r   r   r   r   r   )r   rz   r{   rI   r   Zcontent_lengthZsel_hostr  ZselZsel_pathr`   r   rL   rL   rM   do_request_  sF    






zAbstractHTTPHandler.do_request_c           
   
      sV  |j }|std||fd|ji|}|| j t|j   fdd|j	 D  d d< dd  	 D  |j
ri }d}| v r | ||<  |= |j|j
|d	 zbz&|j| |j|j |d
d W n. ty } zt|W Y d }~n
d }~0 0 | }	W n   |   Y n0 |jr@|j  d |_| |	_|	j|	_|	S )Nr  rJ   c                    s   i | ]\}}| vr||qS rL   rL   r  rj   rL   rM   r  '  s   z/AbstractHTTPHandler.do_open.<locals>.<dictcomp>r   
Connectionc                 S   s   i | ]\}}|  |qS rL   )title)r  r`   r   rL   rL   rM   r  4  r  r  r  r  )Zencode_chunked)r{   r   rJ   Zset_debuglevelr  r   r}   updaterj   r   r   Z
set_tunnelrz   r   r   rI   r   rr   getresponser   sockr   rH   reasonr   )
r   Z
http_classr   Zhttp_conn_argsr{   r   Ztunnel_headersZproxy_auth_hdrerrr+  rL   r  rM   r     sB    



zAbstractHTTPHandler.do_openN)r   )r   r   r   r   r  r  r  r   rL   rL   rL   rM   r    s
   
&r  c                   @   s   e Zd Zdd ZejZdS )r)   c                 C   s   |  tjj|S rN   )r   r   r   r  r   r   rL   rL   rM   	http_open^  s    zHTTPHandler.http_openN)r   r   r   r  r  r  rm  rL   rL   rL   rM   r)   \  s   r)   r   c                   @   s$   e Zd ZdddZdd ZejZdS )rE   r   Nc                 C   s   t | | || _|| _d S rN   )r  r   _context_check_hostname)r   r  r>   check_hostnamerL   rL   rM   r   g  s    zHTTPSHandler.__init__c                 C   s   | j tjj|| j| jdS )N)r>   r  )r   r   r   r   r  r  r  rL   rL   rM   
https_openl  s    zHTTPSHandler.https_open)r   NN)r   r   r   r   r  r  r  rq  rL   rL   rL   rM   rE   e  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 u r|j }|| _d S rw  )Zhttp.cookiejar	cookiejarZ	CookieJar)r   r  r   rL   rL   rM   r   u  s    
zHTTPCookieProcessor.__init__c                 C   s   | j | |S rN   )r  Zadd_cookie_headerr  rL   rL   rM   rm  {  s    z HTTPCookieProcessor.http_requestc                 C   s   | j || |S rN   )r  Zextract_cookies)r   rz   r   rL   rL   rM   r     s    z!HTTPCookieProcessor.http_response)N)r   r   r   r   rm  r   rq  r   rL   rL   rL   rM   r   t  s
   
r   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   r.   c                 C   sN   i }| D ]@}| dd\}}|d dkr@|d dkr@|dd }|||< q|S )N=rV   r   rX  rS   )r_  )lparsedeltr  r  rL   rL   rM   r    s    
r  c                 C   s   g }d}d }}| D ]l}|r*||7 }d}q|rT|dkr>d}qn|dkrJd}||7 }q|dkrl| | d}q|dkrxd}||7 }q|r| | dd |D S )	Nrs   F\TrX  r  c                 S   s   g | ]}|  qS rL   )rl  )r  partrL   rL   rM   
<listcomp>  r  z#parse_http_list.<locals>.<listcomp>)rb   )r  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|  vrXtdn
| |S d S )Nr:   r   rZ  r  	localhost-file:// scheme is supported only on localhost)r   r{   	get_namesr   open_local_file)r   r   rH   rL   rL   rM   	file_open  s    &
zFileHandler.file_openNc                 C   s^   t jd u rXz*ttdd tt d  t _W n" tjyV   tdft _Y n0 t jS )Nr  r:   )r*   namesr?  r   gethostbyname_exgethostnamegaierrorgethostbynamer   rL   rL   rM   r    s    

zFileHandler.get_namesc              
   C   s   dd l }dd l}|j}|j}t|}zt|}|j}|jj	|j
dd}	||d }
|d|
pbd||	f }|r~t|\}}|r|st||  v r|rd| | }nd| }tt|d||W S W n, ty } zt|W Y d }~n
d }~0 0 tdd S )	Nr   TZusegmtz6Content-type: %s
Content-length: %d
Last-modified: %s

text/plainfile://rbzfile not on local host)email.utils	mimetypesr{   r   r4   r[   statst_sizeutils
formatdatest_mtime
guess_typemessage_from_stringr   _safe_gethostbynamer  r   rG   rr   r   )r   r   emailr  r{   rg   Z	localfilestatsrn   modifiedmtyperj   rJ  ZorigurlexprL   rL   rM   r    s:    
zFileHandler.open_local_file)r   r   r   r  r  r  r  rL   rL   rL   rM   r*     s   
r*   c                 C   s(   zt | W S  t jy"   Y d S 0 d S rN   )r   r  r  )r{   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 u r>|j}nt|}t|\}}|rdt|\}}nd }t	|}|pvd}|p~d}zt
|}W n, ty } zt|W Y d }~n
d }~0 0 t|j\}	}
|	d}ttt	|}|d d |d  }}|r|d s|dd  }z| ||||||j}|r8dp:d}|
D ]2}t|\}}| d	kr@|d
v r@| }q@|||\}}d}||jd }|r|d| 7 }|d ur|dkr|d| 7 }t|}t|||jW S  |jy( } z*td| }|t  d W Y d }~n
d }~0 0 d S )Nr   ftp error: no host givenrs   r  rS   rV   rp  Dr   aAr   rp  r  r  zContent-type: %s
zContent-length: %d
ftp error: %rr:   )!ftplibr  r{   r   r   FTP_PORTrc   r   r   r
   r   r  rr   r   r   r_  r   mapconnect_ftprJ   r   ry   upperretrfiler  ru   r  r  r   
all_errorswith_tracebackr   exc_info)r   r   r  r  r{   rJ  r'  r8  r   r\   attrsdirsrO   fwr   attrr   ri   retrlenrj   r  r  excrL   rL   rM   ftp_open  s^    

zFTPHandler.ftp_openc              	   C   s   t ||||||ddS )NF)
persistent)
ftpwrapper)r   r'  r8  r{   rJ  r  rJ   rL   rL   rM   r  /  s    zFTPHandler.connect_ftpN)r   r   r   r  r  rL   rL   rL   rM   r+     s   5r+   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )r,   c                 C   s"   i | _ i | _d| _d| _d| _d S )Nr   <   r  )cacherJ   soonestdelay	max_connsr   rL   rL   rM   r   6  s
    zCacheFTPHandler.__init__c                 C   s
   || _ d S rN   )r  )r   trL   rL   rM   
setTimeout=  s    zCacheFTPHandler.setTimeoutc                 C   s
   || _ d S rN   )r  )r   r	  rL   rL   rM   setMaxConns@  s    zCacheFTPHandler.setMaxConnsc                 C   sr   |||d ||f}|| jv r4t | j | j|< n,t||||||| j|< t | j | j|< |   | j| S )Nr  )joinr  r  r  rJ   r   check_cache)r   r'  r8  r{   rJ  r  rJ   r   rL   rL   rM   r  C  s    


zCacheFTPHandler.connect_ftpc                 C   s   t   }| j|krPt| j D ].\}}||k r | j|   | j|= | j|= q tt| j | _t	| j| j
krt| j D ]&\}}|| jkr| j|= | j|=  qqtt| j | _d S rN   )r  r  r   rJ   r   r  r   minvaluesre   r  )r   r  r  r  rL   rL   rM   r
  N  s    


zCacheFTPHandler.check_cachec                 C   s0   | j  D ]}|  q
| j   | j  d S rN   )r  r  r   clearrJ   )r   connrL   rL   rM   clear_cacheb  s    

zCacheFTPHandler.clear_cacheN)	r   r   r   r   r  r  r  r
  r  rL   rL   rL   rM   r,   3  s   r,   c                   @   s   e Zd Zdd ZdS )r-   c                 C   s~   |j }|dd\}}|dd\}}t|}|drNt|}|d d }|sVd}td|t|f }t	t
|||S )N:rV   r  z;base64itext/plain;charset=US-ASCIIz$Content-type: %s
Content-length: %d
)ru   r_  r   endswithr4  decodebytesr  r  re   r   ioBytesIO)r   r   rH   r  rI   Z	mediatyperj   rL   rL   rM   	data_openi  s    



zDataHandler.data_openN)r   r   r   r  rL   rL   rL   rM   r-   h  s   r-   r   nt)r4   r3   c                 C   s   t | S rN   )r
   pathnamerL   rL   rM   r4     s    r4   c                 C   s   t | S rN   )r	   r  rL   rL   rM   r3     s    r3   c                   @   s   e Zd ZdZde Zd)ddZdd Zdd Zd	d
 Z	dd Z
d*ddZd+ddZd,ddZd-ddZdd Zd.ddZd/ddZdd Zerdd Zd0dd Zd!d" Zd#d$ Zd%d& Zd1d'd(ZdS )2r8   Nr   c                 K   sz   dd| j ji }tj|tdd |d u 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classrZ  )
stacklevelkey_file	cert_filez
User-Agent)ZAcceptz*/*)rS  r   r?   r@   rA   r5   r-  r   r  r  versionr   _URLopener__tempfilesr[   rq   _URLopener__unlink	tempcacheftpcache)r   r-  Zx509r   rL   rL   rM   r     s    
zURLopener.__init__c                 C   s   |    d S rN   )r   r   rL   rL   rM   __del__  s    zURLopener.__del__c                 C   s   |    d S rN   )cleanupr   rL   rL   rM   r     s    zURLopener.closec              	   C   sT   | j r@| j D ]&}z| | W q ty0   Y q0 q| j d d = | jrP| j  d S rN   )r  r   rr   r!  r  )r   rO   rL   rL   rM   r$    s    
zURLopener.cleanupc                 G   s   | j | d S rN   )r   rb   )r   r   rL   rL   rM   	addheader  s    zURLopener.addheaderc              
   C   sp  t t|}t|dd}| jrL|| jv rL| j| \}}t|d}t|||S t|\}}|s`d}|| jv r| j| }t|\}}	t|	\}
}|
|f}nd }d| }|| _	|
dd}t| |r|dkr|r| |||S | ||S z0|d u r t| ||W S t| |||W S W nV ttfy.    Y n> tyj } z$td	|t d
 W Y d }~n
d }~0 0 d S )Nz%/:=&?~#+!$,;'@()*[]|r  r  rO   Zopen_-r   r  zsocket errorr:   )r   r   r	   r!  rG   r   r   r-  r   r   r  r   open_unknown_proxyopen_unknownr   r   r   rr   r  r   r  )r   r   rI   rg   rj   ri   urltyperH   r"  	proxyhostr{   r   r`   r   rL   rL   rM   rG     s<    




zURLopener.openc                 C   s   t |\}}tdd|d S )N	url errorzunknown url typer   rr   )r   r   rI   r   rH   rL   rL   rM   r)    s    zURLopener.open_unknownc                 C   s    t |\}}tdd| |d S )Nr,  zinvalid proxy for %sr-  )r   r"  r   rI   r   rH   rL   rL   rM   r(    s    zURLopener.open_unknown_proxyc                 C   s  t t|}| jr&|| jv r&| j| S t|\}}|d u r|rF|dkrz0| |}| }|  tt|d |fW S  t	y   Y n0 | 
||}zL| }	|rt
|d}
nrt|\}}t|pd\}}t|pd\}}t|pd\}}tj|d }t|\}}| j| t|d}
z||	f}| jd urD|| j|< d}d}d}d}d|	v rjt|	d	 }|r||||| ||}|sq|t|7 }|
| |d7 }|r||||| q|W |
  n
|
  0 W |  n
|  0 |dkr||k rtd
||f ||S )NrO   rV   rP   rs   rR   rS   r   rT   rU   rW   )r   r   r!  r   r  rZ   r   r4   r   rr   rG   r   r   r[   r\   splitextr^   mkstempr  rb   fdopenrc   rd   re   rf   r   )r   rH   rg   rh   rI   r   Zurl1ri   r   rj   rk   Zgarbager\   suffixfdrl   rm   rn   rd   ro   rp   rL   rL   rM   retrieve  sn    





zURLopener.retrievec                 C   s"  d }d }t |tr<t|\}}|r6t|\}}t|}|}nt|\}}t|\}}t|\}	}
|
}d }|	 dkrvd }n:t|
\}}
|rt|\}}|rd|	||
f }t|r|}|stdd|rt|}t	
| d}nd }|rt|}t	
| d}nd }||}i }|r*d| |d< |r<d| |d< |rJ||d	< d
|d< | jD ]\}}|||< qX|d urd|d< |d||| n|jd||d z| }W n  tjjy   tdY n0 d|j  krdk rn nt||jd| |jS | ||j|j|j|j|S d S )Nr   z	%s://%s%sz
http errorr  r0  zBasic %sr  rk  rt   r   r  r  zContent-Typer   r   r  z$http protocol error: bad status liner   r   http:)r   r   r   r   r
   r   ry   r3  rr   r4  r5  r6  r7  r   rz   r  r   r   ZBadStatusLiner   statusr   r   
http_errorri   r  )r   Zconnection_factoryrH   rI   Zuser_passwdZproxy_passwdr{   r   Zrealhostr*  r   Z
proxy_authrj  Z	http_connrj   r`  r   r   rL   rL   rM   _open_generic_httpN  st    

zURLopener._open_generic_httpc                 C   s   |  tjj||S rN   )r7  r   r   r  r   rH   rI   rL   rL   rM   	open_http  s    zURLopener.open_httpc           
      C   sb   d| }t | |rPt| |}|d u r6||||||}	n|||||||}	|	rP|	S | |||||S )Nzhttp_error_%d)r   r   r   )
r   rH   ri   errcodeerrmsgrj   rI   r`   r   rl   rL   rL   rM   r6    s    

zURLopener.http_errorc                 C   s   |   t||||d d S rN   )r   r   r   rH   ri   r:  r;  rj   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   r{   rL   rL   rM   _https_connection  s    zURLopener._https_connectionc                 C   s   |  | j||S rN   )r7  r=  r8  rL   rL   rM   
open_https  s    zURLopener.open_httpsc                 C   s^   t |tstd|d d dkrP|dd dkrP|dd  dkrPtdn
| |S d S )	NzEfile error: proxy support for file protocol currently not implementedr:   r   rZ  r     z
localhost/r  )r   r   r   ry   rB   r  r   rL   rL   rM   	open_file  s
    
4
zURLopener.open_filec              
   C   s^  dd l }dd l}t|\}}t|}zt|}W n2 tyd } zt|j|j	W Y d }~n
d }~0 0 |j
}	|jj|jdd}
||d }|d|pd|	|
f }|s|}|d d dkrd| }tt|d	||S t|\}}|sRt|t ft  v rR|}|d d dkr"d| }n|d d
 dkr@td| tt|d	||S tdd S )Nr   Tr  z6Content-Type: %s
Content-Length: %d
Last-modified: %s
r  rV   r  r  r  r:   z./zAlocal file url may start with / or file:. Unknown url of type: %sz#local file error: not on local host)r  r  r   r4   r[   r  rr   r   strerrorrg   r  r  r  r  r  r  r   rG   r   r   r  r  thishostrB   )r   rH   r  r  r{   rO   Z	localnamer  ern   r  r  rj   ZurlfilerJ  rL   rL   rM   r    s@    $
zURLopener.open_local_filec              
   C   s  t |tstddd l}t|\}}|s2tdt|\}}t|\}}|r\t|\}}nd }t|}t|ppd}t|p|d}t	
|}|sdd l}|j}nt|}t|\}}	t|}|d}
|
d d |
d  }
}|
r|
d s|
dd  }
|
r
|
d s
d|
d< |||d|
f}t| jtkrbt| jD ]*}||kr6| j| }| j|= |  q6z|| jvrt|||||
| j|< |sd}nd	}|	D ]2}t|\}}| d
kr|dv r| }q| j| ||\}}|d| d }d}|r|d| 7 }|d ur,|dkr,|d| 7 }t|}t||d| W S  t y } z&td|  t!" d W Y d }~n
d }~0 0 d S )NzCftp error: proxy support for ftp protocol currently not implementedr   r  rs   r  rS   rV   r  rp  r   r  zftp:zContent-Type: %s
zContent-Length: %d
zftp error %rr:   )#r   r   r   r  r   r   r   r   r
   r   r  r  r  rc   r   r_  r	  re   r"  MAXFTPCACHEr   r   r   r   ry   r  r  r  r  r  r   	ftperrorsr  r   r  )r   rH   r  r{   r\   rJ  r'  r8  r  r  r  rO   r   r  r  r   r  r   ri   r  r  rj   r  rL   rL   rM   open_ftp  sj    





zURLopener.open_ftpc           	   
   C   s:  t |tstdz|dd\}}W n tyB   tddY n0 |sLd}|d}|dkrd	||d  vr||d d  }|d | }nd
}g }|dt	dt
t   |d|  |dkrt|dd}nt|}|dt|  |d
 || d|}t|}t|}t|||S )NzEdata error: proxy support for data protocol currently not implementedr  rV   z
data errorzbad data URLr  ;r   r  rs   zDate: %sz%a, %d %b %Y %H:%M:%S GMTzContent-type: %sr4  r0  zlatin-1zContent-Length: %d
)r   r   r   r_  rB   rr   rfindrb   r  strftimegmtimer4  r  r6  r7  r
   re   r	  r  r  r  StringIOr   )	r   rH   rI   r   Zsemir  r   rj   frL   rL   rM   	open_data0  s8    






zURLopener.open_data)N)N)N)N)NNN)N)N)N)N)r   r   r   r  r   r  r   r#  r   r$  r%  rG   r)  r(  r3  r7  r9  r6  r   rC   r=  r>  r@  r  rF  rN  rL   rL   rL   rM   r8     s,   

$


A\


	 :r8   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| g|R i | i | _d| _d| _d S )Nr   r   )r8   r   
auth_cachetriesmaxtriesrP  rL   rL   rM   r   ]  s    zFancyURLopener.__init__c                 C   s   t ||d| |S )Nr4  )r   r<  rL   rL   rM   r   c  s    z!FancyURLopener.http_error_defaultNc           	      C   s~   |  j d7  _ zb| jrR| j | jkrRt| dr4| j}n| j}|||dd|W d| _ S | ||||||}|W d| _ S d| _ 0 d S )NrV   http_error_500r   z)Internal Server Error: Redirect Recursionr   )rP  rQ  r   rR  r   redirect_internal)	r   rH   ri   r:  r;  rj   rI   r   rl   rL   rL   rM   r  g  s&    
zFancyURLopener.http_error_302c           	      C   sx   d|v r|d }nd|v r$|d }nd S |   t| jd | |}t|}|jdvrnt|||d|  ||| |S )Nr
  r  r  r  z( Redirection to url '%s' is not allowed.)r   r   r   r   r  r   rG   )	r   rH   ri   r:  r;  rj   rI   r  r  rL   rL   rM   rS  y  s     


z FancyURLopener.redirect_internalc                 C   s   |  ||||||S rN   r  r   rH   ri   r:  r;  rj   rI   rL   rL   rM   r    s    zFancyURLopener.http_error_301c                 C   s   |  ||||||S rN   rT  rU  rL   rL   rM   r    s    zFancyURLopener.http_error_303c                 C   s2   |d u r|  ||||||S | |||||S d S rN   )r  r   rU  rL   rL   rM   r    s    zFancyURLopener.http_error_307Fc                 C   s   d|vrt | ||||| |d }td|}	|	sHt | ||||| |	 \}
}|
 dkrtt | ||||| |st | ||||| d| j d }|d u rt| |||S t| ||||S d S )Nrr  ![ 	]*([^ 	]+)[ 	]+realm="([^"]*)"rc  Zretry__basic_authr8   r   rn  matchr]  ry   r   r   r   rH   ri   r:  r;  rj   rI   r  stuffrY  r  r@  r`   rL   rL   rM   rs    s.    


zFancyURLopener.http_error_401c                 C   s   d|vrt | ||||| |d }td|}	|	sHt | ||||| |	 \}
}|
 dkrtt | ||||| |st | ||||| d| j d }|d u rt| |||S t| ||||S d S )Nru  rV  rc  Zretry_proxy_rW  rX  rZ  rL   rL   rM   rv    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 u r| |S | ||S d S )Nhttp://r   r!  rV   %s:%s@%srs   r&  r   r-  r   r   get_user_passwdr	   rG   r   rH   r@  rI   r{   r   r  r"  r*  r+  Zproxyselectorr   r'  r8  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 u r| |S | ||S d S )Nhttps://r   r!  rV   r]  rs   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 u r| |	S | |	|S d S )Nr!  rV   r]  rs   r&  r\  r   r   r_  r	   rG   
r   rH   r@  rI   r{   r   r   r'  r8  r  rL   rL   rM   rd    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 u r| |	S | |	|S d S )Nr!  rV   r]  rs   r&  rb  rd  re  rL   rL   rM   retry_https_basic_auth	  s    
z%FancyURLopener.retry_https_basic_authr   c                 C   s`   |d |   }|| jv r2|r(| j|= n
| j| S | ||\}}|sJ|rX||f| j|< ||fS )Nr!  )ry   rO  prompt_user_passwd)r   r{   r@  r  r   r'  r8  rL   rL   rM   r_  	  s    


zFancyURLopener.get_user_passwdc                 C   sV   dd l }z.td||f }| d|||f }||fW S  tyP   t  Y dS 0 d S )Nr   zEnter username for %s at %s: z#Enter password for %s in %s at %s: rC  )getpassinputKeyboardInterruptprint)r   r{   r@  rh  r'  r8  rL   rL   rM   rg  !	  s    
z!FancyURLopener.prompt_user_passwd)N)N)N)N)NF)NF)N)N)N)N)r   )r   r   r   r   r   r  rS  r  r  r  rs  rv  ra  rc  rd  rf  r_  rg  rL   rL   rL   rM   r9   Z  s&   



  
  





r9   c                   C   s   t d u rtda t S )Nr  )
_localhostr   r  rL   rL   rL   rM   r  1	  s    
r  c                   C   sN   t d u rJzttt d a W n& tjyH   ttdd a Y n0 t S )Nr:   r  )	_thishostr?  r   r  r  r  rL   rL   rL   rM   rB  9	  s    rB  c                  C   s   t d u rdd l} | ja t S rw  )
_ftperrorsr  r  )r  rL   rL   rM   rE  D	  s    rE  c                   C   s   t d u rtda t S r   )
_noheadersr  r  rL   rL   rL   rM   	noheadersM	  s    
rp  c                   @   sF   e Zd ZdddZdd Zdd Zd	d
 Zdd Zdd Zdd Z	dS )r   NTc                 C   sX   || _ || _|| _|| _|| _|| _d| _|| _z|   W n   | 	   Y n0 d S rw  )
r'  r8  r{   rJ  r  rJ   refcount	keepaliveinitr   )r   r'  r8  r{   rJ  r  rJ   r  rL   rL   rM   r   Z	  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  connectr{   rJ  rJ   Zloginr'  r8  r	  r  cwd)r   r  _targetrL   rL   rM   rs  j	  s    
zftpwrapper.initc              
   C   s  dd l }|   |dv r"d}d}nd| }d}z| j| W n( |jyf   |   | j| Y n0 d }|r|szd| }| j|\}}W nT |jy } z:t|d d dkrt	d	| 
t d
 W Y d }~n
d }~0 0 |s| jd |rz| j }	zXz| j| W n6 |jyP } zt	d	| |W Y d }~n
d }~0 0 W | j|	 n| j|	 0 d| }nd}| j|\}}d| _t|d| j}
|  jd7  _|  |
|fS )Nr   )r  r  zTYPE ArV   zTYPE zRETR rZ  Z550r  r:   zLIST LISTr  )r  endtransferr  Zvoidcmdr  rs  ZntransfercmdZ
error_permr   r   r  r   r  pwdrv  rt  r   makefile
file_closerq  r   )r   rO   r   r  cmdisdirr  r  r  rz  ZftpobjrL   rL   rM   r  s	  sJ    

&
zftpwrapper.retrfilec                 C   s
   d| _ d S rw  )rt  r   rL   rL   rM   ry  	  s    zftpwrapper.endtransferc                 C   s   d| _ | jdkr|   d S )NFr   )rr  rq  
real_closer   rL   rL   rM   r   	  s    
zftpwrapper.closec                 C   s2   |    |  jd8  _| jdkr.| js.|   d S )NrV   r   )ry  rq  rr  r  r   rL   rL   rM   r|  	  s    zftpwrapper.file_closec                 C   s0   |    z| j  W n t y*   Y n0 d S rN   )ry  r  r   rE  r   rL   rL   rM   r  	  s
    zftpwrapper.real_close)NT)
r   r   r   r   rs  r  ry  r   r|  r  rL   rL   rL   rM   r   W	  s     
	-r   c                  C   s   i } t j D ]4\}}| }|r|dd  dkr|| |d d < qdt jv rZ| dd  t j D ]J\}}|dd  dkrd| }|r|| |d d < qd| |d d d  qd| S )Ni_proxyZREQUEST_METHODr   )r[   environr   ry   r   )r-  r`   r   rL   rL   rM   getproxies_environment	  s    	
r  c                 C   s   |d u rt  }z|d }W n ty.   Y dS 0 |dkr<dS |  } t| \}}|dD ]Z}| }|rZ|d}| }||ks| |kr dS d| }||s| |rZ dS qZdS )NnoF*Tr  .)r  r  ry   r   r_  rl  lstripr  )r{   r-  Zno_proxyhostonlyrJ  r`   rL   rL   rM   proxy_bypass_environment	  s*    
r  c              	   C   s.  ddl m } t| \}}dd }d| vr4|d r4dS d }|dd	D ]}|sNqDtd
|}|d ur|d u rzt|}||}W n ty   Y qDY n0 ||d}	|d}
|
d u rd|d	dd  }
nt
|
dd  }
|
dk sD|
dkrqDd|
 }
||
? |	|
? kr( dS qD|| |rD dS qDdS )Nr   )fnmatchc                 S   sd   |  d}ttt|}t|dkr8|g d d d }|d d> |d d> B |d d	> B |d
 B S )Nr  r   )r   r   r   r   r      rV   r  r:   r  rZ  )r_  r   r  rc   re   )ZipAddrrI  rL   rL   rM   ip2num

  s
    
z,_proxy_bypass_macosx_sysconf.<locals>.ip2numr  Zexclude_simpleT
exceptionsrL   z(\d+(?:\.\d+)*)(/\d+)?rV   r:   r      F)r  r   r   rn  rY  r   r  rr   groupcountrc   )r{   proxy_settingsr  r  rJ  r  ZhostIPr   r	  rK  maskrL   rL   rM   _proxy_bypass_macosx_sysconf	  s<    




r  darwin)_get_proxy_settings_get_proxiesc                 C   s   t  }t| |S rN   )r  r  )r{   r  rL   rL   rM   proxy_bypass_macosx_sysconf>
  s    r  c                   C   s   t  S rN   )r  rL   rL   rL   rM   getproxies_macosx_sysconfB
  s    r  c                 C   s    t  }|rt| |S t| S d S rN   )r  r  r  r{   r-  rL   rL   rM   r3  L
  s    
r3  c                   C   s   t  p
t S rN   )r  r  rL   rL   rL   rM   r5   Y
  s    r5   c               
   C   sB  i } zdd l }W n ty&   |  Y S 0 z||jd}||dd }|rt||dd }d|vr|d|vr|d|}|dD ]J}|dd\}}t	d	|s|d
v rd| }n|dkrd| }|| |< q| 
drtdd| d }| 
d p|| d< | 
dp|| d< |  W n tttfy<   Y n0 | S )Nr   ;Software\Microsoft\Windows\CurrentVersion\Internet SettingsProxyEnableZProxyServerr  rG  zhttp={0};https={0};ftp={0}rV   z(?:[^/:]+)://)r   r   r  r\  Zsockszsocks://z	^socks://z	socks4://r   r   )winregImportErrorOpenKeyHKEY_CURRENT_USERQueryValueExr   r   r_  rn  rY  r   rx   Closerr   rB   r   )r-  r  internetSettingsproxyEnableZproxyServerpr   addressrL   rL   rM   getproxies_registry^
  sL    



r  c                   C   s   t  p
t S rN   )r  r  rL   rL   rL   rM   r5   
  s    c                 C   sr  zdd l }W n ty    Y dS 0 z6||jd}||dd }t||dd }W n tyl   Y dS 0 |rv|szdS t| \}}|g} z t	|}||kr| 
| W n ty   Y n0 z t|}||kr| 
| W n ty   Y n0 |d}|D ]j}	|	dkr d|vr  dS |	dd	}	|	d
d}	|	dd}	| D ] }
t|	|
tjrH  dS qHqdS )Nr   r  r  ZProxyOverriderG  z<local>r  rV   z\.r  z.*?)r  r  r  r  r  r   rr   r   r   r  rb   getfqdnr_  r  rn  rY  rp  )r{   r  r  r  ZproxyOverrideZrawHostrJ  addrZfqdnrL  r   rL   rL   rM   proxy_bypass_registry
  s`    





r  c                 C   s    t  }|rt| |S t| S d S rN   )r  r  r  r  rL   rL   rM   r3  
  s    
)NNN)N)}r4  r   r  r  Zhttp.clientr   r  r[   	posixpathrn  r   r  r   r  r^   rX   r?   Zurllib.errorr   r   r   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   ra   r6   r7   ro  ASCIIrw   r|   r   r   r2   r   r/   r   r   r)  r   r    r!   r"   r#   r$   r%   urandomr  r&   r'   r(   r  r)   r   r   rE   rb   r   r.   r  r  r*   r  r+   r,   r-   rD  r`   Z
nturl2pathr4   r3   r"  r8   r9   rl  r  rm  rB  rn  rE  ro  rp  r   r  r  r  platformZ_scproxyr  r  r  r  r3  r5   r  r  rL   rL   rL   rM   <module>T   s   P
M
?m $q!+@
o v

+3:5!   @ W

_
%A

1	2
