o
    JAfώ                    @   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w 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>rsG 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r%d doltmuZumvZv dpdq Zwdrds Zxdtdu Zydvdw ZzdS ej`dTkr=dxdy Z{dzdw Zzd{d| Z|d}du ZydS 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|r:dd l }|dtd |d urtdts tdtjtjj||d}|	dg t
|d}t|}	n|rFt
|d}t|}	ntd u rPt  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<   zhttp/1.1)r>   )warningswarnDeprecationWarning
ValueError	_have_sslsslZcreate_default_contextZPurposeZSERVER_AUTHZset_alpn_protocolsHTTPSHandlerr2   _openeropen)
urldatatimeoutr;   r<   r=   r>   r?   Zhttps_handleropener rL   %/usr/lib/python3.10/urllib/request.pyr0      s4   2




r0   c                 C   s   | a d S N)rF   )rK   rL   rL   rM   r1      s   r1   c              	   C   sd  	 t | \}}tt| |}| }|dkr)|s)tj||fW  d    S |r1t|d}nt	j
dd}|j}t| |G ||f}	d}
d}d}d}d|v rXt|d	 }|r`|||
| 	 ||
}|sin|t|7 }|| |d7 }|r|||
| qaW d    n1 sw   Y  W d    n1 sw   Y  |dkr||k rtd||f |	|	S )NfilewbF)delete    r   content-lengthContent-LengthT   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      sX   	


&r6   c               	   C   sF   	 t D ]} zt|  W q ty   Y qw t d d = tr!d ad S 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   sp   || _ i | _i | _d | _|| _d | _| D ]
\}}| || q|d u r)t| }|| _	|| _
|r6|| _d S 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   Q  s   zRequest.full_urlc                 C   s(   t || _t| j\| _| _|   d S rN   )r   r   r   r   _parser   rH   rL   rL   rM   ru   W  s   
c                 C   s   d | _ d | _d| _d S Nrs   )r   r   selectorr   rL   rL   rM   ru   ^  s   
c                 C      | j S rN   )r~   r   rL   rL   rM   rI   d  s   zRequest.datac                 C   s0   || j kr|| _ | dr| d d S d S d S )NContent-length)r~   
has_headerremove_header)r   rI   rL   rL   rM   rI   h  s   

c                 C   s
   d | _ d S rN   )rI   r   rL   rL   rM   rI   r  s   
c                 C   sR   t | j\| _}| jd u rtd| j t|\| _| _| jr't| j| _d S d S )Nzunknown url type: %r)	r   r   typerB   ru   r   r{   r   r
   )r   restrL   rL   rM   r   v  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   r   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     zRequest.has_proxyc                 C      || j | < d S rN   )rj   
capitalizer   r   valrL   rL   rM   r        zRequest.add_headerc                 C   r   rN   )r}   r   r   rL   rL   rM   add_unredirected_header  r   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_itemsrN   )__name__
__module____qualname__r   propertyru   setterdeleterrI   r   r   r   r   r   r   r   r   rv   r   r   rL   rL   rL   rM   r   =  s8    





	

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   sP  t |dstdt| d}t|D ]}|dv rq|d}|d | }||d d  }|dr`|d| d }||d d  }zt|}W n	 tyR   Y nw | j	|i }	|	| j|< n|dkrj|}| j
}	n|d	krt|}| j}	n|d
kr~|}| j}	nq|	|g }
|
rt|
| n|
| d}q|rt| j| ||  d S 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  sP   



zOpenerDirector.add_handlerc                 C      d S rN   rL   r   rL   rL   rM   close     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||}||}q%t	
d|j|j|j|  | ||}	|d }| j|g D ]}t||}|||	}	qP|	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 |r=|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.errorrN   )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r|t t }|D ]!}| D ]}t|tr5t||r4|| q#t||r?|| q#q|D ]}|| qC|D ]}||  qM| D ]}t|trb| }|| qX|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   9  s:   






r2   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	r     c                 C   
   || _ d S rN   )parent)r   r   rL   rL   rM   r   `     
zBaseHandler.add_parentc                 C   r   rN   rL   r   rL   rL   rM   r   c  r   zBaseHandler.closec                 C   s   t |dsdS | j|jk S )Nhandler_orderT)r   r   )r   otherrL   rL   rM   __lt__g  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 s"n | jd|||||}|S )N   ,  r   )codemsgrZ   r   r   )r   rz   r   r   r   r   rL   rL   rM   http_responset  s   z HTTPErrorProcessor.http_responseN)r   r   r   r   r  https_responserL   rL   rL   rM   r/   p  s
    r/   c                   @      e Zd Zdd ZdS )r   c                 C   s   t |j||||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         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           	         sv   	 |  }|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   sH  d|v r	|d }nd|v r|d }nd S t |}|jdvr)t||d||f |||js7|jr7t|}d|d< t|}t|dtj	d}t
|j|}| ||||||}|d u rYd S t|d	r|j }	|_|	|d
| jkstt|	| jkrt|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 }| }n-|dstd|  d|v r,|d}|d|}n|dd}|dkr8d }|d| }t|\}}|d urOt|\}}	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&   


