<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
3
2a~             )   @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZmZmZ d dlmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( d dl)m*Z*m+Z+ yd dl,Z,W n e-k
r"   dZ.Y nX dZ.ddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'g!Z/d(ej0dd)  Z1da2de
j3fddddd*d+dZ4d,d Z5g Z6d}d-d$Z7d.d% Z8e	j9d/e	j:Z;d0d1 Z<G d2d dZ=G d3d dZ>d4d  Z?G d5d	 d	Z@G d6d de@ZAG d7d
 d
e@ZBG d8d de@ZCd9d: ZDG d;d de@ZEG d<d dZFG d=d deFZGG d>d deGZHG d?d dZIG d@d deIe@ZJG dAd deIe@ZKejLZMG dBd dZNG dCd de@eNZOG dDd de@eNZPG dEdF dFe@ZQG dGd deQZReSejTdHr.G dIdJ dJeQZUe/jVdJ G dKd de@ZWG dLd de@ZXdMdN ZYdOdP ZZG dQd de@Z[dRdS Z\G dTd de@Z]G dUd de]Z^G dVd de@Z_dWZ`ejadXkrd dYlbmcZcmdZd ndZd" Zcd[d! Zdi ZeG d\d& d&ZfG d]d' d'efZgdahd^d_ Zidajd`da Zkdaldbdc Zmdanddde ZoG dfdg dgZpdhdi Zqd~djdkZrdldm Zsejtdnkrd dolumvZvmwZw dpdq Zxdrds Zydtdu Zzdvd# Z{n6ejadXkrdwdx Z|dyd# Z{dzd{ Z}d|du ZzneqZ{erZzdS )    N)URLError	HTTPErrorContentTooShortError)urlparseurlspliturljoinunwrapquoteunquote	splittype	splithost	splitport	splitusersplitpasswd	splitattr
splitquery
splitvaluesplittagto_bytesunquote_to_bytes
urlunparse)
addinfourladdclosehookFTRequestOpenerDirectorBaseHandlerHTTPDefaultErrorHandlerHTTPRedirectHandlerHTTPCookieProcessorProxyHandlerHTTPPasswordMgrHTTPPasswordMgrWithDefaultRealmHTTPPasswordMgrWithPriorAuthAbstractBasicAuthHandlerHTTPBasicAuthHandlerProxyBasicAuthHandlerAbstractDigestAuthHandlerHTTPDigestAuthHandlerProxyDigestAuthHandlerHTTPHandlerFileHandler
FTPHandlerCacheFTPHandlerDataHandlerUnknownHandlerHTTPErrorProcessorurlopeninstall_openerbuild_openerpathname2urlurl2pathname
getproxiesurlretrieve
urlcleanup	URLopenerFancyURLopenerz%d.%d   )cafilecapath	cadefaultcontextc      
      C   s   |s|s|rfdd l }|jdtd |d k	r2tdts>tdtjtjj||d}t	|d}t
|}	n0|r~t	|d}t
|}	ntd krt
  a}	nt}	|	j| ||S )Nr   zJcafile, capath and cadefault are deprecated, use a custom context instead.r:   zDYou can't pass both context and any of cafile, capath, and cadefaultzSSL support not available)r;   r<   )r>   )warningswarnDeprecationWarning
ValueError	_have_sslsslZcreate_default_contextZPurposeZSERVER_AUTHHTTPSHandlerr2   _openeropen)
urldatatimeoutr;   r<   r=   r>   r?   Zhttps_handleropener rL   ,/opt/alt/python36/lib64/python3.6/request.pyr0      s*    <




c             C   s   | a d S )N)rF   )rK   rL   rL   rM   r1      s    c             C   s4  t | \}}tjt| |}|j }|dkrD| rDtjj||fS |rTt|d}nt	j
dd}|j}tj| | ||f}	d}
d}d}d}d	|krt|d
 }|r|||
| xB|j|
}|sP |t|7 }|j| |d7 }|r|||
| qW W d Q R X W d Q R X |dkr0||k r0td||f |	|	S )NfilewbF)deletei         r   zcontent-lengthzContent-Lengthz1retrieval incomplete: got only %i out of %i bytesi    )r   
contextlibclosingr0   infoospathnormpathrG   tempfileZNamedTemporaryFilename_url_tempfilesappendintreadlenwriter   )rH   filename
reporthookrI   Zurl_typerX   fpheaderstfpresultbssizer_   blocknumblockrL   rL   rM   r6      sD    


$c              C   sH   x0t D ](} ytj|  W q tk
r,   Y qX qW t d d = trDd ad S )N)r\   rW   unlinkOSErrorrF   )Z	temp_filerL   rL   rM   r7   %  s    


