
Wz             )   @   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, Wn e- k
 rd Z. Yn Xd 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/ e j0 d d(  Z1 d a2 d e
 j3 d) d d* d d+ d d, d d- d Z4 d. d   Z5 g  Z6 d d d d/ d$  Z7 d0 d%   Z8 e	 j9 d1 e	 j:  Z; d2 d3   Z< Gd4 d   d  Z= Gd5 d   d  Z> d6 d    Z? Gd7 d	   d	  Z@ Gd8 d   d e@  ZA Gd9 d
   d
 e@  ZB Gd: d   d e@  ZC d; d<   ZD Gd= d   d e@  ZE Gd> d   d  ZF Gd? d   d eF  ZG Gd@ d   d eG  ZH GdA d   d  ZI GdB d   d eI e@  ZJ GdC d   d eI e@  ZK e jL ZM GdD d   d  ZN GdE d   d e@ eN  ZO GdF d   d e@ eN  ZP GdG dH   dH e@  ZQ GdI d   d eQ  ZR eS e jT dJ  rGdK dL   dL eQ  ZU e/ jV dL  GdM d   d e@  ZW GdN d   d e@  ZX dO dP   ZY dQ dR   ZZ GdS d   d e@  Z[ dT dU   Z\ GdV d   d e@  Z] GdW d   d e]  Z^ GdX d   d e@  Z_ dY Z` e ja dZ k rZd  d[ lb mc Zc md Zd n d\ d"   Zc d] d!   Zd i  Ze Gd^ d&   d&  Zf Gd_ d'   d' ef  Zg d ah d` da   Zi d aj db dc   Zk d al dd de   Zm d an df dg   Zo Gdh di   di  Zp dj dk   Zq d dl dm  Zr dn do   Zs e jt dp k r{d  dq lu mv Zv mw Zw dr ds   Zx dt du   Zy dv dw   Zz dx d#   Z{ nN e ja dZ k rdy dz   Z| d{ d#   Z{ d| d}   Z} d~ dw   Zz n eq Z{ er Zz d 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FancyURLopener   cafilecapath	cadefaultcontextc      	      C   s   | s | s | r{ | d  k	 r* t  d   t s< t  d   t j t j j d | d | } t d |  } t |  } nF | r t d |  } t |  } n" t d  k r t   a } n t } | j	 |  | |  S)NzDYou can't pass both context and any of cafile, capath, and cadefaultzSSL support not availabler;   r<   r>   )

ValueError	_have_sslsslZcreate_default_contextZPurposeZSERVER_AUTHHTTPSHandlerr2   _openeropen)	urldatatimeoutr;   r<   r=   r>   Zhttps_handleropener rI   </afs/.cs/s/python-3.5.2/amd64_ubu14/lib/python3.5/request.pyr0      s$    		c             C   s
   |  a  d  S)N)rC   )rH   rI   rI   rJ   r1      s    c             C   s  t  |   \ } } t j t |  |   :} | j   } | d k rb | rb t j j |  | f S| rz t | d  } n( t	 j
 d d  } | j } t j |  |  | | f }	 d }
 d } d } d } d	 | k r t | d
  } | r | | |
 |  xW | j |
  } | sP| t |  7} | j |  | d 7} | r| | |
 |  qWWd  QRXWd  QRX| d k r| | k  rt d | | f |	   |	 S)NfilewbdeleteFi         r   zcontent-lengthzContent-Lengthz1retrieval incomplete: got only %i out of %i bytesi    )r   
contextlibclosingr0   infoospathnormpathrD   tempfileNamedTemporaryFilename_url_tempfilesappendintreadlenwriter   )rE   filename
reporthookrF   Zurl_typerU   fpheaderstfpresultbssizer]   blocknumblockrI   rI   rJ   r6      sD    	
"c              C   sT   x4 t  D], }  y t j |   Wq t k
 r2 Yq Xq Wt  d  d   =t rP d  a d  S)N)rZ   rT   unlinkOSErrorrC   )Z	temp_filerI   rI   rJ   r7      s    	z:\d+$c             C   sV   |  j  } t |  d } | d k r7 |  j d d  } t j d | d  } | j   S)NrO    Host)full_urlr   
get_header_cut_port_resublower)requestrE   hostrI   rI   rJ   request_host   s    	ru   c               @   s*  e  Z d  Z d i  d d d 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   s   | |  _  i  |  _ i  |  _ d  |  _ | |  _ d  |  _ x* | j   D] \ } } |  j | |  qC W| d  k r{ t |   } | |  _	 | |  _
 | r | |  _ d  S)N)rn   rc   unredirected_hdrs_datarF   _tunnel_hostitems
add_headerru   origin_req_hostunverifiablemethod)	selfrE   rF   rc   r{   r|   r}   keyvaluerI   rI   rJ   __init__
  s    								zRequest.__init__c             C   s&   |  j  r d j |  j |  j   S|  j S)Nz{}#{})fragmentformat	_full_url)r~   rI   rI   rJ   rn     s    	zRequest.full_urlc             C   s8   t  |  |  _ t |  j  \ |  _ |  _ |  j   d  S)N)r   r   r   r   _parse)r~   rE   rI   rI   rJ   rn   "  s    c             C   s   d  |  _  d  |  _ d |  _ d  S)Nrl   )r   r   selector)r~   rI   rI   rJ   rn   )  s    		c             C   s   |  j  S)N)rw   )r~   rI   rI   rJ   rF   /  s    zRequest.datac             C   s8   | |  j  k r4 | |  _  |  j d  r4 |  j d  d  S)NzContent-length)rw   
has_headerremove_header)r~   rF   rI   rI   rJ   rF   3  s    	c             C   s   d  |  _  d  S)N)rF   )r~   rI   rI   rJ   rF   =  s    c             C   sq   t  |  j  \ |  _ } |  j d  k r: t d |  j   t |  \ |  _ |  _ |  j rm t |  j  |  _ d  S)Nzunknown url type: %r)	r   r   typer?   rn   r   rt   r   r
   )r~   restrI   rI   rJ   r   A  s    	zRequest._parsec             C   s+   |  j  d  k	 r d n d } t |  d |  S)NPOSTGETr}   )rF   getattr)r~   Zdefault_methodrI   rI   rJ   
get_methodI  s    zRequest.get_methodc             C   s   |  j  S)N)rn   )r~   rI   rI   rJ   get_full_urlN  s    zRequest.get_full_urlc             C   sJ   |  j  d k r( |  j r( |  j |  _ n | |  _  |  j |  _ | |  _ d  S)Nhttps)r   rx   rt   rn   r   )r~   rt   r   rI   rI   rJ   	set_proxyQ  s
    	zRequest.set_proxyc             C   s   |  j  |  j k S)N)r   rn   )r~   rI   rI   rJ   	has_proxyY  s    zRequest.has_proxyc             C   s   | |  j  | j   <d  S)N)rc   