r3  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>#  r   z'ProxyHandler.__init__.<locals>.<lambda>)r5   proxiesr   ry   setattrr   )r   r7  r   rH   rL   rL   rM   r     s   
zProxyHandler.__init__c                 C   s   |j }t|\}}}}|d u r|}|jrt|jrd S |r;|r;dt|t|f }	t|	 d}
|	dd|
  t|}|
|| ||ksM|dkrOd S | jj||jdS )N%s:%sasciiProxy-authorizationBasic r   r  )r   r3  r{   proxy_bypassr
   base64	b64encodeencodedecoder   r   r   rG   rJ   )r   r   r,  r   Z	orig_typeZ
proxy_typer1  r2  r0  Z	user_passZcredsrL   rL   rM   r   &  s"   zProxyHandler.proxy_openrN   )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   D  r   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>N  s    
z/HTTPPasswordMgr.add_password.<locals>.<genexpr>)r   r   rB  tuple)r   realmr  r1  rB  reduced_urirL   rF  rM   add_passwordG  s   


zHTTPPasswordMgr.add_passwordc           	      C   s`   | j |i }dD ]$}| ||}| D ]\}}|D ]}| ||r+|      S qqq	dS )NrC  NN)rB  r   rD  r   	is_suburi)	r   rJ  authuriZdomainsrG  reduced_authuriZurisZauthinfor  rL   rL   rM   find_user_passwordR  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  rG  partsr  r-  r\   r{   portZdportrL   rL   rM   rD  \  s&   zHTTPPasswordMgr.reduce_uric                 C   sP   	 ||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   rN  s  s   zHTTPPasswordMgr.is_suburiN)T)r   r   r   r   rL  rQ  rD  rN  rL   rL   rL   rM   r    B  s    

r    c                   @   r  )r!   c                 C   s0   t | ||\}}|d ur||fS t | d |S rN   )r    rQ  )r   rJ  rO  r1  r2  rL   rL   rM   rQ    s   z2HTTPPasswordMgrWithDefaultRealm.find_user_passwordN)r   r   r   rQ  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_authenticatedrY  rL  )r   rJ  r  r1  rB  is_authenticatedr\  rL   rM   rL    s   z)HTTPPasswordMgrWithPriorAuth.add_passwordc                 C   s>   t |tr|g}dD ]}|D ]}| ||}|| j|< qq
d S NrC  )r   r   rD  rX  )r   r  r_  rG  rE  rK  rL   rL   rM   r^    s   
z1HTTPPasswordMgrWithPriorAuth.update_authenticatedc                 C   sD   dD ]}|  ||}| jD ]}| ||r| j|     S qqd S r`  )rD  rX  rN  )r   rO  rG  rP  r  rL   rL   rM   r_    s   
z-HTTPPasswordMgrWithPriorAuth.is_authenticated)F)r   r   r   r   rL  r^  r_  __classcell__rL   rL   r\  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    rB  rL  )r   Zpassword_mgrrL   rL   rM   r     s   z!AbstractBasicAuthHandler.__init__c                 c   sv    d}t j|D ]}| \}}}|dvrtdtd ||fV  d}q	|s9|r0| d }nd}|d fV  d S d S )NF)"'zBasic Auth Realm was unquoted   Tr   rs   )r#   rxfinditergroupsr?   r@   UserWarningsplit)r   headerZfound_challengemor  r	   rJ  rL   rL   rM   _parse_realm  s    
z%AbstractBasicAuthHandler._parse_realmc           	      C   s~   | |}|s	d S d }|D ]$}| |D ]\}}| dkr!|}q|d ur0| |||    S qq|d ur=td|f d S )NbasiczBAbstractBasicAuthHandler does not support the following scheme: %r)Zget_allrl  ry   retry_http_basic_authrB   )	r   authreqr{   r   rj   Zunsupportedrj  r  rJ  rL   rL   rM   http_error_auth_reqed  s$   
z.AbstractBasicAuthHandler.http_error_auth_reqedc                 C   sx   | j ||\}}|d ur:d||f }dt| d }|| jd |kr*d S || j| | j	j
||jdS d S )Nr9  r<  r:  r  )rB  rQ  r>  r?  r@  rA  rv   auth_headerr   r   rG   rJ   )r   r{   r   rJ  r1  pwrawauthrL   rL   rM   rn    s   z.AbstractBasicAuthHandler.retry_http_basic_authc                 C   st   t | jdr| j|js|S |ds8| jd |j\}}d|| }t	|
 }|dd|  |S )Nr_  Authorizationz{0}:{1}zBasic {})r   rB  r_  ru   r   rQ  r   r@  r>  Zstandard_b64encoderA  r   strip)r   r   r1  rB  ZcredentialsZauth_strrL   rL   rM   http_request   s   