z:\d+$c             C   s<   | j }t|d }|dkr&| jdd}tjd|d}|j S )NrR    Host)full_urlr   
get_header_cut_port_resublower)requestrH   hostrL   rL   rM   request_host4  s    rw   c               @   s   e Zd Zdi dddfddZedd Zejdd Zejdd Zed	d
 Zejdd
 Zejdd
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zd#ddZdd  Zd!d" ZdS )$r   NFc       	      C   sp   || _ i | _i | _d | _|| _d | _x |j D ]\}}| j|| q.W |d krVt| }|| _	|| _
|rl|| _d S )N)rp   re   unredirected_hdrs_datarI   _tunnel_hostitems
add_headerrw   origin_req_hostunverifiablemethod)	selfrH   rI   re   r}   r~   r   keyvaluerL   rL   rM   __init__F  s    zRequest.__init__c             C   s   | j rdj| j| j S | jS )Nz{}#{})fragmentformat	_full_url)r   rL   rL   rM   rp   X  s    zRequest.full_urlc             C   s(   t || _t| j\| _| _| j  d S )N)r   r   r   r   _parse)r   rH   rL   rL   rM   rp   ^  s    
c             C   s   d | _ d | _d| _d S )Nrn   )r   r   selector)r   rL   rL   rM   rp   e  s    c             C   s   | j S )N)ry   )r   rL   rL   rM   rI   k  s    zRequest.datac             C   s(   || j kr$|| _ | jdr$| jd d S )NzContent-length)ry   
has_headerremove_header)r   rI   rL   rL   rM   rI   o  s    

c             C   s
   d | _ d S )N)rI   )r   rL   rL   rM   rI   y  s    c             C   sN   t | j\| _}| jd kr(td| j t|\| _| _| jrJt| j| _d S )Nzunknown url type: %r)	r   r   typerB   rp   r   rv   r   r
   )r   restrL   rL   rM   r   }  s    
zRequest._parsec             C   s   | j d k	rdnd}t| d|S )NPOSTGETr   )rI   getattr)r   Zdefault_methodrL   rL   rM   
get_method  s    zRequest.get_methodc             C   s   | j S )N)rp   )r   rL   rL   rM   get_full_url  s    zRequest.get_full_urlc             C   s4   | j dkr| j r| j| _n|| _ | j| _|| _d S )Nhttps)r   rz   rv   rp   r   )r   rv   r   rL   rL   rM   	set_proxy  s
    
zRequest.set_proxyc             C   s   | j | jkS )N)r   rp   )r   rL   rL   rM   	has_proxy  s    zRequest.has_proxyc             C   s   || j |j < d S )N)re   
capitalize)r   r   valrL   rL   rM   r|     s    zRequest.add_headerc             C   s   || j |j < d S )N)rx   r   )r   r   r   rL   rL   rM   add_unredirected_header  s    zRequest.add_unredirected_headerc             C   s   || j kp|| jkS )N)re   rx   )r   header_namerL   rL   rM   r     s    
zRequest.has_headerc             C   s   | j j|| jj||S )N)re   getrx   )r   r   defaultrL   rL   rM   rq     s    zRequest.get_headerc             C   s    | j j|d  | jj|d  d S )N)re   poprx   )r   r   rL   rL   rM   r     s    zRequest.remove_headerc             C   s"   | j j }|j| j t|j S )N)rx   copyupdatere   listr{   )r   hdrsrL   rL   rM   header_items  s    
zRequest.header_items)N)__name__
__module____qualname__r   propertyrp   setterdeleterrI   r   r   r   r   r   r|   r   r   rq   r   r   rL   rL   rL   rM   r   D  s(   

c               @   sN   e Zd Zdd Zdd Zdd Zdd Zd	ejfd
dZ	dddZ
dd Zd	S )r   c             C   s6   dt  }d|fg| _g | _i | _i | _i | _i | _d S )NzPython-urllib/%sz
User-agent)__version__
addheadershandlershandle_openhandle_errorprocess_responseprocess_request)r   Zclient_versionrL   rL   rM   r     s    zOpenerDirector.__init__c             C   sZ  t |dstdt| d}xt|D ]}|dkr:q*|jd}|d | }||d d  }|jd	r|jd| d }||d d  }yt|}W n tk
r   Y nX | jj	|i }	|	| j|< n>|d
kr|}| j
}	n*|dkr|}| j}	n|dkr*|}| j}	nq*|	j|g }
|
r&tj|
| n
|
j| d}q*W |rVtj| j| |j|  d S )N
add_parentz%expected BaseHandler instance, got %rFredirect_requestdo_open
proxy_open_rR   errorrG   responseru   T)r   r   r   )hasattr	TypeErrorr   dirfind
startswithr^   rB   r   r   r   r   r   
setdefaultbisectZinsortr]   r   r   )r   handlerZaddedmethiprotocolZ	conditionjkindlookupr   rL   rL   rM   add_handler  sJ    