capitalize)r~   r   valrI   rI   rJ   rz   \  s    zRequest.add_headerc             C   s   | |  j  | j   <d  S)N)rv   r   )r~   r   r   rI   rI   rJ   add_unredirected_header`  s    zRequest.add_unredirected_headerc             C   s   | |  j  k p | |  j k S)N)rc   rv   )r~   header_namerI   rI   rJ   r   d  s    zRequest.has_headerc             C   s"   |  j  j | |  j j | |   S)N)rc   getrv   )r~   r   defaultrI   rI   rJ   ro   h  s    	zRequest.get_headerc             C   s*   |  j  j | d   |  j j | d   d  S)N)rc   poprv   )r~   r   rI   rI   rJ   r   m  s    zRequest.remove_headerc             C   s/   |  j  j   } | j |  j  t | j    S)N)rv   copyupdaterc   listry   )r~   hdrsrI   rI   rJ   header_itemsq  s    zRequest.header_items)__name__
__module____qualname__r   propertyrn   setterdeleterrF   r   r   r   r   r   rz   r   r   ro   r   r   rI   rI   rI   rJ   r     s(   
c               @   sp   e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 e j d
 d  Z	 d	 d d  Z
 d d   Z d	 S)r   c             C   sM   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_versionrI   rI   rJ   r   w  s    
				zOpenerDirector.__init__c             C   s  t  | d  s% t d t |    d } xut |  D]g} | d k rM q8 | j d  } | d  |  } | | d d   } | j d	  r| j d  | d } | | d d   } y t |  } Wn t k
 r Yn X|  j j	 | i   }	 |	 |  j | <n] | d
 k r"| } |  j
 }	 n? | d k r@| } |  j }	 n! | d k r8 | } |  j }	 n q8 |	 j | g   }
 |
 rt j |
 |  n |
 j |  d } q8 W| rt j |  j |  | j |   d  S)N
add_parentz%expected BaseHandler instance, got %rFredirect_requestdo_open
proxy_open_rO   errorrD   responsers   T)zredirect_requestzdo_openz
proxy_open)hasattr	TypeErrorr   dirfind
startswithr\   r?   r   r   r   r   r   
setdefaultbisectZinsortr[   r   r   )r~   handlerZaddedmethiprotocolZ	conditionjkindlookupr   rI   rI   rJ   add_handler  sJ    
zOpenerDirector.add_handlerc             C   s   d  S)NrI   )r~   rI   rI   rJ   close  s    zOpenerDirector.closec       	      G   sR   | j  | f   } x9 | D]1 } t | |  } | |   } | d  k	 r | Sq Wd  S)N)r   r   )	r~   chainr   	meth_nameargsr   r   funcre   rI   rI   rJ   _call_chain  s    zOpenerDirector._call_chainNc       
      C   s   t  | t  r! t | |  } n | } | d  k	 r< | | _ | | _ | j } | d } x8 |  j j | g   D]! } t | |  } | |  } qn W|  j	 | |  }	 | d } x; |  j
 j | g   D]$ } t | |  } | | |	  }	 q W|	 S)NZ_requestZ	_response)
isinstancestrr   rF   rG   r   r   r   r   _openr   )
r~   fullurlrF   rG   reqr   r   Z	processorr   r   rI   rI   rJ   rD     s"    			

zOpenerDirector.openc             C   sp   |  j  |  j d d |  } | r% | S| j } |  j  |  j | | d |  } | rW | S|  j  |  j d d |  S)Nr   Zdefault_openr   unknownunknown_open)r   r   r   )r~   r   rF   re   r   rI   rI   rJ   r     s    	zOpenerDirector._openc             G   s   | d
 k r< |  j  d } | d } d | } d } | } n |  j  } | d } d } | | | f | } |  j |   } | r | S| r | d d	 f | } |  j |   Sd  S)Nhttpr      zhttp_error_%srO   Z_errorr   r   http_error_default)zhttpzhttps)r   r   )r~   protor   dictr   Zhttp_errZ	orig_argsre   rI   rI   rJ   r     s     

		
zOpenerDirector.error)r   r   r   r   r   r   r   socket_GLOBAL_DEFAULT_TIMEOUTrD   r   r   rI   rI   rI   rJ   r   v  s   /c           	   G   s7  t    } t t t t t t t t t	 g	 } t
 t j d  rI | j t  t   } xi | D]a } xX |  D]P } t | t  r t | |  r | j |  qf t | |  rf | j |  qf WqY Wx | D] } | j |  q Wx | D] } | j |    q Wx3 |  D]+ } t | t  r"|   } | j |  qW| S)NHTTPSConnection)r   r   r.   r)   r   r   r+   r*   r/   r-   r   r   clientr[   rB   setr   r   
issubclassaddremover   )r   rH   Zdefault_classesskipklasscheckhrI   rI   rJ   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   rI   rI   rJ   r   +  s    zBaseHandler.add_parentc             C   s   d  S)NrI   )r~   rI   rI   rJ   r   .  s    zBaseHandler.closec             C   s#   t  | d  s d S|  j | j k  S)Nhandler_orderT)r   r   )r~   otherrI   rI   rJ   __lt__2  s    zBaseHandler.__lt__N)r   r   r   r   r   r   r   rI   rI   rI   rJ   r   (  s   c               @   s(   e  Z d  Z d Z d d   Z e Z d S)r/   i  c             C   sa   | j  | j | j   } } } d | k o7 d k  n s] |  j j d | | | | |  } | S)N   i,  r   )codemsgrS   r   r   )r~   rs   r   r   r   r   rI   rI   rJ   http_response?  s
     	z HTTPErrorProcessor.http_responseN)r   r   r   r   r   https_responserI   rI   rI   rJ   r/   ;  s   c               @   s   e  Z d  Z d d   Z d S)r   c             C   s   t  | j | | | |   d  S)N)r   rn   )r~   r   rb   r   r   r   rI   rI   rJ   r   M  s    z*HTTPDefaultErrorHandler.http_error_defaultN)r   r   r   r   rI   rI   rI   rJ   r   L  s   c               @   sH   e  Z d  Z d Z d Z d d   Z d d   Z e Z Z Z	 d Z
 d S)	r      
   c       	         s   | j    } | d k r$ | d k p9 | d k o9 | d k sW t | j | | | |   | j d d	  } d   t   f d d   | j j   D  } t | d | d | j d d S)N-  .  /  3  r   HEADr    z%20content-lengthcontent-typec             3   s3   |  ]) \ } } | j      k r | | f Vq d  S)N)rr   ).0kv)CONTENT_HEADERSrI   rJ   	<genexpr>s  s    	z7HTTPRedirectHandler.redirect_request.<locals>.<genexpr>rc   r{   r|   T)r   r   r   r   )zGETr   )r   r   r   )r   r   )	r   r   rn   replacer   rc   ry   r   r{   )	r~   r   rb   r   r   rc   newurlmZ
newheadersrI   )r   rJ   r   X  s    
(		z$HTTPRedirectHandler.redirect_requestc       
      C   s  d | k r | d } n d | k r2 | d } n d  St  |  } | j d k rs t | | d | | f | |   | j r | j r t |  } d | d	 <t |  } t | d
 d d t j	 } t
 | j |  } |  j | | | | | |  } | d  k rd  St | d  rw| j }	 | _ |	 j | d  |  j k sRt |	  |  j k rt | j | |  j | | |   n i  }	 | _ | _ |	 j | d  d |	 | <| j   | j   |  j j | d | j S)Nlocationurir   r   ftprl   z+%s - Redirection to url '%s' is not allowed/r   encodingz
iso-8859-1saferedirect_dictr   rO   rG   )zhttpzhttpszftprl   )r   schemer   rU   Znetlocr   r   r	   stringpunctuationr   rn   r   r   r  r   max_repeatsr^   max_redirectionsinf_msgr]   r   r   rD   rG   )
r~   r   rb   r   r   rc   r   urlpartsnewZvisitedrI   rI   rJ   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  rI   rI   rI   rJ   r   P  s   &<c       	      C   s   t  |   \ } } | j d  s0 d  } |  } nS | j d  sO t d |    | j d d  } | d k rs d  } | d |  } t |  \ } } | d  k	 r t |  \ } } n
 d  } } | | | | f S)Nr   z//zproxy URL with no authority: %rr   rO   rP   )r   r   r?   r   r   r   )	proxyr  Zr_scheme	authorityendZuserinfohostportuserpasswordrI   rI   rJ   _parse_proxy  s    	
r  c               @   s1   e  Z d  Z d Z d d d  Z d d   Z d S)r   d   Nc          	   C   se   | d  k r t    } | |  _ x@ | j   D]2 \ } } t |  d | | | |  j d d   q+ Wd  S)Nz%s_openc             S   s   | |  | |  S)NrI   )rr  r   r   rI   rI   rJ   <lambda>  s    z'ProxyHandler.__init__.<locals>.<lambda>)r5   proxiesry   setattrr   )r~   r  r   rE   rI   rI   rJ   r     s    		zProxyHandler.__init__c             C   s   | j  } t |  \ } } } } | d  k r3 | } | j rO t | j  rO d  S| r | r d t |  t |  f }	 t j |	 j    j d  }
 | j	 d d |
  t |  } | j
 | |  | | k s | d k r d  S|  j j | d | j Sd  S)Nz%s:%sasciizProxy-authorizationzBasic r   rG   )r   r  rt   proxy_bypassr
   base64	b64encodeencodedecoderz   r   r   rD   rG   )r~   r   r  r   Z	orig_typeZ
proxy_typer  r  r  Z	user_passZcredsrI   rI   rJ   r     s     	zProxyHandler.proxy_open)r   r   r   r   r   r   rI   rI   rI   rJ   r     s   
c               @   sO   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~   rI   rI   rJ   r   
  s    zHTTPPasswordMgr.__init__c                s   t  | t  r | g } |  j k r4 i   j | <xG d D]?   t    f d d   | D  } | | f  j | | <q; Wd  S)NTFc                s"   g  |  ] }  j  |     q SrI   )
reduce_uri)r   u)default_portr~   rI   rJ   
<listcomp>  s   	 z0HTTPPasswordMgr.add_password.<locals>.<listcomp>)TF)r   r   r   tuple)r~   realmr   r  r   reduced_urirI   )r#  r~   rJ   add_password  s    	zHTTPPasswordMgr.add_passwordc       	      C   s   |  j  j | i   } xd d D]\ } |  j | |  } xA | j   D]3 \ } } x$ | D] } |  j | |  rT | SqT WqA Wq Wd S)NTF)TF)NN)r   r   r!  ry   	is_suburi)	r~   r&  authuriZdomainsr#  reduced_authuriZurisZauthinfor   rI   rI   rJ   find_user_password  s    z"HTTPPasswordMgr.find_user_passwordTc       
      C   s   t  |  } | d r= | d } | d } | d p7 d } n d  } | } d } t |  \ } } | r | d  k r | d  k	 r d d d d i j |  }	 |	 d  k	 r d	 | |	 f } | | f S)
NrO   r   r   r   r   P   r   i  z%s:%d)r   r   r   )
r~   r   r#  partsr  r  rU   rt   portZdportrI   rI   rJ   r!  "  s     


	zHTTPPasswordMgr.reduce_uric             C   si   | | k r d S| d | d k r( d St  j | d | d f  } t |  t | d  k re d Sd S)NTr   FrO   )	posixpathcommonprefixr^   )r~   basetestcommonrI   rI   rJ   r)  9  s    zHTTPPasswordMgr.is_suburiN)r   r   r   r   r(  r,  r!  r)  rI   rI   rI   rJ   r      s
   
c               @   s   e  Z d  Z d d   Z d S)r!   c             C   sD   t  j |  | |  \ } } | d  k	 r1 | | f St  j |  d  |  S)N)r    r,  )r~   r&  r*  r  r  rI   rI   rJ   r,  J  s
    
z2HTTPPasswordMgrWithDefaultRealm.find_user_passwordN)r   r   r   r,  rI   rI   rI   rJ   r!   H  s   c                   sR   e  Z d  Z   f d d   Z d   f d d  Z d d d  Z d d	   Z   S)
r"   c                s    i  |  _  t   j | |   d  S)N)authenticatedsuperr   )r~   r   kwargs)	__class__rI   rJ   r   T  s    	z%HTTPPasswordMgrWithPriorAuth.__init__Fc                sR   |  j  | |  | d  k	 r5 t   j d  | | |  t   j | | | |  d  S)N)update_authenticatedr6  r(  )r~   r&  r   r  r   is_authenticated)r8  rI   rJ   r(  X  s    z)HTTPPasswordMgrWithPriorAuth.add_passwordc             C   s]   t  | t  r | g } x> d D]6 } x- | D]% } |  j | |  } | |  j | <q, Wq Wd  S)NTF)TF)r   r   r!  r5  )r~   r   r:  r#  r"  r'  rI   rI   rJ   r9  _  s    	z1HTTPPasswordMgrWithPriorAuth.update_authenticatedc             C   sX   xQ d D]I } |  j  | |  } x. |  j D]# } |  j | |  r) |  j | Sq) Wq Wd  S)NTF)TF)r!  r5  r)  )r~   r*  r#  r+  r   rI   rI   rJ   r:  i  s
    z-HTTPPasswordMgrWithPriorAuth.is_authenticated)r   r   r   r   r(  r9  r:  rI   rI   )r8  rJ   r"   R  s   
c               @   sp   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 e
 Z e Z d S)r#   z1(?:.*,)*[ 	]*([^ 	]+)[ 	]+realm=(["']?)([^"']*)\2Nc             C   s1   | d  k r t    } | |  _ |  j j |  _ d  S)N)r    r   r(  )r~   Zpassword_mgrrI   rI   rJ   r     s    		z!AbstractBasicAuthHandler.__init__c       	      C   s   | j  | d   } | r | j   d } | j   d k rM t d |   nq t j j |  } | r | j   \ } } } | d k r t j	 d t
 d  | j   d k r |  j | | |  Sd  S)	Nr   basiczDAbstractBasicAuthHandler does not support the following scheme: '%s'"'zBasic Auth Realm was unquotedr   )r<  r=  )r   splitrr   r?   r#   rxsearchgroupswarningswarnUserWarningretry_http_basic_auth)	r~   authreqrt   r   rc   r  mor	   r&  rI   rI   rJ   http_error_auth_reqed  s    	
z.AbstractBasicAuthHandler.http_error_auth_reqedc             C   s   |  j  j | |  \ } } | d  k	 r d | | f } d t j | j    j d  } | j |  j d   | k rx d  S| j |  j |  |  j	 j
 | d | j Sd  Sd  S)Nz%s:%szBasic r  rG   )r   r,  r  r  r  r  ro   auth_headerr   r   rD   rG   )r~   rt   r   r&  r  pwrawauthrI   rI   rJ   rE    s    "z.AbstractBasicAuthHandler.retry_http_basic_authc             C   s   t  |  j d  s) |  j j | j  r- | S| j d  s |  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:  rn   r   r,  r   r  r  Zstandard_b64encoder  r   strip)r~   r   r  r   ZcredentialsZauth_strrI   rI   rJ   http_request  s    	z%AbstractBasicAuthHandler.http_requestc             C   sd   t  |  j d  r` d | j k o, d k  n rJ |  j j | j d  n |  j j | j d  | S)Nr:  r   i,  TF)r   r   r   r9  rn   )r~   r   r   rI   rI   rJ   r     s
    z&AbstractBasicAuthHandler.http_response)r   r   r   recompileIr?  r   rH  rE  rO  r   https_requestr   rI   rI   rI   rJ   r#   q  s   	c               @   s"   e  Z d  Z d Z d d   Z d S)r$   rM  c             C   s%   | j  } |  j d | | |  } | S)Nzwww-authenticate)rn   rH  )r~   r   rb   r   r   rc   rE   r   rI   rI   rJ   http_error_401  s    		z#HTTPBasicAuthHandler.http_error_401N)r   r   r   rI  rT  rI   rI   rI   rJ   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)rt   rH  )r~   r   rb   r   r   rc   r  r   rI   rI   rJ   http_error_407  s    		z$ProxyBasicAuthHandler.http_error_407N)r   r   r   rI  rU  rI   rI   rI   rJ   r%     s   c               @   ss   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   sL   | d  k r t    } | |  _ |  j j |  _ d |  _ d |  _ d  |  _ d  S)Nr   )r    r   r(  retriednonce_count