z%AbstractBasicAuthHandler.http_requestc                 C   sN   t | jdr%d|j  krdk rn n
| j|jd |S | j|jd |S )Nr_  r   r   TF)r   rB  r   r^  ru   )r   r   r   rL   rL   rM   r    s   z&AbstractBasicAuthHandler.http_responserN   )r   r   r   recompileIre  r   rl  rp  rn  rw  r  https_requestr  rL   rL   rL   rM   r#     s    
r#   c                   @      e Zd ZdZdd ZdS )r$   ru  c                 C      |j }| d|||}|S )Nwww-authenticate)ru   rp  )r   r   ri   r   r   rj   rH   r   rL   rL   rM   http_error_401  s
   z#HTTPBasicAuthHandler.http_error_401N)r   r   r   rq  r  rL   rL   rL   rM   r$         r$   c                   @   r|  )r%   r;  c                 C   r}  Nproxy-authenticate)r{   rp  )r   r   ri   r   r   rj   r-  r   rL   rL   rM   http_error_407)  s
   z$ProxyBasicAuthHandler.http_error_407N)r   r   r   rq  r  rL   rL   rL   rM   r%   %  r  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    rB  rL  retriednonce_count
last_nonce)r   rB  rL   rL   rM   r   C  s   

z"AbstractDigestAuthHandler.__init__c                 C   
   d| _ d S r  )r  r   rL   rL   rM   reset_retry_countL  r   z+AbstractDigestAuthHandler.reset_retry_countc                 C   s~   | |d }| jdkrt|jdd|d |  jd7  _|r;| d }| dkr/| ||S | dkr=td| d S d S )	N   i  zdigest auth failedrV   r   digestrm  zEAbstractDigestAuthHandler does not support the following scheme: '%s')r   r  r   ru   ri  ry   retry_http_digest_authrB   )r   rq  r{   r   rj   ro  r  rL   rL   rM   rp  O  s    

z/AbstractDigestAuthHandler.http_error_auth_reqedc                 C   sz   | dd\}}ttd t|}| ||}|r;d| }|j| jd |kr)d S || j| | j	j
||jd}|S d S )Nr
  rV   z	Digest %sr  )ri  parse_keqv_listfilterparse_http_listget_authorizationrj   r   rq  r   r   rG   rJ   )r   r   rt  tokenZ	challengechalZauth_valZresprL   rL   rM   r  c  s   z0AbstractDigestAuthHandler.retry_http_digest_authc                 C   s@   d| j |t f }|dtd }t| }|d d S )Nz	%s:%s:%s:r:        )r  timectimer@  _randombyteshashlibsha1	hexdigest)r   noncesbdigrL   rL   rM   
get_cnonceo  s   z$AbstractDigestAuthHandler.get_cnoncec                 C   s  z|d }|d }| d}| dd}| dd }W n
 ty%   Y d S w | |\}}	|d u r3d S | j||j\}
}|
d u rCd S |jd urP| |j|}nd }d|
||f }d| |j	f }|d u rt|	||d|||f }n=d	|
d
v r|| jkr|  jd7  _nd| _|| _d| j }| |}d|||d	||f }|	|||}ntd| d|
|||j	|f }|r|d| 7 }|r|d| 7 }|d| 7 }|r|d||f 7 }|S )NrJ  r  qop	algorithmMD5opaquez%s:%s:%sr9  rt  ,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_implsrB  rQ  ru   rI   get_entity_digestr   r   ri  r  r  r  r   )r   r   r  rJ  r  r  r  r  HKDr1  rr  ZentdigZA1ZA2ZrespdigZncvalueZcnonceZnoncebitrU  rL   rL   rM   r  z  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      t | d S Nr:  )r  md5r@  r  xrL   rL   rM   r6        z?AbstractDigestAuthHandler.get_algorithm_impls.<locals>.<lambda>ZSHAc                 S   r  r  )r  r  r@  r  r  rL   rL   rM   r6    r  z.Unsupported digest authentication algorithm %rc                    s    d| |f S )Nr9  rL   )r  dr  rL   rM   r6    s    )rB   )r   r  r  rL   r  rM   r    s   

z-AbstractDigestAuthHandler.get_algorithm_implsc                 C   r   rN   rL   )r   rI   r  rL   rL   rM   r    r   z+AbstractDigestAuthHandler.get_entity_digestrN   )r   r   r   r   r  rp  r  r  r  r  r  rL   rL   rL   rM   r&   8  s    
	>r&   c                   @   s   e Zd Z	 dZdZdd ZdS )r'   ru    c                 C   s*   t |jd }| d|||}|   |S )NrV   r~  )r   ru   rp  r  r   r   ri   r   r   rj   r{   retryrL   rL   rM   r    s   z$HTTPDigestAuthHandler.http_error_401N)r   r   r   rq  r   r  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 r  )r{   rp  r  r  rL   rL   rM   r    s   z%ProxyDigestAuthHandler.http_error_407N)r   r   r   rq  r   r  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   r   rN   _debuglevel)r   