zOpenerDirector.add_handlerc             C   s   d S )NrL   )r   rL   rL   rM   close  s    zOpenerDirector.closec       	      G   s<   |j |f }x*|D ]"}t||}|| }|d k	r|S qW d S )N)r   r   )	r   chainr   	meth_nameargsr   r   funcrg   rL   rL   rM   _call_chain  s    

zOpenerDirector._call_chainNc       
      C   s   t |trt||}n|}|d k	r(||_||_|j}|d }x(| jj|g D ]}t||}||}qLW | j	||}	|d }x*| j
j|g D ]}t||}|||	}	qW |	S )NZ_requestZ	_response)
isinstancestrr   rI   rJ   r   r   r   r   _openr   )
r   fullurlrI   rJ   reqr   r   Z	processorr   r   rL   rL   rM   rG     s"    


zOpenerDirector.openc             C   sP   | j | jdd|}|r|S |j}| j | j||d |}|r>|S | j | jdd|S )Nr   Zdefault_openr   unknownunknown_open)r   r   r   )r   r   rI   rg   r   rL   rL   rM   r     s    


zOpenerDirector._openc             G   s~   |d
kr,| j d }|d }d| }d}|}n| j }|d }d}|||f| }| j| }|r^|S |rz|dd	f| }| j| S d S )Nhttpr   r:   zhttp_error_%srR   _errorr   r   http_error_default)r   r   )r   r   )r   protor   dictr   Zhttp_errZ	orig_argsrg   rL   rL   rM   r   '  s     

zOpenerDirector.error)N)r   r   r   r   r   r   r   socket_GLOBAL_DEFAULT_TIMEOUTrG   r   r   rL   rL   rL   rM   r     s   /
c           	   G   s   t  }ttttttttt	g	}t
tjdr2|jt t }xN|D ]F}x@| D ]8}t|trlt||r|j| qHt||rH|j| qHW q>W x|D ]}|j| qW x|D ]}|j|  qW x&| D ]}t|tr| }|j| qW |S )NHTTPSConnection)r   r   r.   r)   r   r   r+   r*   r/   r-   r   r   clientr]   rE   setr   r   
issubclassaddremover   )r   rK   Zdefault_classesskipklassZcheckhrL   rL   rM   r2   @  s0    	









c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	r   i  c             C   s
   || _ d S )N)parent)r   r   rL   rL   rM   r   g  s    zBaseHandler.add_parentc             C   s   d S )NrL   )r   rL   rL   rM   r   j  s    zBaseHandler.closec             C   s   t |dsdS | j|jk S )Nhandler_orderT)r   r   )r   otherrL   rL   rM   __lt__n  s    
zBaseHandler.__lt__N)r   r   r   r   r   r   r   rL   rL   rL   rM   r   d  s   c               @   s   e Zd ZdZdd ZeZdS )r/   i  c             C   sJ   |j |j|j   }}}d|  ko*dk n  sF| jjd|||||}|S )N   i,  r   )codemsgrV   r   r   )r   ru   r   r   r   r   rL   rL   rM   http_response{  s
    z HTTPErrorProcessor.http_responseN)r   r   r   r   r   https_responserL   rL   rL   rM   r/   w  s   c               @   s   e Zd Zdd ZdS )r   c             C   s   t |j||||d S )N)r   rp   )r   r   rd   r   r   r   rL   rL   rM   r     s    z*HTTPDefaultErrorHandler.http_error_defaultN)r   r   r   r   rL   rL   rL   rM   r     s   c               @   s4   e Zd ZdZdZdd Zdd Ze Z ZZ	dZ
dS )	r      
   c       	         sx   |j  }|dkr|dkp&|dko&|dks:t|j|||||jdd	}d t fdd|jj D }t|||jddS )N-  .  /  3  r   HEADr    z%20content-lengthcontent-typec             3   s&   | ]\}}|j   kr||fV  qd S )N)rt   ).0kv)CONTENT_HEADERSrL   rM   	<genexpr>  s    z7HTTPRedirectHandler.redirect_request.<locals>.<genexpr>T)re   r}   r~   )r   r   r   r   )r   r   )r   r   r   )r   r   )	r   r   rp   replacer   re   r{   r   r}   )	r   r   rd   r   r   re   newurlmZ
newheadersrL   )r   rM   r     s    
z$HTTPRedirectHandler.redirect_requestc       
      C   sN  d|kr|d }nd|kr$|d }nd S t |}|jdkrRt||d||f |||j rp|jrpt|}d|d	< t|}t|d