last_nonce)r~   r   rI   rI   rJ   r     s    				z"AbstractDigestAuthHandler.__init__c             C   s   d |  _  d  S)Nr   )rV  )r~   rI   rI   rJ   reset_retry_count  s    z+AbstractDigestAuthHandler.reset_retry_countc             C   s   | j  | d   } |  j d k r? t | j d d | d    n |  j d 7_ | r | j   d } | j   d k r |  j | |  S| j   d k r t d |   d  S)	N   i  zdigest auth failedrO   r   digestr;  zEAbstractDigestAuthHandler does not support the following scheme: '%s')r   rV  r   rn   r>  rr   retry_http_digest_authr?   )r~   rI  rt   r   rc   rF  r  rI   rI   rJ   rH    s    z/AbstractDigestAuthHandler.http_error_auth_reqedc             C   s   | j  d d  \ } } t t d  t |    } |  j | |  } | r d | } | j j |  j d   | k rw d  S| j |  j |  |  j	 j
 | d | j } | Sd  S)Nr   rO   z	Digest %srG   )r>  parse_keqv_listfilterparse_http_listget_authorizationrc   r   rI  r   r   rD   rG   )r~   r   rL  tokenZ	challengechalZauth_valZresprI   rI   rJ   r\  
  s    
z0AbstractDigestAuthHandler.retry_http_digest_authc             C   sX   d |  j  | t j   f } | j d  t d  } t j |  j   } | d  d  S)Nz	%s:%s:%s:r  rN      )rW  timectimer  _randombyteshashlibsha1	hexdigest)r~   noncesbdigrI   rI   rJ   
get_cnonce  s    z$AbstractDigestAuthHandler.get_cnoncec             C   sV  yK | d } | d } | j  d  } | j  d d  } | j  d d   } Wn t k
 rc d  SYn X|  j |  \ } }	 | d  k r d  S|  j j | | j  \ }
 } |
 d  k r d  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 } |	 | |  |  } nD | d  k r|	 | |  d | | |  f  } n t d |   d |
 | | | j	 | f } | r| d | 7} | r*| d | 7} | d | 7} | rR| d | | f 7} | S)Nr&  rj  qop	algorithmMD5opaquez%s:%s:%sz%s:%srL  rO   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,  rn   rF   get_entity_digestr   r   rX  rW  rn  r   )r~   r   rb  r&  rj  ro  rp  rr  HKDr  rJ  ZentdigZA1ZA2ZncvalueZcnonceZnoncebitZrespdigr2  rI   rI   rJ   r`  !  sV    

			(
z+AbstractDigestAuthHandler.get_authorizationc                sb   | d k r d d     n+ | d k r6 d d     n t  d |     f d d   }   | f S)Nrq  c             S   s   t  j |  j d   j   S)Nr  )rg  md5r  ri  )xrI   rI   rJ   r  `  s    z?AbstractDigestAuthHandler.get_algorithm_impls.<locals>.<lambda>ZSHAc             S   s   t  j |  j d   j   S)Nr  )rg  rh  r  ri  )ry  rI   rI   rJ   r  b  s    z.Unsupported digest authentication algorithm %rc                s     d |  | f  S)Nz%s:%srI   )rk  d)rv  rI   rJ   r  g  s    )r?   )r~   rp  rw  rI   )rv  rJ   rt  ]  s    
z-AbstractDigestAuthHandler.get_algorithm_implsc             C   s   d  S)NrI   )r~   rF   rb  rI   rI   rJ   ru  j  s    z+AbstractDigestAuthHandler.get_entity_digest)r   r   r   r   rY  rH  r\  rn  r`  rt  ru  rI   rI   rI   rJ   r&     s   	<c               @   s(   e  Z d  Z d Z d Z d d   Z d S)r'   rM  i  c             C   s9   t  | j  d } |  j d | | |  } |  j   | S)NrO   zwww-authenticate)r   rn   rH  rY  )r~   r   rb   r   r   rc   rt   retryrI   rI   rJ   rT  y  s
    	
z$HTTPDigestAuthHandler.http_error_401N)r   r   r   rI  r   rT  rI   rI   rI   rJ   r'   o  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)rt   rH  rY  )r~   r   rb   r   r   rc   rt   r{  rI   rI   rJ   rU    s
    		
z%ProxyDigestAuthHandler.http_error_407N)r   r   r   rI  r   rU  rI   rI   rI   rJ   r(     s   c               @   sC   e  Z d  Z d d d  Z d d   Z d d   Z d d	   Z d
 S)AbstractHTTPHandlerr   c             C   s   | |  _  d  S)N)_debuglevel)r~   
debuglevelrI   rI   rJ   r     s    zAbstractHTTPHandler.__init__c             C   s   | |  _  d  S)N)r}  )r~   levelrI   rI   rJ   set_http_debuglevel  s    z'AbstractHTTPHandler.set_http_debuglevelc             C   s  | j  } | s t d   | j d  k	 r | j } t | t  rT d } t |   | j d  ss | j d d  | j d  s y t |  } Wn@ t k
 r t | t	 j
  r t d t |  | f   Yn" X| j d d t |  | j  | } | j   r/t | j  \ } } t |  \ } }	 | j d  sN| j d |  xE |  j j D]7 \ }
 } |
 j   }
 | j |
  s[| j |
 |  q[W| S)	Nzno host givenzLPOST data should be bytes or an iterable of bytes. It cannot be of type str.zContent-typez!application/x-www-form-urlencodedzContent-lengthzBContent-Length should be specified for iterable data of type %r %rz%drm   )rt   r   rF   r   r   r   r   r   
memoryviewcollectionsIterabler?   r   r^   itemsizer   r   r   r   r   r   r   )r~   rs   rt   rF   r   ZmvZsel_hostr  ZselZsel_pathrY   r   rI   rI   rJ   do_request_  sB    			zAbstractHTTPHandler.do_request_c       
         s  | j  } | s t d   | | d | j | } | j |  j  t | j      j t   f d d   | j j	   D   d   d <t d d     j	   D    | j
 r i  } d } |   k r   | | | <  | =| j | j
 d	 | yj y& | j | j   | j | j    Wn1 t k
 rR} z t |   WYd  d  } ~ Xn X| j   }	 Wn | j     Yn X| j r| j j   d  | _ | j   |	 _ |	 j |	 _ |	 S)
Nzno host givenrG   c             3   s-   |  ]# \ } } |   k r | | f Vq d  S)NrI   )r   r   r   )rc   rI   rJ   r     s    	z.AbstractHTTPHandler.do_open.<locals>.<genexpr>r   
Connectionc             s   s'   |  ] \ } } | j    | f Vq d  S)N)title)r   rY   r   rI   rI   rJ   r     s    zProxy-Authorizationrc   )rt   r   rG   Zset_debuglevelr}  r   rv   r   rc   ry   rx   Z
set_tunnelrs   r   r   rF   rk   getresponser   sockr   rE   reasonr   )
r~   Z
http_classr   Zhttp_conn_argsrt   r   Ztunnel_headersZproxy_auth_hdrerrr  rI   )rc   rJ   r     s>    	/
	&
		zAbstractHTTPHandler.do_openN)r   r   r   r   r  r  r   rI   rI   rI   rJ   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   HTTPConnection)r~   r   rI   rI   rJ   	http_open  s    zHTTPHandler.http_openN)r   r   r   r  r|  r  rO  rI   rI   rI   rJ   r)     s   r   c               @   s:   e  Z d  Z d d d d d  Z d d   Z e j Z d S)rB   r   Nc             C   s&   t  j |  |  | |  _ | |  _ d  S)N)r|  r   _context_check_hostname)r~   r~  r>   check_hostnamerI   rI   rJ   r   
  s    	zHTTPSHandler.__init__c             C   s(   |  j  t j j | d |  j d |  j S)Nr>   r  )r   r   r   r   r  r  )r~   r   rI   rI   rJ   
https_open  s    zHTTPSHandler.https_open)r   r   r   r   r  r|  r  rS  rI   rI   rI   rJ   rB     s   rB   c               @   sC   e  Z d  Z d d d  Z d d   Z d d   Z e Z e Z d S)r   Nc             C   s4   d d  l  } | d  k r' | j j   } | |  _ d  S)Nr   )Zhttp.cookiejar	cookiejarZ	CookieJar)r~   r  r   rI   rI   rJ   r     s    zHTTPCookieProcessor.__init__c             C   s   |  j  j |  | S)N)r  Zadd_cookie_header)r~   rs   rI   rI   rJ   rO    s    z HTTPCookieProcessor.http_requestc             C   s   |  j  j | |  | S)N)r  Zextract_cookies)r~   rs   r   rI   rI   rJ   r   "  s    z!HTTPCookieProcessor.http_response)r   r   r   r   rO  r   rS  r   rI   rI   rI   rJ   r     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   rI   rI   rJ   r   *  s    	zUnknownHandler.unknown_openN)r   r   r   r   rI   rI   rI   rJ   r.   )  s   c             C   sm   i  } x` |  D]X } | j  d d  \ } } | d d k r[ | d d k r[ | d d  } | | | <q W| S)N=rO   r   r<  rP   rP   )r>  )lZparsedZeltr   r   rI   rI   rJ   r]  .  s     r]  c             C   s   g  } d } d } } x |  D] } | r< | | 7} d } q | ry | d k rZ d } q n | d k rl d } | | 7} q | d k r | j  |  d } q | d k r d } | | 7} q W| r | j  |  d d   | D S)	Nrl   F\Tr<  ,c             S   s   g  |  ] } | j     q SrI   )rN  )r   partrI   rI   rJ   r$  a  s   	 z#parse_http_list.<locals>.<listcomp>)r[   )rk  resr  escaper	   ZcurrI   rI   rJ   r_  8  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 rq | d d  d k rq | j rq | j d k rq | j |  j   k r~ t d   n |  j |  Sd  S)Nr   z//r:   r   	localhostz-file:// scheme is supported only on localhost)r   rt   	get_namesr   open_local_file)r~   r   rE   rI   rI   rJ   	file_opene  s    	5zFileHandler.file_openNc             C   sz   t  j d  k rs y7 t t j d  d t j t j    d  t  _ Wn* t j k
 rr t j d  f t  _ Yn Xt  j S)Nr  r   )r*   namesr%  r   gethostbyname_exgethostnamegaierrorgethostbyname)r~   rI   rI   rJ   r  p  s    $zFileHandler.get_namesc             C   s^  d d  l  } d d  l } | j } | j } t |  } y t j |  } | j } | j j	 | j
 d d }	 | j |  d }
 | j d |
 p d | |	 f  } | r t |  \ } } | s | rt |  |  j   k r| r d | | } n
 d | } t t | d  | |  SWn1 t k
 rM} z t |   WYd  d  } ~ Xn Xt d   d  S)	Nr   usegmtTz6Content-type: %s