debuglevelrL   rL   rM   r     r   zAbstractHTTPHandler.__init__c                 C   r   rN   r  )r   levelrL   rL   rM   set_http_debuglevel  r   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rI|j}t|trd}t||ds'|dd |dsI|dsI| |}|d urC|dt| n|dd |}|	 r\t
|j\}}t|\}}	|dsg|d| | jjD ]\}
}|
 }
||
s~||
| qk|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_  sH   






zAbstractHTTPHandler.do_request_c           
   
      sB  	 |j }|s
td||fd|ji|}|| j t|j   fdd|j	 D  d d< dd  	 D  |j
rXi }d}| v rP | ||<  |= |j|j
|d	 z*z|j| |j|j |d
d W n ty| } zt|d }~ww | }	W n   |   |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  6  s    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errr5  rL   r  rM   r     sH   



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  rw  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   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  rL   rL   rM   
https_openn  s   zHTTPSHandler.https_open)r   NN)r   r   r   r   r  r  r  r{  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 u r|j }|| _d S r  )Zhttp.cookiejar	cookiejarZ	CookieJar)r   r  r   rL   rL   rM   r   w  s   

zHTTPCookieProcessor.__init__c                 C   s   | j | |S rN   )r  Zadd_cookie_headerr  rL   rL   rM   rw  }  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_responserN   )r   r   r   r   rw  r  r{  r  rL   rL   rL   rM   r   v  s    
r   c                   @   r  )r.   c                 C   s   |j }td| )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.     r  r.   c                 C   sP   	 i }| D ] }| dd\}}|d dkr!|d dkr!|dd }|||< q|S )N=rV   r   rb  rS   )ri  )lparsedeltr  r  rL   rL   rM   r    s   
r  c                 C   s   	 g }d}d }}| D ]5}|r||7 }d}q|r*|dkrd}q|dkr%d}||7 }q|dkr6| | d}q|dkr<d}||7 }q|rH| | dd |D S )	Nrs   F\Trb  r  c                 S   s   g | ]}|  qS rL   )rv  )r  partrL   rL   rM   
<listcomp>  r  z#parse_http_list.<locals>.<listcomp>)rb   )r  resr  escaper	   ZcurrL   rL   rM   r    s6   


r  c                   @   s(   e Zd Zdd ZdZdd Zdd ZdS )r*   c                 C   sZ   |j }|d d dkr(|dd dkr(|jr(|jdkr(|j|  vr&tdd S | |S )Nr:   r*  rd  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   sf   t jd u r0zttdd tt d  t _W t jS  tjy/   tdft _Y t jS w t jS )Nr  r:   )r*   namesrI  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|}zYt|}|j}|jj	|j
dd}	||d }
|d|
p1d||	f }|r?t|\}}|rK|sbt||  v rg|rTd| | }nd| }tt|d||W S W tdW td ty{ } zt|d }~ww )	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   rT  ZorigurlexprL   rL   rM   r    sB   
	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 w 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|\}}|r2t|\}}nd }t	|}|p;d}|p?d}zt
|}W n tyW } zt|d }~ww t|j\}	}
|	d}ttt	|}|d d |d }}|r|d s|dd  }z_| ||||||j}|rdpd}|
D ]}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 }~ww )Nr   ftp error: no host givenrs   r  rS   rV   rz  Dr   aAr   rz  r  r  zContent-type: %s
zContent-length: %d
)ftplibr  r{   r   r   FTP_PORTrc   r   r   r
   r   r  rr   r   r   ri  r   mapconnect_ftprJ   r   ry   upperretrfiler  ru   r  r  r   
all_errors)r   r   r  r  r{   rT  r1  rB  r   r\   attrsdirsrO   fwr   attrr   ri   retrlenrj   r  r  rL   rL   rM   ftp_open  sd   


zFTPHandler.ftp_openc              	   C   s   t ||||||ddS )NF)
persistent)
ftpwrapper)r   r1  rB  r{   rT  r  rJ   rL   rL   rM   r  0  s   zFTPHandler.connect_ftpN)r   r   r   r
  r  rL   rL   rL   rM   r+     s    4r+   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   7  s
   
zCacheFTPHandler.__init__c                 C   r   rN   )r  )r   trL   rL   rM   
setTimeout>  r   zCacheFTPHandler.setTimeoutc                 C   r   rN   )r  )r   r  rL   rL   rM   setMaxConnsA  r   zCacheFTPHandler.setMaxConnsc                 C   sr   |||d ||f}|| jv rt | j | j|< nt||||||| j|< t | j | j|< |   | j| S )Nr  )joinr  r  r  rJ   r  check_cache)r   r1  rB  r{   rT  r  rJ   r   rL   rL   rM   r  D  s   



zCacheFTPHandler.connect_ftpc                 C   s   t   }| j|kr(t| j D ]\}}||k r'| j|   | j|= | j|= qtt| j | _t	| j| j
krat| j D ]\}}|| jkrT| j|= | j|=  nqAtt| j | _d S d S rN   )r  r  r   rJ   r   r  r   minvaluesre   r  )r   r  r  r  rL   rL   rM   r  O  s$   