tj	d}t
|j|}| j||||||}|d krd S t|dr|j }	|_|	j|d| jkst|	| jkrt|j|| j| ||ni  }	 |_|_|	j|dd |	|< |j  |j  | jj||jdS )Nlocationurir   r   ftprn   z+%s - Redirection to url '%s' is not allowed/r:   z
iso-8859-1)encodingsaferedirect_dictr   rR   )rJ   )r   r   r   rn   )r   schemer   rX   Znetlocr   r   r	   stringZpunctuationr   rp   r   r   r  r   max_repeatsr`   max_redirectionsinf_msgr_   r   r   rG   rJ   )
r   r   rd   r   r   re   r   urlpartsnewZvisitedrL   rL   rM   http_error_302  s@    



z"HTTPRedirectHandler.http_error_302zoThe HTTP server returned a redirect error that would lead to an infinite loop.
The last 30x error message was:
N)r   r   r   r  r  r   r
  http_error_301http_error_303http_error_307r  rL   rL   rL   rM   r     s   &<c       	      C   s   t | \}}|jds d }| }n:|jds6td|  |jdd}|dkrNd }|d| }t|\}}|d k	r|t|\}}nd  }}||||fS )Nr   z//zproxy URL with no authority: %rr:   rR   rS   )r   r   rB   r   r   r   )	proxyr  Zr_scheme	authorityendZuserinfohostportuserpasswordrL   rL   rM   _parse_proxy  s    

r  c               @   s"   e Zd ZdZdddZdd ZdS )r   d   Nc             C   sL   |d krt  }|| _x2|j D ]&\}}t| d| ||| jfdd qW d S )Nz%s_openc             S   s   || ||S )NrL   )rr  r   r   rL   rL   rM   <lambda>%  s    z'ProxyHandler.__init__.<locals>.<lambda>)r5   proxiesr{   setattrr   )r   r  r   rH   rL   rL   rM   r     s    
zProxyHandler.__init__c             C   s   |j }t|\}}}}|d kr"|}|jr6t|jr6d S |rv|rvdt|t|f }	tj|	j jd}
|j	dd|
  t|}|j
|| ||ks|dkrd S | jj||jdS d S )Nz%s:%sasciizProxy-authorizationzBasic r   )rJ   )r   r  rv   proxy_bypassr
   base64	b64encodeencodedecoder|   r   r   rG   rJ   )r   r   r  r   Z	orig_typeZ
proxy_typer  r  r  Z	user_passZcredsrL   rL   rM   r   (  s     zProxyHandler.proxy_open)N)r   r   r   r   r   r   rL   rL   rL   rM   r     s   

c               @   s6   e Zd Zdd Zdd Zdd Zddd	Zd
d ZdS )r    c             C   s
   i | _ d S )N)passwd)r   rL   rL   rM   r   F  s    zHTTPPasswordMgr.__init__c                s`   t |tr|g}|jkr$i j|< x6dD ]. t fdd|D }||fj| |< q*W d S )NTFc                s   g | ]}j | qS rL   )
reduce_uri)r   u)default_portr   rL   rM   
<listcomp>Q  s    z0HTTPPasswordMgr.add_password.<locals>.<listcomp>)TF)r   r   r   tuple)r   realmr   r  r   reduced_urirL   )r#  r   rM   add_passwordI  s    



zHTTPPasswordMgr.add_passwordc       	      C   s`   | j j|i }xLdD ]D}| j||}x2|j D ]&\}}x|D ]}| j||r<|S q<W q.W qW dS )NTF)TF)NN)r   r   r!  r{   	is_suburi)	r   r&  authuriZdomainsr#  reduced_authuriZurisZauthinfor   rL   rL   rM   find_user_passwordT  s    

z"HTTPPasswordMgr.find_user_passwordTc       
      C   s   t |}|d r.|d }|d }|d p*d}nd }|}d}t|\}}|r~|d kr~|d k	r~dddj|}	|	d k	r~d||	f }||fS )	NrR   r   r:   r   P   i  )r   r   z%s:%d)r   r   r   )
r   r   r#  partsr  r  rX   rv   portZdportrL   rL   rM   r!  ^  s     zHTTPPasswordMgr.reduce_uric             C   sR   ||krdS |d |d kr dS t j|d |d f}t|t|d krNdS dS )NTr   FrR   )	posixpathcommonprefixr`   )r   basetestcommonrL   rL   rM   r)  u  s    zHTTPPasswordMgr.is_suburiN)T)r   r   r   r   r(  r,  r!  r)  rL   rL   rL   rM   r    D  s
   

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

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