Content-length: %d
Last-modified: %s
z
text/plainzfile://rbzfile not on local host)email.utils	mimetypesrt   r   r4   rT   statst_sizeutils
formatdatest_mtime
guess_typemessage_from_stringr   _safe_gethostbynamer  r   rD   rk   r   )r~   r   emailr  rt   r`   Z	localfilestatsrg   modifiedmtyperc   r/  ZorigurlexprI   rI   rJ   r  {  s0    			
zFileHandler.open_local_file)r   r   r   r  r  r  r  rI   rI   rI   rJ   r*   c  s   
c             C   s1   y t  j |   SWn t  j k
 r, d  SYn Xd  S)N)r   r  r  )rt   rI   rI   rJ   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 } | s3 t d   t |  \ } } | d  k r] | j } n t |  } t |  \ } } | r t |  \ } } n d  } t	 |  } | p d } | p d } y t
 j |  } Wn1 t k
 r} z t |   WYd  d  } ~ Xn Xt | j  \ }	 }
 |	 j d  } t t t	 |   } | d  d  | d } } | r|| d r|| d d   } y|  j | | | | | | j  } | rd pd } xJ |
 D]B } t |  \ } } | j   d k r| d k r| j   } qW| j | |  \ } } d } | j | j  d } | rG| d | 7} | d  k	 rm| d k rm| d | 7} t j |  } t | | | j  SWnQ | j k
 r} z. t d |  } | j t j    d   WYd  d  } ~ Xn Xd  S)Nr   zftp error: no host givenrl   r   rO   rR  Dr   aAr   rz  zContent-type: %s
zContent-length: %d
zftp error: %rr   rP   rP   )r  r  r   rR  rz  r  )!ftplibr  rt   r   r   FTP_PORTr\   r   r   r
   r   r  rk   r   r   r>  r   mapconnect_ftprG   r   rr   upperretrfiler  rn   r  r  r   
all_errorswith_tracebacksysexc_info)r~   r   r  r  rt   r/  r  r   r   rU   attrsdirsrK   Zfwr   attrr   rb   retrlenrc   r  r  excrI   rI   rJ   ftp_open  s\    	!zFTPHandler.ftp_openc          	   C   s   t  | | | | | | d d S)N
persistentF)
ftpwrapper)r~   r  r   rt   r/  r  rG   rI   rI   rJ   r    s    zFTPHandler.connect_ftpN)r   r   r   r  r  rI   rI   rI   rJ   r+     s   5c               @   sX   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   s1   i  |  _  i  |  _ d |  _ d |  _ d |  _ d  S)Nr   <   rc  )cacherG   soonestdelay	max_conns)r~   rI   rI   rJ   r     s
    				zCacheFTPHandler.__init__c             C   s   | |  _  d  S)N)r  )r~   trI   rI   rJ   
setTimeout  s    zCacheFTPHandler.setTimeoutc             C   s   | |  _  d  S)N)r  )r~   r   rI   rI   rJ   setMaxConns  s    zCacheFTPHandler.setMaxConnsc             C   s   | | | d j  |  | f } | |  j k rJ t j   |  j |  j | <n< t | | | | | |  |  j | <t j   |  j |  j | <|  j   |  j | S)Nr   )joinr  rd  r  rG   r  check_cache)r~   r  r   rt   r/  r  rG   r   rI   rI   rJ   r    s    
zCacheFTPHandler.connect_ftpc             C   s  t  j    } |  j | k rr xT t |  j j    D]= \ } } | | k  r1 |  j | j   |  j | =|  j | =q1 Wt t |  j j     |  _ t	 |  j  |  j
 k rxG t |  j j    D]0 \ } } | |  j k r |  j | =|  j | =Pq Wt t |  j j     |  _ d  S)N)rd  r  r   rG   ry   r  r   minvaluesr^   r  )r~   r  r   r   rI   rI   rJ   r    s    "
"

zCacheFTPHandler.check_cachec             C   sB   x! |  j  j   D] } | j   q W|  j  j   |  j j   d  S)N)r  r  r   clearrG   )r~   connrI   rI   rJ   clear_cache  s    zCacheFTPHandler.clear_cacheN)	r   r   r   r   r  r  r  r  r  rI   rI   rI   rJ   r,     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  rs t j |  } | d  d  } | s d } t j d | t |  f  } t	 t
 j |  | |  S)	N:rO   r  z;base64   ztext/plain;charset=US-ASCIIz$Content-type: %s
Content-length: %d
i)rn   r>  r   endswithr  decodebytesr  r  r^   r   ioBytesIO)r~   r   rE   r  rF   Z	mediatyperc   rI   rI   rJ   	data_open  s    
		zDataHandler.data_openN)r   r   r   r  rI   rI   rI   rJ   r-     s   r   nt)r4   r3   c             C   s
   t  |   S)N)r
   )pathnamerI   rI   rJ   r4   3  s    c             C   s
   t  |   S)N)r	   )r  rI   rI   rJ   r3   8  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 d d  Z d d   Z d d d  Z d d d  Z d d   Z e r d d   Z d d d   Z d! d"   Z d# d$   Z d% d&   Z d d' d(  Z d S))r8   NzPython-urllib/%sc             K   s   d d |  j  j i } t j | t d d | d  k rA t   } | |  _ | j d  |  _ | j d  |  _	 d |  j
 f g |  _ g  |  _ t j |  _ d  |  _ t |  _ d  S)NzW%(class)s style of invoking requests is deprecated. Use newer urlopen functions/methodsclass
stacklevelr:   key_file	cert_filez
User-Agent)r8  r   rB  rC  DeprecationWarningr5   r  r   r  r  versionr   _URLopener__tempfilesrT   rj   _URLopener__unlink	tempcacheftpcache)r~   r  Zx509r   rI   rI   rJ   r   R  s    				zURLopener.__init__c             C   s   |  j    d  S)N)r   )r~   rI   rI   rJ   __del__l  s    zURLopener.__del__c             C   s   |  j    d  S)N)cleanup)r~   rI   rI   rJ   r   o  s    zURLopener.closec             C   sm   |  j  rS x7 |  j  D], } y |  j |  Wq t k
 r> Yq Xq W|  j  d  d   =|  j ri |  j j   d  S)N)r  r  rk   r  r  )r~   rK   rI   rI   rJ   r  r  s    			zURLopener.cleanupc             G   s   |  j  j |  d  S)N)r   r[   )r~   r   rI   rI   rJ   	addheader  s    zURLopener.addheaderc             C   s  t  t |   } t | d d } |  j rn | |  j k rn |  j | \ } } t | d  } t | | |  St |  \ } } | s d } | |  j k r |  j | } t |  \ } }	 t |	  \ }
 } |
 | f } n d  } d | } | |  _	 | j
 d d  } t |  |  s>| r.|  j | | |  S|  j | |  Sy9 | d  k r`t |  |  |  St |  |  | |  SWna t t f k
 r  YnG t k
 r} z' t d |  j t j   d	   WYd  d  } ~ Xn Xd  S)