zCacheFTPHandler.check_cachec                 C   s0   | j  D ]}|  q| j   | j  d S rN   )r  r  r   clearrJ   )r   connrL   rL   rM   clear_cachec  s   

zCacheFTPHandler.clear_cacheN)	r   r   r   r   r  r  r  r  r  rL   rL   rL   rM   r,   4  s    r,   c                   @   r  )r-   c                 C   s~   |j }|dd\}}|dd\}}t|}|dr't|}|d d }|s+d}td|t|f }t	t
|||S )N:rV   r  z;base64itext/plain;charset=US-ASCIIz$Content-type: %s
Content-length: %d
)ru   ri  r   endswithr>  decodebytesr  r  re   r   ioBytesIO)r   r   rH   r  rI   Z	mediatyperj   rL   rL   rM   	data_openj  s   



zDataHandler.data_openN)r   r   r   r"  rL   rL   rL   rM   r-   i  r  r-   r  nt)r4   r3   c                 C   
   	 t | S rN   )r
   pathnamerL   rL   rM   r4        r4   c                 C   r$  rN   )r	   r%  rL   rL   rM   r3     r'  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rQdd Zd)dd Zd!d" Zd#d$ Zd%d& Zd)d'd(ZdS )+r8   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classrd  )
stacklevelkey_file	cert_filez
User-Agent)ZAcceptz*/*)r]  r   r?   r@   rA   r5   r7  r   r*  r+  versionr   _URLopener__tempfilesr[   rq   _URLopener__unlink	tempcacheftpcache)r   r7  Zx509r   rL   rL   rM   r     s   

zURLopener.__init__c                 C      |    d S rN   )r   r   rL   rL   rM   __del__  r   zURLopener.__del__c                 C   r1  rN   )cleanupr   rL   rL   rM   r     r   zURLopener.closec              	   C   sV   | j r| j D ]}z| | W q ty   Y qw | j d d = | jr)| j  d S d S rN   )r-  r.  rr   r/  r  )r   rO   rL   rL   rM   r3    s   
zURLopener.cleanupc                 G   s   	 | j | d S rN   )r   rb   )r   r   rL   rL   rM   	addheader  s   zURLopener.addheaderc              
   C   sT  	 t t|}t|dd}| jr'|| jv r'| j| \}}t|d}t|||S t|\}}|s1d}|| jv rL| j| }t|\}}	t|	\}
}|
|f}nd }d| }|| _	|
dd}t| |rd|dkrs|rm| |||S | ||S z|d u rt| ||W S t| |||W S  ttfy     ty } ztd	|t d
 d }~ww )Nz%/:=&?~#+!$,;'@()*[]|r  r  rO   Zopen_-r   r  zsocket errorr:   )r   r   r	   r/  rG   r   r   r7  r   r   r  r   open_unknown_proxyopen_unknownr   r   r   rr   with_tracebackr   exc_info)r   r   rI   rg   rj   ri   urltyperH   r,  	proxyhostr{   r   r`   r   rL   rL   rM   rG     sB   



zURLopener.openc                 C   s   	 t |\}}tdd|)N	url errorzunknown url typer   rr   )r   r   rI   r   rH   rL   rL   rM   r8    s   zURLopener.open_unknownc                 C   s   	 t |\}}tdd| |)Nr=  zinvalid proxy for %sr>  )r   r,  r   rI   r   rH   rL   rL   rM   r7    s   zURLopener.open_unknown_proxyc                 C   s  	 t t|}| jr|| jv r| j| S t|\}}|d u rF|r$|dkrFz| |}| }|  tt|d |fW S  t	yE   Y nw | 
||}z| }	|rYt
|d}
n9t|\}}t|pcd\}}t|pkd\}}t|psd\}}tj|d }t|\}}| j| t|d}
zO||	f}| jd ur|| j|< d}d}d}d}d|	v rt|	d	 }|r|||| 	 ||}|sn|t|7 }|
| |d7 }|r|||| qW |
  n|
  w W |  n|  w |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  sx   





zURLopener.retrievec                 C   s
  	 d }d }t |trt|\}}|rt|\}}t|}|}n:|\}}t|\}}t|\}	}
|
}d }|	 dkr<d }nt|
\}}
|rJt|\}}|rSd|	||
f }t|rY|}|s`tdd|rqt|}t	
| d}nd }|rt|}t	
| d}nd }||}i }|rd| |d< |rd| |d< |r||d	< d
|d< | jD ]\}}|||< q|d urd|d< |d||| n|jd||d z| }W n tjjy   tdw d|j  krdk rn nt||jd| |jS | ||j|j|j|j|S )Nr   z	%s://%s%sz
http errorr  r:  zBasic %sr  ru  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   r=  rr   r>  r?  r@  rA  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_authrt  Z	http_connrj   rj  r   r   rL   rL   rM   _open_generic_httpO  sx   

zURLopener._open_generic_httpc                 C   s   	 |  tjj||S rN   )rH  r   r   r  r   rH   rI   rL   rL   rM   	open_http     zURLopener.open_httpc           
      C   sd   	 d| }t | |r)t| |}|d u r||||||}	n	|||||||}	|	r)|	S | |||||S )Nzhttp_error_%d)r   r   r   )
r   rH   ri   errcodeerrmsgrj   rI   r`   r   rl   rL   rL   rM   rG    s   

zURLopener.http_errorc                 C   s   	 |   t||||d rN   )r   r   r   rH   ri   rL  rM  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   )rH  rO  rI  rL   rL   rM   
open_https  s   zURLopener.open_httpsc                 C   sZ   	 t |ts
td|d d dkr(|dd dkr(|dd  dkr(td| |S )	NzEfile error: proxy support for file protocol currently not implementedr:   r*  rd  r     z
localhost/r  )r   r   r   ry   rB   r  r   rL   rL   rM   	open_file  s   
4
zURLopener.open_filec              
   C   sH  	 dd l }dd l}t|\}}t|}zt|}W n ty- } zt|j|j	d }~ww |j
}	|jj|jdd}
||d }|d|pGd|	|
f }|sf|}|d d dkr]d| }tt|d	||S t|\}}|st|t ft  v r|}|d d dkrd| }n|d d
 dkrtd| tt|d	||S td)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urlfilerT  rL   rL   rM   r    sD   
zURLopener.open_local_filec              
   C   sj  	 t |ts
tddd l}t|\}}|stdt|\}}t|\}}|r/t|\}}nd }t|}t|p9d}t|p?d}t	
|}|sPdd l}|j}nt|}t|\}}	t|}|d}
|
d d |
d }
}|
rz|
d sz|
dd  }
|
r|
d sd|
d< |||d|
f}t| jtkrt| jD ]}||kr| j| }| j|= |  qzl|| jvrt|||||
| j|< |sd}nd	}|	D ]}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 y4 } ztd|  t!" d d }~ww )NzCftp error: proxy support for ftp protocol currently not implementedr   r  rs   r  rS   rV   r  rz  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   ri  r  re   r0  MAXFTPCACHEr   r   r  r   ry   r  r  r  r  r  r   	ftperrorsr9  r   r:  )r   rH   r  r{   r\   rT  r1  rB  r  r  r  rO   r   r  r  r   r  r   ri   r	  r  rj   r  rL   rL   rM   open_ftp  sr   






zURLopener.open_ftpc           	   
   C   s8  	 t |ts
tdz
|dd\}}W n ty    tddw |s%d}|d}|dkrEd	||d  vrE||d d  }|d | }nd
}g }|dt	dt
t   |d|  |dkrpt|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: %sr>  r:  zlatin-1zContent-Length: %d
)r   r   r   ri  rB   rr   rfindrb   r  strftimegmtimer>  r  r@  rA  r
   re   r  r  r  r   StringIOr   )	r   rH   rI   r   Zsemir  r   rj   frL   rL   rM   	open_data1  s<   







zURLopener.open_datarN   NNN)r   r   r   r-  r   r,  r   r2  r   r3  r4  rG   r8  r7  rD  rH  rJ  rG  r   rC   rO  rP  rR  r  rX  r`  rL   rL   rL   rM   r8     s0    


$

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maxtriesrZ  rL   rL   rM   r   ^  s   
zFancyURLopener.__init__c                 C   s   	 t ||d| |S )NrE  )r   rN  rL   rL   rM   r   d  rK  z!FancyURLopener.http_error_defaultNc           	      C   s|   	 |  j d7  _ z1| jr*| j | jkr*t| dr| j}n| j}|||dd|W d| _ S | ||||||}|W d| _ S d| _ w )NrV   http_error_500r   z)Internal Server Error: Redirect Recursionr   )rc  rd  r   re  r   redirect_internal)	r   rH   ri   rL  rM  rj   rI   r   rl   rL   rL   rM   r&  h  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r7t|||d|  ||| |S )Nr  r  r  r  z( Redirection to url '%s' is not allowed.)r   r   r   r   r  r   rG   )	r   rH   ri   rL  rM  rj   rI   r  r$  rL   rL   rM   rf  z  s    



z FancyURLopener.redirect_internalc                 C      	 |  ||||||S rN   r&  r   rH   ri   rL  rM  rj   rI   rL   rL   rM   r'       zFancyURLopener.http_error_301c                 C   rg  rN   rh  ri  rL   rL   rM   r(    rj  zFancyURLopener.http_error_303c                 C   s0   	 |d u r|  ||||||S | |||||S rN   )r&  r   ri  rL   rL   rM   r)    s   zFancyURLopener.http_error_307Fc                 C      	 d|vrt | ||||| |d }td|}	|	s%t | ||||| |	 \}
}|
 dkr;t | ||||| |sGt | ||||| d| j d }|d u rZt| |||S t| ||||S )Nr~  ![ 	]*([^ 	]+)[ 	]+realm="([^"]*)"rm  Zretry__basic_authr8   r   rx  matchrg  ry   r   r   r   rH   ri   rL  rM  rj   rI   r  stuffro  r  rJ  r`   rL   rL   rM   r    0   


zFancyURLopener.http_error_401c                 C   rk  )Nr  rl  rm  Zretry_proxy_rm  rn  rp  rL   rL   rM   r    rr  zFancyURLopener.http_error_407c                 C      t |\}}d| | }| jd }t|\}}	t |	\}	}
|	dd }|	|d  }	| |	||\}}|s9|s9d S dt|ddt|dd|	f }	d|	 |
 | jd< |d u rZ| |S | ||S )Nhttp://r   r+  rV   %s:%s@%srs   r5  r   r7  r   r   get_user_passwdr	   rG   r   rH   rJ  rI   r{   r   r  r,  r;  r<  Zproxyselectorr   r1  rB  rL   rL   rM   retry_proxy_http_basic_auth      

z*FancyURLopener.retry_proxy_http_basic_authc                 C   rs  )Nhttps://r   r+  rV   ru  rs   r5  rv  rx  rL   rL   rM   retry_proxy_https_basic_auth  rz  z+FancyURLopener.retry_proxy_https_basic_authc           
      C      t |\}}|dd }||d  }| |||\}}|s"|s"d S dt|ddt|dd|f }d| | }	|d u r@| |	S | |	|S )Nr+  rV   ru  rs   r5  rt  r   r   rw  r	   rG   
r   rH   rJ  rI   r{   r   r   r1  rB  r  rL   rL   rM   rn       
z$FancyURLopener.retry_http_basic_authc           
      C   r}  )Nr+  rV   ru  rs   r5  r{  r~  r  rL   rL   rM   retry_https_basic_auth		  r  z%FancyURLopener.retry_https_basic_authr   c                 C   s`   |d |   }|| jv r|r| j|= n| j| S | ||\}}|s%|r,||f| j|< ||fS )Nr+  )ry   rb  prompt_user_passwd)r   r{   rJ  r  r   r1  rB  rL   rL   rM   rw  	  s   


zFancyURLopener.get_user_passwdc                 C   sT   	 dd l }ztd||f }| d|||f }||fW S  ty)   t  Y dS w )Nr   zEnter username for %s at %s: z#Enter password for %s in %s at %s: rM  )getpassinputKeyboardInterruptprint)r   r{   rJ  r  r1  rB  rL   rL   rM   r  "	  s   
z!FancyURLopener.prompt_user_passwdrN   )NFr  )r   r   r   r   r   r&  rf  r'  r(  r)  r  r  ry  r|  rn  r  rw  r  rL   rL   rL   rM   r9   [  s*    










r9   c                   C      	 t d u r
tda t S )Nr  )
_localhostr   r  rL   rL   rL   rM   r  2	     
r  c                   C   sT   	 t d u r(zttt d a W t S  tjy'   ttdd a Y t S w t S )Nr:   r  )	_thishostrI  r   r  r  r  rL   rL   rL   rM   rT  :	  s   rT  c                  C   s   	 t d u rdd l} | ja t S r  )
_ftperrorsr  r  )r  rL   rL   rM   rW  E	  s
   rW  c                   C   r  r   )
_noheadersr  r  rL   rL   rL   rM   	noheadersN	  r  r  c                   @   sL   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   sP   || _ || _|| _|| _|| _|| _d| _|| _z|   W d S    | 	   r  )
r1  rB  r{   rT  r  rJ   refcount	keepaliveinitr   )r   r1  rB  r{   rT  r  rJ   r  rL   rL   rM   r   [	  s   zftpwrapper.__init__c                 C   s\   dd l }d| _| | _| j| j| j| j | j| j	| j
 d| j}| j| d S )Nr   r  )r  busyZFTPr  connectr{   rT  rJ   Zloginr1  rB  r  r  cwd)r   r  _targetrL   rL   rM   r  k	  s   
zftpwrapper.initc              
   C   s  dd l }|   |dv rd}d}nd| }d}z| j| W n |jy3   |   | j| Y nw d }|rs|sszd| }| j|\}}W n* |jyr } zt|d d dkrht	d	| 
t d
 W Y d }~nd }~ww |s| jd |r| j }	z%z| j| W n |jy } zt	d	| |d }~ww W | j|	 n| j|	 w d| }nd}| j|\}}d| _t|d| j}
|  jd7  _|  |
|fS )Nr   )r  r  zTYPE ArV   zTYPE zRETR rd  Z550zftp error: %rr:   zLIST LISTr  )r  endtransferr  Zvoidcmdr  r  ZntransfercmdZ
error_permr   r   r9  r   r:  pwdr  r  r   makefile
file_closer  r   )r   rO   r   r  cmdisdirr  r	  r  r  ZftpobjrL   rL   rM   r  t	  sX   


zftpwrapper.retrfilec                 C   r  r  )r  r   rL   rL   rM   r  	  r   zftpwrapper.endtransferc                 C   s    d| _ | jdkr|   d S d S )NFr   )r  r  
real_closer   rL   rL   rM   r   	  s   
zftpwrapper.closec                 C   s:   |    |  jd8  _| jdkr| js|   d S d S d S )NrV   r   )r  r  r  r  r   rL   rL   rM   r  	  s
   zftpwrapper.file_closec                 C   s0   |    z| j  W d S  t y   Y d S w rN   )r  r  r   rW  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  X	  s    
	-r  c                  C   s   	 i } g }t j D ]3}t|dkr=|d dkr=|dd   dkr=t j| }|d d  }||||f |r=|| |< q
dt jv rI| dd  |D ]\}}}|dd  dkre|r_|| |< qK| |d  qK| S )	Nr  ir   r,  ZREQUEST_METHODr   _proxy)r[   environkeysre   ry   rb   r   )r7  Zenvironmentr`   r   Z
proxy_namerL   rL   rM   getproxies_environment	  s(   ,


r  c                 C   s   	 |d u rt  }z|d }W n
 ty   Y dS w |dkrdS |  } t| \}}|dD ]-}| }|r[|d}| }||ksG| |krJ dS d| }||sX| |r[ dS q.dS )NnoF*Tr  .)r  r  ry   r   ri  rv  lstripr  )r{   r7  Zno_proxyhostonlyrT  r`   rL   rL   rM   proxy_bypass_environment	  s0   
r  c              	   C   s(  	 ddl m } t| \}}dd }d| vr|d rdS d }|dd	D ]n}|s(q#td
|}|d ur|d u rKzt|}||}W n	 tyJ   Y q#w ||d}	|d}
|
d u rhd|d	dd  }
nt
|
dd  }
|
dk sx|
dkryq#d|
 }
||
? |	|
? kr dS q#|| |r dS q#dS )Nr   )fnmatchc                 S   sd   |  d}ttt|}t|dkr|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  rd  )ri  r   r   rc   re   )ZipAddrrS  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   rx  ro  r   r  rr   groupcountrc   )r{   proxy_settingsr  r  rT  r  ZhostIPr   r  rU  maskrL   rL   rM   _proxy_bypass_macosx_sysconf
  sD   


r  darwin)_get_proxy_settings_get_proxiesc                 C   s   t  }t| |S rN   )r  r  )r{   r  rL   rL   rM   proxy_bypass_macosx_sysconfE
  s   
r  c                   C   s   	 t  S rN   )r  rL   rL   rL   rM   getproxies_macosx_sysconfI
  s   r  c                 C      	 t  }|rt| |S t| S rN   )r  r  r  r{   r7  rL   rL   rM   r=  S
  
   
r=  c                   C   s   t  pt S rN   )r  r  rL   rL   rL   rM   r5   `
  r   r5   c               
   C   s:  	 i } zdd l }W n ty   |  Y S w zz||jd}||dd }|rt||dd }d|vr>d|vr>d|}|dD ]%}|dd\}}t	d	|sd|d
v r\d| }n|dkrdd| }|| |< qC| 
drtdd| d }| 
dp}|| d< | 
dp|| d< |  W | S  tttfy   Y | S w )Nr   ;Software\Microsoft\Windows\CurrentVersion\Internet SettingsProxyEnableZProxyServerr  rY  zhttp={0};https={0};ftp={0}rV   z(?:[^/:]+)://)r   r   r  rt  Zsockszsocks://z	^socks://z	socks4://r   r   )winregImportErrorOpenKeyHKEY_CURRENT_USERQueryValueExr   r   ri  rx  ro  r   rx   Closerr   rB   r   )r7  r  internetSettingsproxyEnableZproxyServerpr   addressrL   rL   rM   getproxies_registrye
  sT   




r  c                   C   s   	 t  pt S rN   )r  r  rL   rL   rL   rM   r5   
  s   c                 C   sh  zdd l }W n
 ty   Y dS w z||jd}||dd }t||dd }W n
 ty6   Y dS w |r;|s=dS t| \}}|g} zt	|}||krU| 
| W n	 ty_   Y nw zt|}||kro| 
| W n	 tyy   Y nw |d}|D ]0}	|	dkrd|vr dS |	dd	}	|	d
d}	|	dd}	| D ]}
t|	|
tjr  dS qqdS )Nr   r  r  ZProxyOverriderY  z<local>r  rV   z\.r  z.*?)r  r  r  r  r  r   rr   r   r   r  rb   getfqdnri  r  rx  ro  rz  )r{   r  r  r  ZproxyOverrideZrawHostrT  addrZfqdnrV  r   rL   rL   rM   proxy_bypass_registry
  sp   





r  c                 C   r  rN   )r  r  r  r  rL   rL   rM   r=  
  r  ra  rN   )}r>  r   r  r  Zhttp.clientr   r   r[   	posixpathrx  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   ry  ASCIIrw   r|   r   r   r2   r   r/   r   r   r3  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-   rV  r`   Z
nturl2pathr4   r3   r0  r8   r9   r  r  r  rT  r  rW  r  r  r  r  r  r  platformZ_scproxyr  r  r  r  r=  r5   r  r  rL   rL   rL   rM   <module>   s    SPO
?m $q!+@
o v

+395!   @ W

_
%%A
1	2