Nr   z%/:=&?~#+!$,;'@()*[]|r  rK   Zopen_-r   zsocket errorr   )r   r   r	   r  rD   r   r   r  r   r   r   r   open_unknown_proxyopen_unknownr   r   r   rk   r  r  r  )r~   r   rF   r`   rc   rb   urltyperE   r  	proxyhostrt   r   rY   r   rI   rI   rJ   rD     s<    
	zURLopener.openc             C   s(   t  |  \ } } t d d |   d  S)Nz	url errorzunknown url type)r   rk   )r~   r   rF   r   rE   rI   rI   rJ   r    s    zURLopener.open_unknownc             C   s,   t  |  \ } } t d d | |   d  S)Nz	url errorzinvalid proxy for %s)r   rk   )r~   r  r   rF   r   rE   rI   rI   rJ   r    s    zURLopener.open_unknown_proxyc              C   s  t  t |   } |  j r5 | |  j k r5 |  j | St |  \ } } | d  k r | sf | d k r yC |  j |  } | j   } | j   t t |  d  | f SWn% t	 k
 r }	 z WYd  d  }	 ~	 Xn X|  j
 | |  } z| j   }
 | r
t
 | d  } n d d  l } t |  \ } } t | p4d  \ } } t | pLd  \ } } t | pdd  \ } } t j j |  d } | j |  \ } } |  j j |  t j | d  } z | |
 f } |  j d  k	 r| |  j | <d } d } d } d } d |
 k rt |
 d	  } | r2| | | |  xW | j |  } | sKP| t |  7} | j |  | d 7} | r5| | | |  q5WWd  | j   XWd  | j   X| d k r| | k  rt d
 | | f |   | S)NrK   rO   rL   r   rl   i   rN   zcontent-lengthzContent-Lengthz1retrieval incomplete: got only %i out of %i bytesi    rP   )r   r   r  r   r  rS   r   r4   r   rk   rD   rW   r   r   rT   rU   splitextmkstempr  r[   fdopenr\   r]   r^   r_   r   )r~   rE   r`   ra   rF   r   Zurl1rb   r   r   rc   rd   rW   ZgarbagerU   suffixfdre   rf   rg   r]   rh   ri   rI   rI   rJ   retrieve  sl    

zURLopener.retrievec             C   s  d  } d  } t  | t  rZ t |  \ } } | rQ t |  \ } } t |  } | } n | \ } } t |  \ } } t |  \ }	 }
 |
 } d  } |	 j   d k r d  } nU t |
  \ } }
 | r t |  \ } } | r d |	 | |
 f } t |  r| } | st d d   | rNt |  } t	 j
 | j    j d  } n d  } | rt |  } t	 j
 | j    j d  } n d  } | |  } i  } | rd | | d <| rd | | d <| r| | d	 <d
 | d <x! |  j D] \ } } | | | <qW| d  k	 r4d | d <| j d | | |  n | j d | d | y | j   } Wn$ t j j k
 rt d   Yn Xd | j k od k  n rt | | j d | | j  S|  j | | j | j | j | j |  Sd  S)Nr   z	%s://%s%sz
http errorzno host givenr  zBasic %szProxy-AuthorizationrM  rm   r   r  z!application/x-www-form-urlencodedzContent-Typer   r   rc   z$http protocol error: bad status liner   i,  zhttp:)r   r   r   r   r
   r   rr   r  rk   r  r  r  r  r   rs   r  r   r   ZBadStatusLiner   statusr   r   
http_errorrb   r  )r~   Zconnection_factoryrE   rF   Zuser_passwdZproxy_passwdrt   r   Zrealhostr  r   Z
proxy_authrL  Z	http_connrc   headerr   r   rI   rI   rJ   _open_generic_http  sr    		 !!



	zURLopener._open_generic_httpc             C   s   |  j  t j j | |  S)N)r  r   r   r  )r~   rE   rF   rI   rI   rJ   	open_httpS  s    zURLopener.open_httpc       
      C   s   d | } t  |  |  rt t |  |  } | d  k rO | | | | | |  }	 n | | | | | | |  }	 |	 rt |	 S|  j | | | | |  S)Nzhttp_error_%d)r   r   r   )
r~   rE   rb   errcodeerrmsgrc   rF   rY   r}   re   rI   rI   rJ   r  W  s    
 zURLopener.http_errorc             C   s&   | j    t | | | | d    d  S)N)r   r   )r~   rE   rb   r  r  rc   rI   rI   rJ   r   g  s    
zURLopener.http_error_defaultc             C   s"   t  j j | d |  j d |  j S)Nr  r  )r   r   r   r  r  )r~   rt   rI   rI   rJ   _https_connectionm  s    	zURLopener._https_connectionc             C   s   |  j  |  j | |  S)N)r  r   )r~   rE   rF   rI   rI   rJ   
open_httpsr  s    zURLopener.open_httpsc             C   s   t  | t  s t d   | d  d  d k rr | d d  d k rr | d d  j   d k rr t d   n |  j |  Sd  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   rr   r?   r  )r~   rE   rI   rI   rJ   	open_filev  s
    HzURLopener.open_filec             C   s  d d  l  } d d  l } t |  \ } } t |  } y t j |  } Wn: t k
 r } z t | j | j	   WYd  d  } ~ Xn X| j
 }	 | j j | j d d }
 | j |  d } | j d | p d |	 |
 f  } | s$| } | d  d  d k rd | } t t | d	  | |  St |  \ } } | rt j |  t   f t   k r| } | d  d  d k rd | } n& | d  d
  d k rt d |   t t | d	  | |  St d   d  S)Nr   r  Tz6Content-Type: %s
Content-Length: %d
Last-modified: %s
z
text/plainrO   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   rT   r  rk   r   strerrorr`   r  r  r  r  r  r  r   rD   r   r   r  r  thishostr?   )r~   rE   r  r  rt   rK   Z	localnamer  erg   r  r  rc   Zurlfiler/  rI   rI   rJ   r    s:    (	
"zURLopener.open_local_filec             C   ss  t  | t  s t d   d d  l } t |  \ } } | sK t d   t |  \ } } t |  \ } } | r t |  \ } } n d  } t |  } t | p d  } t | p d  } t	 j
 |  } | s d d  l } | j } n t |  } t |  \ } }	 t |  } | j d  }
 |
 d  d  |
 d }
 } |
 rb|
 d rb|
 d d   }
 |
 r}|
 d r}d |
 d <| | | d j |
  f } t |  j  t k rxD t |  j  D]3 } | | k r|  j | } |  j | =| j   qWy-| |  j k r%t | | | | |
  |  j | <| s4d } n d } xJ |	 D]B } t |  \ } } | j   d	 k rA| d k rA| j   } qAW|  j | j | |  \ } } | j d |  d } d } | r| d | 7} | d  k	 r| d k r| d | 7} t j |  } t | | d |  SWnK t   k
 rn} z( t d |  j  t! j"   d   WYd  d  } ~ Xn Xd  S)NzCftp error: proxy support for ftp protocol currently not implementedr   zftp error: no host givenrl   r   rO   r  rR  r   r  r  r   rz  zftp:zContent-Type: %s
zContent-Length: %d
zftp error %rr   rP   rP   )r  r  r   rR  rz  r  )#r   r   r   r  r   r   r   r   r
   r   r  r  r  r\   r   r>  r  r^   r  MAXFTPCACHEr   r   r  r   rr   r  r  r  r  r  r   	ftperrorsr  r  r  )r~   rE   r  rt   rU   r/  r  r   r  r  r  rK   r   r   r   r   r  r   rb   r  r  rc   r  rI   rI   rJ   open_ftp  sp        

 	zURLopener.open_ftpc       	      C   s  t  | t  s t d   y | j d d  \ } } Wn! t k
 rZ t d d   Yn X| sg d } | j d  } | d k r d	 | | d   k r | | d d   } | d  |  } n d
 } g  } | j d t j	 d t j
 t j      | j d |  | d k r8t 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  rO   z
data errorzbad data URLztext/plain;charset=US-ASCII;r   r  rl   zDate: %sz%a, %d %b %Y %H:%M:%S GMTzContent-type: %sr  r  zlatin-1zContent-Length: %d
)r   r   r   r>  r?   rk   rfindr[   rd  strftimegmtimer  r  r  r  r
   r^   r  r  r  r  StringIOr   )	r~   rE   rF   r   Zsemir   r   rc   frI   rI   rJ   	open_data  s6    "$zURLopener.open_data)r   r   r   r  r   r  r   r  r   r  r  rD   r  r  r  r  r  r  r   r@   r   r  r  r  r	  r  rI   rI   rI   rJ   r8   E  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 d  Z
 d 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   s2   t  j |  | |  i  |  _ d |  _ d |  _ d  S)Nr   r   )r8   r   
auth_cachetriesmaxtries)r~   r   r7  rI   rI   rJ   r     s    		zFancyURLopener.__init__c             C   s   t  | | d | |  S)Nzhttp:)r   )r~   rE   rb   r  r  rc   rI   rI   rJ   r     s    z!FancyURLopener.http_error_defaultNc       	      C   s   |  j  d 7_  z{ |  j rg |  j  |  j k rg t |  d  rH |  j } n	 |  j } | | | d d |  S|  j | | | | | |  } | SWd  d |  _  Xd  S)NrO   http_error_500i  z)Internal Server Error: Redirect Recursionr   )r  r  r   r  r   redirect_internal)	r~   rE   rb   r  r  rc   rF   r   re   rI   rI   rJ   r
    s    	zFancyURLopener.http_error_302c       	      C   s   d | k r | d } n d | k r2 | d } n d  S| j    t |  j d | |  } t |  } | j d	 k r t | | | d | | |   |  j |  S)
Nr   r   r  r   r   r   rl   z( Redirection to url '%s' is not allowed.)zhttpzhttpszftprl   )r   r   r   r   r  r   rD   )	r~   rE   rb   r  r  rc   rF   r   r  rI   rI   rJ   r  "  s    
	z FancyURLopener.redirect_internalc             C   s   |  j  | | | | | |  S)N)r
  )r~   rE   rb   r  r  rc   rF   rI   rI   rJ   r  >  s    zFancyURLopener.http_error_301c             C   s   |  j  | | | | | |  S)N)r
  )r~   rE   rb   r  r  rc   rF   rI   rI   rJ   r  B  s    zFancyURLopener.http_error_303c             C   sE   | d  k r( |  j  | | | | | |  S|  j | | | | |  Sd  S)N)r
  r   )r~   rE   rb   r  r  rc   rF   rI   rI   rJ   r  F  s    zFancyURLopener.http_error_307Fc             C   s  d | k r( t  j |  | | | | |  | d } t j d |  }	 |	 sf t  j |  | | | | |  |	 j   \ }
 } |
 j   d k r t  j |  | | | | |  | s t  j |  | | | | |  d |  j d } | d  k r t |  |  | |  St |  |  | | |  Sd  S)Nzwww-authenticatez![ 	]*([^ 	]+)[ 	]+realm="([^"]*)"r;  Zretry__basic_auth)r8   r   rP  matchrA  rr   r   r   )r~   rE   rb   r  r  rc   rF   r{  stuffr  r  r&  rY   rI   rI   rJ   rT  M  s&    
zFancyURLopener.http_error_401c             C   s  d | k r( t  j |  | | | | |  | d } t j d |  }	 |	 sf t  j |  | | | | |  |	 j   \ }
 } |
 j   d k r t  j |  | | | | |  | s t  j |  | | | | |  d |  j d } | d  k r t |  |  | |  St |  |  | | |  Sd  S)Nzproxy-authenticatez![ 	]*([^ 	]+)[ 	]+realm="([^"]*)"r;  Zretry_proxy_r  )r8   r   rP  r  rA  rr   r   r   )r~   rE   rb   r  r  rc   rF   r{  r  r  r  r&  rY   rI   rI   rJ   rU  f  s&    
zFancyURLopener.http_error_407c             C   s  t  |  \ } } d | | } |  j d } t |  \ } }	 t  |	  \ }	 }
 |	 j d  d } |	 | d   }	 |  j |	 | |  \ } } | p | s d  Sd t | d d t | d d |	 f }	 d |	 |
 |  j d <| d  k r |  j |  S|  j | |  Sd  S)Nzhttp://r   @rO   z%s:%s@%sr   rl   )r   r  r   r   get_user_passwdr	   rD   )r~   rE   r&  rF   rt   r   r   r  r  r  proxyselectorr   r  r   rI   rI   rJ   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 |	 | |  \ } } | p | s d  Sd t | d d t | d d |	 f }	 d |	 |
 |  j d <| d  k r |  j |  S|  j | |  Sd  S)Nzhttps://r   r  rO   z%s:%s@%sr   rl   )r   r  r   r   r  r	   rD   )r~   rE   r&  rF   rt   r   r   r  r  r  r  r   r  r   rI   rI   rJ   retry_proxy_https_basic_auth  s      z+FancyURLopener.retry_proxy_https_basic_authc       
      C   s   t  |  \ } } | j d  d } | | d   } |  j | | |  \ } } | pY | s` d  Sd t | d d t | d d | f } d | | }	 | d  k r |  j |	  S|  j |	 |  Sd  S)Nr  rO   z%s:%s@%sr   rl   zhttp://)r   r   r  r	   rD   )
r~   rE   r&  rF   rt   r   r   r  r   r   rI   rI   rJ   rE    s     z$FancyURLopener.retry_http_basic_authc       
      C   s   t  |  \ } } | j d  d } | | d   } |  j | | |  \ } } | pY | s` d  Sd t | d d t | d d | f } d | | }	 | d  k r |  j |	  S|  j |	 |  Sd  S)Nr  rO   z%s:%s@%sr   rl   zhttps://)r   r   r  r	   rD   )
r~   rE   r&  rF   rt   r   r   r  r   r   rI   rI   rJ   retry_https_basic_auth  s     z%FancyURLopener.retry_https_basic_authr   c             C   s   | d | j    } | |  j k rA | r6 |  j | =n |  j | S|  j | |  \ } } | se | rx | | f |  j | <| | f S)Nr  )rr   r  prompt_user_passwd)r~   rt   r&  r  r   r  r   rI   rI   rJ   r    s     zFancyURLopener.get_user_passwdc             C   sp   d d  l  } y@ t d | | f  } | j  d | | | f  } | | f SWn t k
 rk t   d SYn Xd  S)Nr   zEnter username for %s at %s: z#Enter password for %s in %s at %s: )NN)getpassinputKeyboardInterruptprint)r~   rt   r&  r!  r  r   rI   rI   rJ   r     s    	z!FancyURLopener.prompt_user_passwd)r   r   r   r   r   r
  r  r  r  r  rT  rU  r  r  rE  r  r  r   rI   rI   rI   rJ   r9     s"   c               C   s   t  d  k r t j d  a  t  S)Nr  )
_localhostr   r  rI   rI   rI   rJ   r    s    r  c               C   sd   t  d  k r` y# t t j t j    d  a  Wn. t j k
 r_ t t j d  d  a  Yn Xt  S)Nr   r  )	_thishostr%  r   r  r  r  rI   rI   rI   rJ   r    s    #r  c              C   s%   t  d  k r! d d  l }  |  j a  t  S)Nr   )
_ftperrorsr  r  )r  rI   rI   rJ   r    s    	r  c               C   s   t  d  k r t j d  a  t  S)Nrl   )
_noheadersr  r  rI   rI   rI   rJ   	noheaders  s    r)  c               @   sj   e  Z d  Z d 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   sr   | |  _  | |  _ | |  _ | |  _ | |  _ | |  _ d |  _ | |  _ y |  j   Wn |  j	     Yn Xd  S)Nr   )
r  r   rt   r/  r  rG   refcount	keepaliveinitr   )r~   r  r   rt   r/  r  rG   r  rI   rI   rJ   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   connectrt   r/  rG   Zloginr  r   r  r  cwd)r~   r  _targetrI   rI   rJ   r,  	  s    	zftpwrapper.initc          -   C   s1  d d  l  } |  j   | d k r1 d } d } n d | } d } y |  j j |  Wn/ | j k
 r |  j   |  j j |  Yn Xd  } | r*| r*y& d | } |  j j |  \ } } Wng | j k
 r)} zD t |  d  d  d	 k rt	 d
 |  j
 t j   d   WYd  d  } ~ Xn X| s|  j j d  | r|  j j   }	 zV y |  j j |  Wn; | j k
 r} z t	 d
 |  |  WYd  d  } ~ Xn XWd  |  j j |	  Xd | } n d } |  j j |  \ } } d |  _ t | j d  |  j  }
 |  j d 7_ | j   |
 | f S)Nr   rz  r  zTYPE ArO   zTYPE zRETR r:   Z550zftp error: %rr   zLIST LISTr  )rz  r  )r  endtransferr   Zvoidcmdr  r,  ZntransfercmdZ
error_permr   r   r  r  r  pwdr/  r-  r   makefile
file_closer*  r   )r~   rK   r   r  cmdisdirr  r  r  r3  ZftpobjrI   rI   rJ   r  	  sN    
  	
 

&*	
zftpwrapper.retrfilec             C   s   d |  _  d  S)Nr   )r-  )r~   rI   rI   rJ   r2  I	  s    zftpwrapper.endtransferc             C   s&   d |  _  |  j d k r" |  j   d  S)NFr   )r+  r*  
real_close)r~   rI   rI   rJ   r   L	  s    	zftpwrapper.closec             C   s@   |  j    |  j d 8_ |  j d k r< |  j r< |  j   d  S)NrO   r   )r2  r*  r+  r8  )r~   rI   rI   rJ   r5  Q	  s    
zftpwrapper.file_closec             C   s7   |  j    y |  j j   Wn t   k
 r2 Yn Xd  S)N)r2  r   r   r  )r~   rI   rI   rJ   r8  W	  s
    
zftpwrapper.real_close)
r   r   r   r   r,  r  r2  r   r5  r8  rI   rI   rI   rJ   r   	  s   	-r  c              C   s   i  }  xY t  j j   D]H \ } } | j   } | r | d d   d k r | |  | d  d  <q Wxv t  j j   D]e \ } } | d d   d k rr | j   } | r | |  | d  d  <qr |  j | d  d  d   qr W|  S)N   _proxyiiiii)rT   environry   rr   r   )r  rY   r   rI   rI   rJ   getproxies_environment_	  s    	r<  c             C   s   | d  k r t    } y | d } Wn t k
 r; d SYn X| d k rL d St |   \ } } d d   | j d  D } xa | D]Y } | r t j |  } d | } t j | | t j  s t j | |  t j  r d Sq Wd S)	Nnor   *rO   c             S   s   g  |  ] } | j     q SrI   )rN  )r   r  rI   rI   rJ   r$  	  s   	 z,proxy_bypass_environment.<locals>.<listcomp>r  z
(.+\.)?%s$)r<  rs  r   r>  rP  r  r  rR  )rt   r  Zno_proxyhostonlyr/  Zno_proxy_listrY   patternrI   rI   rJ   proxy_bypass_environmentx	  s$    		
rA  c             C   sz  d d l  m  } t |   \ } } d d   } d |  k rH | d rH d Sd  } x%| j d f   D]} | sp qa t j d	 |  } | d  k	 r_| d  k r y t j |  } | |  } Wn t k
 r wa Yn X| | j d
   }	 | j d  }
 |
 d  k r$d | j d
  j	 d  d
 }
 n t
 |
 d
 d    }
 d |
 }
 | |
 ?|	 |
 ?k rrd Sqa | |  |  ra d Sqa Wd S)Nr   )fnmatchc             S   s   |  j  d  } t t t |   } t |  d k rV | d d d d g d  d  } | d d >| d d >B| d d >B| d	 BS)
N.r   r      rO   rc  r   rN   r:   )r>  r   r  r\   r^   )ZipAddrr.  rI   rI   rJ   ip2num	  s
     z,_proxy_bypass_macosx_sysconf.<locals>.ip2numrC  Zexclude_simpleT
exceptionsz(\d+(?:\.\d+)*)(/\d+)?rO   r   rN       F)rB  r   r   rP  r  r   r  rk   groupcountr\   )rt   proxy_settingsrB  r?  r/  rE  ZhostIPr   r   r2  maskrI   rI   rJ   _proxy_bypass_macosx_sysconf	  s:    
 #
rL  darwin)_get_proxy_settings_get_proxiesc             C   s   t    } t |  |  S)N)rN  rL  )rt   rJ  rI   rI   rJ   proxy_bypass_macosx_sysconf	  s    	rP  c               C   s   t    S)N)rO  rI   rI   rI   rJ   getproxies_macosx_sysconf	  s    rQ  c             C   s*   t    } | r t |  |  St |   Sd  S)N)r<  rA  rP  )rt   r  rI   rI   rJ   r  	  s    	r  c               C   s   t    p t   S)N)r<  rQ  rI   rI   rI   rJ   r5   	  s    c              C   sf  i  }  y d d  l  } Wn t k
 r. |  SYn Xy| j | j d  } | j | d  d } | r9t | j | d  d  } d | k r x | j d  D]J } | j d d  \ } } t j d |  s d	 | | f } | |  | <q WnM | d  d
  d k r| |  d <n* d | |  d <d | |  d <d | |  d <| j	   Wn t
 t t f k
 raYn X|  S)Nr   z;Software\Microsoft\Windows\CurrentVersion\Internet SettingsProxyEnableZProxyServerr  r
  rO   z^([^/:]+)://z%s://%srZ  zhttp:r   z	http://%sz
https://%sr   zftp://%sr   )winregImportErrorOpenKeyHKEY_CURRENT_USERQueryValueExr   r>  rP  r  ZCloserk   r?   r   )r  rS  internetSettingsproxyEnableZproxyServerpr   addressrI   rI   rJ   getproxies_registry	  s8    			r\  c               C   s   t    p t   S)N)r<  r\  rI   rI   rI   rJ   r5   &
  s    c          &   C   s  y d d  l  } Wn t k
 r( d SYn XyK | j | j d  } | j | d  d } t | j | d  d  } Wn t k
 r d SYn X| s | r d St |   \ } } | g }  y, t j	 |  } | | k r |  j
 |  Wn t k
 r Yn Xy, t j |  } | | k r&|  j
 |  Wn t k
 r;Yn X| j d  } x | D] }	 |	 d k rtd | k rtd S|	 j d d	  }	 |	 j d
 d  }	 |	 j d d  }	 x* |  D]" }
 t j |	 |
 t j  rd SqWqRWd S)Nr   z;Software\Microsoft\Windows\CurrentVersion\Internet SettingsrR  ZProxyOverrider
  z<local>rC  rO   z\.r>  z.*?)rS  rT  rU  rV  rW  r   rk   r   r   r  r[   getfqdnr>  r   rP  r  rR  )rt   rS  rX  rY  ZproxyOverrideZrawHostr/  addrZfqdnr3  r   rI   rI   rJ   proxy_bypass_registry/
  sR    					r`  c             C   s*   t    } | r t |  |  St |   Sd  S)N)r<  rA  r`  )rt   r  rI   rI   rJ   r  a
  s    	)~r  r   r  rg  Zhttp.clientr   r  rT   r0  rP  r   r  r  rd  r  rW   rQ   rB  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   rA   rT  r@   __all__r  r   rC   r   r0   r1   rZ   r6   r7   rQ  ASCIIrp   ru   r   r   r2   r   r/   r   r   r  r   r    r!   r"   r#   r$   r%   urandomrf  r&   r'   r(   r|  r)   r   r   rB   r[   r   r.   r]  r_  r*   r  r+   r,   r-   r  rY   Z
nturl2pathr4   r3   r  r8   r9   r%  r  r&  r  r'  r  r(  r)  r  r<  rA  rL  platformZ_scproxyrN  rO  rP  rQ  r  r5   r\  r`  rI   rI   rI   rJ   <module>T   s   v					!?n$q*@
P	r
+4:5! 

_"<
-	2