
W                 @   s  d  d l  m Z m Z m Z m Z m Z d  d l m 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 y d  d l Z Wn e k
 r d Z Yn Xd d d  Z d d   Z Gd	 d
   d
  Z Gd d   d e  Z Gd d   d e	 j e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e j  Z Gd d   d  Z Gd d   d e  Z Gd d   d e e  Z Gd d   d e e  Z e  d k rd  d l! Z! Gd d   d  Z" e d  d! f  Z# e# j$ e%  e# j$ d" d#   d$  e# j& e"   d% d e# j'   e( d&  e( d'  y e# j)   Wn3 e* k
 re( d(  e# j+   e
 j, d   Yn Xd S))    )Faultdumpsloadsgzip_encodegzip_decode)BaseHTTPRequestHandlerNTc             C   sg   | r | j  d  } n	 | g } x? | D]7 } | j d  rP t d |   q( t |  |  }  q( W|  S)N._z(attempt to access private attribute "%s")split
startswithAttributeErrorgetattr)objattrallow_dotted_namesZattrsi r   ;/afs/.cs/s/python-3.5.2/amd64_ubu14/lib/python3.5/server.pyresolve_dotted_attributez   s    
	r   c                s     f d d   t     D S)Nc                s;   g  |  ]1 } | j  d   r t t   |   r |  q S)r	   )r   callabler   ).0member)r   r   r   
<listcomp>   s   	 z'list_public_methods.<locals>.<listcomp>)dir)r   r   )r   r   list_public_methods   s    r   c               @   s   e  Z d  Z d d d d d  Z d d d  Z d d d  Z d	 d
   Z d d   Z d d d d  Z d d   Z	 d d   Z
 d d   Z d d   Z d d   Z d S)SimpleXMLRPCDispatcherFNc             C   s7   i  |  _  d  |  _ | |  _ | p$ d |  _ | |  _ d  S)Nzutf-8)funcsinstance
allow_noneencodinguse_builtin_types)selfr   r   r    r   r   r   __init__   s
    			zSimpleXMLRPCDispatcher.__init__c             C   s   | |  _  | |  _ d  S)N)r   r   )r!   r   r   r   r   r   register_instance   s    !	z(SimpleXMLRPCDispatcher.register_instancec             C   s&   | d  k r | j  } | |  j | <d  S)N)__name__r   )r!   functionnamer   r   r   register_function   s    	z(SimpleXMLRPCDispatcher.register_functionc             C   s/   |  j  j d |  j d |  j d |  j i  d  S)Nzsystem.listMethodszsystem.methodSignaturezsystem.methodHelp)r   updatesystem_listMethodssystem_methodSignaturesystem_methodHelp)r!   r   r   r    register_introspection_functions   s    	z7SimpleXMLRPCDispatcher.register_introspection_functionsc             C   s   |  j  j d |  j i  d  S)Nzsystem.multicall)r   r(   system_multicall)r!   r   r   r   register_multicall_functions   s    z3SimpleXMLRPCDispatcher.register_multicall_functionsc             C   s"  y| t  | d |  j \ } } | d  k	 r< | | |  } n |  j | |  } | f } t | d d d |  j d |  j } Wn t k
 r } z# t | d |  j d |  j } WYd  d  } ~ XnN t j   \ } }	 }
 t t d d | |	 f  d |  j d |  j } Yn X| j	 |  j d  S)Nr    Zmethodresponse   r   r   z%s:%sxmlcharrefreplace)
r   r    	_dispatchr   r   r   r   sysexc_infoencode)r!   datadispatch_methodpathparamsmethodresponsefaultexc_type	exc_valueexc_tbr   r   r   _marshaled_dispatch   s"    	z*SimpleXMLRPCDispatcher._marshaled_dispatchc             C   s   t  |  j j    } |  j d  k	 r} t |  j d  rR | t  |  j j    O} n+ t |  j d  s} | t  t |  j   O} t |  S)N_listMethodsr1   )setr   keysr   hasattrr@   r   sorted)r!   methodsr   r   r   r)     s    z)SimpleXMLRPCDispatcher.system_listMethodsc             C   s   d S)Nzsignatures not supportedr   )r!   method_namer   r   r   r*   $  s    z-SimpleXMLRPCDispatcher.system_methodSignaturec             C   s   d  } | |  j  k r% |  j  | } nt |  j d  k	 r t |  j d  rV |  j j |  St |  j d  s y t |  j | |  j  } Wn t k
 r Yn X| d  k r d St j |  Sd  S)N_methodHelpr1    )	r   r   rC   rG   r   r   r   pydocgetdoc)r!   rF   r9   r   r   r   r+   1  s"    z(SimpleXMLRPCDispatcher.system_methodHelpc       
      C   s   g  } x | D] } | d } | d } y  | j  |  j | |  g  Wq t k
 r } z$ | j  d | j d | j i  WYd  d  } ~ Xq t j   \ } } }	 | j  d d d d | | f i  Yq Xq W| S)NZ
methodNamer8   	faultCodefaultStringr/   z%s:%s)appendr1   r   rK   rL   r2   r3   )
r!   Z	call_listresultscallrF   r8   r;   r<   r=   r>   r   r   r   r-   P  s     


 	" z'SimpleXMLRPCDispatcher.system_multicallc             C   s   d  } y |  j  | } Wnw t k
 r |  j d  k	 r t |  j d  r[ |  j j | |  Sy t |  j | |  j  } Wn t k
 r Yn XYn X| d  k	 r | |   St d |   d  S)Nr1   zmethod "%s" is not supported)	r   KeyErrorr   rC   r1   r   r   r   	Exception)r!   r9   r8   funcr   r   r   r1   p  s"    

z SimpleXMLRPCDispatcher._dispatch)r$   
__module____qualname__r"   r#   r'   r,   r.   r?   r)   r*   r+   r-   r1   r   r   r   r   r      s   	$% r   c               @   s   e  Z d  Z d Z d Z d Z d Z e j d e j	 e j
 B Z d d   Z d	 d
   Z d d   Z d d   Z d d   Z d d d d  Z d S)SimpleXMLRPCRequestHandler//RPC2ix  r/   Tz
                            \s* ([^\s;]+) \s*            #content-coding
                            (;\s* q \s*=\s* ([0-9\.]+))? #q
                            c             C   s   i  } |  j  j d d  } xi | j d  D]X } |  j j |  } | r+ | j d  } | rj t |  n d } | | | j d  <q+ W| S)NzAccept-EncodingrH   ,   g      ?r/   )headersgetr
   	aepatternmatchgroupfloat)r!   rZaeer]   vr   r   r   accept_encodings  s    z+SimpleXMLRPCRequestHandler.accept_encodingsc             C   s!   |  j  r |  j |  j  k Sd Sd  S)NT)	rpc_pathsr7   )r!   r   r   r   is_rpc_path_valid  s    	z,SimpleXMLRPCRequestHandler.is_rpc_path_validc             C   sp  |  j    s |  j   d  Sy d } t |  j d  } g  } xS | r t | |  } |  j j |  } | sm P| j |  | t | d  8} q? Wd j	 |  } |  j
 |  } | d  k r d  S|  j j | t |  d d   |  j  } Wn t k
 r} z |  j d  t |  j d  ru|  j j ru|  j d	 t |   t j   }	 t |	 j d
 d  d
  }	 |  j d |	  |  j d d  |  j   WYd  d  } ~ Xn X|  j d  |  j d d  |  j d  k	 r6t |  |  j k r6|  j   j d d  }
 |
 r6y  t |  } |  j d d  Wn t k
 r5Yn X|  j d t t |    |  j   |  j j |  d  S)N
   i   zcontent-lengthr/       r1   i  _send_traceback_headerzX-exceptionASCIIbackslashreplacezX-tracebackzContent-length0   zContent-typeztext/xmlgzipr   zContent-Encodingi (  i   ) re   
report_404intrZ   minZrfilereadrM   lenjoindecode_request_contentserverr?   r   r7   rQ   send_responserC   rh   send_headerstr	traceback
format_excr4   end_headersencode_thresholdrc   r[   r   NotImplementedErrorwfilewrite)r!   Zmax_chunk_sizeZsize_remainingLZ
chunk_sizechunkr5   r:   ra   Ztraceqr   r   r   do_POST  sX    
		"
z"SimpleXMLRPCRequestHandler.do_POSTc             C   s   |  j  j d d  j   } | d k r+ | S| d k r y t |  SWq t k
 rm |  j d d |  Yq t k
 r |  j d d  Yq Xn |  j d d |  |  j d d	  |  j   d  S)
Nzcontent-encodingidentityrm   i  zencoding %r not supportedi  zerror decoding gzip contentzContent-lengthrk   )	rZ   r[   lowerr   r~   rw   
ValueErrorrx   r|   )r!   r5   r   r   r   r   ru     s    z1SimpleXMLRPCRequestHandler.decode_request_contentc             C   s]   |  j  d  d } |  j d d  |  j d t t |    |  j   |  j j |  d  S)Ni  s   No such pagezContent-typez
text/plainzContent-length)rw   rx   ry   rs   r|   r   r   )r!   r:   r   r   r   ro   !  s    
z%SimpleXMLRPCRequestHandler.report_404-c             C   s#   |  j  j r t j |  | |  d  S)N)rv   logRequestsr   log_request)r!   codesizer   r   r   r   *  s    z&SimpleXMLRPCRequestHandler.log_requestN)rV   rW   rn   )r$   rS   rT   rd   r}   ZwbufsizeZdisable_nagle_algorithmrecompileVERBOSE
IGNORECASEr\   rc   re   r   ru   ro   r   r   r   r   r   rU     s   	G	rU   c               @   s:   e  Z d  Z d Z d Z e d d d d d d d  Z d S)SimpleXMLRPCServerTFNc             C   s<   | |  _  t j |  | | |  t j j |  | | |  d  S)N)r   r   r"   socketserver	TCPServer)r!   addrrequestHandlerr   r   r   bind_and_activater    r   r   r   r"   C  s    	zSimpleXMLRPCServer.__init__)r$   rS   rT   Zallow_reuse_addressrh   rU   r"   r   r   r   r   r   0  s
   	r   c               @   sX   e  Z d  Z e d d d d d d d  Z d d   Z d d	   Z d d d
 d  Z d S)MultiPathXMLRPCServerTFNc          	   C   sG   t  j |  | | | | | | |  i  |  _ | |  _ | p= d |  _ d  S)Nzutf-8)r   r"   dispatchersr   r   )r!   r   r   r   r   r   r   r    r   r   r   r"   T  s
    		zMultiPathXMLRPCServer.__init__c             C   s   | |  j  | <| S)N)r   )r!   r7   Z
dispatcherr   r   r   add_dispatcher^  s    z$MultiPathXMLRPCServer.add_dispatcherc             C   s   |  j  | S)N)r   )r!   r7   r   r   r   get_dispatcherb  s    z$MultiPathXMLRPCServer.get_dispatcherc             C   s   y  |  j  | j | | |  } Wnj t j   d  d  \ } } t t d d | | f  d |  j d |  j } | j |  j d  } Yn X| S)N   r/   z%s:%sr   r   r0   )	r   r?   r2   r3   r   r   r   r   r4   )r!   r5   r6   r7   r:   r<   r=   r   r   r   r?   e  s    z)MultiPathXMLRPCServer._marshaled_dispatch)r$   rS   rT   rU   r"   r   r   r?   r   r   r   r   r   L  s   	r   c               @   sL   e  Z d  Z d d d d d  Z d d   Z d d   Z d d	 d
  Z d S)CGIXMLRPCRequestHandlerFNc             C   s   t  j |  | | |  d  S)N)r   r"   )r!   r   r   r    r   r   r   r"   w  s    z CGIXMLRPCRequestHandler.__init__c             C   sh   |  j  |  } t d  t d t |   t   t j j   t j j j |  t j j j   d  S)NzContent-Type: text/xmlzContent-Length: %d)r?   printrs   r2   stdoutflushbufferr   )r!   request_textr:   r   r   r   handle_xmlrpcz  s    
z%CGIXMLRPCRequestHandler.handle_xmlrpcc             C   s   d } t  j | \ } } t j j d | d | d | i } | j d  } t d | | f  t d t j j  t d t |   t   t	 j
 j   t	 j
 j j |  t	 j
 j j   d  S)	Ni  r   messageexplainzutf-8zStatus: %d %szContent-Type: %szContent-Length: %d)r   Z	responseshttprv   ZDEFAULT_ERROR_MESSAGEr4   r   ZDEFAULT_ERROR_CONTENT_TYPErs   r2   r   r   r   r   )r!   r   r   r   r:   r   r   r   
handle_get  s    	z"CGIXMLRPCRequestHandler.handle_getc             C   s   | d  k r4 t  j j d d   d k r4 |  j   nk y t t  j j d d    } Wn t t f k
 rs d } Yn X| d  k r t j j	 |  } |  j
 |  d  S)NZREQUEST_METHODGETZCONTENT_LENGTHr/   rn   )osenvironr[   r   rp   r   	TypeErrorr2   stdinrr   r   )r!   r   lengthr   r   r   handle_request  s    z&CGIXMLRPCRequestHandler.handle_request)r$   rS   rT   r"   r   r   r   r   r   r   r   r   t  s   r   c               @   sO   e  Z d  Z d i  i  i  d d  Z d i  i  i  d d d  Z d d   Z d S)ServerHTMLDocNc             C   s  | p |  j  } g  } d } t j d  } x| j | |  }	 |	 sF P|	 j   \ }
 } | j | | | |
    |	 j   \ } } } } } } | r | |  j d d  } | j d | | f  n | rd t |  } | j d | | |  f  n | r7d t |  } | j d | | |  f  no | | | d  d	 k rs| j |  j	 | | | |   n3 | r| j d
 |  n | j |  j	 | |   | } q- W| j | | | d     d j
 |  S)Nr   zM\b((http|ftp)://\S+[\w/]|RFC[- ]?(\d+)|PEP[- ]?(\d+)|(self\.)?((?:\w|\.)+))\b"z&quot;z<a href="%s">%s</a>z'http://www.rfc-editor.org/rfc/rfc%d.txtz(http://www.python.org/dev/peps/pep-%04d/r/   (zself.<strong>%s</strong>rH   )escaper   r   searchspanrM   groupsreplacerp   Znamelinkrt   )r!   textr   r   classesrE   rN   herepatternr]   startendallschemeZrfcZpepZselfdotr&   Zurlr   r   r   markup  s8       "
zServerHTMLDoc.markupc          	   C   s  | r | j  p d d | } d }	 d |  j |  |  j |  f }
 t j |  r t j |  } t j | j d d   | j | j | j	 d | j
 d |  j } n] t j |  r t j |  } t j | j | j | j | j	 d | j
 d |  j } n d } t | t  r5| d p| } | d p/d } n t j |  } |
 | |	 oa|  j d	 |	  } |  j | |  j | | |  } | od
 | } d | | f S)NrH   r   z$<a name="%s"><strong>%s</strong></a>r/   annotationsformatvaluez(...)r   z'<font face="helvetica, arial">%s</font>z<dd><tt>%s</tt></dd>z<dl><dt>%s</dt>%s</dl>
)r$   r   inspectZismethodZgetfullargspecZformatargspecargsZvarargsZvarkwdefaultsr   r   Z
isfunction
isinstancetuplerI   rJ   Zgreyr   	preformat)r!   objectr&   modr   r   rE   ZclZanchorZnotetitler   ZargspecZ	docstringZdecldocr   r   r   
docroutine  s<    			zServerHTMLDoc.docroutinec             C   s  i  } x6 | j    D]( \ } } d | | | <| | | | <q W|  j |  } d | } |  j | d d  } |  j | |  j |  }	 |	 o d |	 }	 | d |	 } g  }
 t | j     } x3 | D]+ \ } } |
 j |  j | | d |  q W| |  j d d d	 d
 j	 |
   } | S)Nz#-z)<big><big><strong>%s</strong></big></big>z#ffffffz#7799eez<tt>%s</tt>z
<p>%s</p>
r   ZMethodsz#eeaa77rH   )
itemsr   headingr   r   rD   rM   r   Z
bigsectionrt   )r!   server_nameZpackage_documentationrE   Zfdictkeyvalueheadresultr   contentsZmethod_itemsr   r   r   	docserver  s"    
#	zServerHTMLDoc.docserver)r$   rS   rT   r   r   r   r   r   r   r   r     s   ),r   c               @   sL   e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 d
   Z d S)XMLRPCDocGeneratorc             C   s   d |  _  d |  _ d |  _ d  S)NzXML-RPC Server DocumentationzGThis server exports the following methods through the XML-RPC protocol.)r   server_documentationserver_title)r!   r   r   r   r"   2  s    		zXMLRPCDocGenerator.__init__c             C   s   | |  _  d  S)N)r   )r!   r   r   r   r   set_server_title:  s    z#XMLRPCDocGenerator.set_server_titlec             C   s   | |  _  d  S)N)r   )r!   r   r   r   r   set_server_name?  s    z"XMLRPCDocGenerator.set_server_namec             C   s   | |  _  d  S)N)r   )r!   r   r   r   r   set_server_documentationD  s    z+XMLRPCDocGenerator.set_server_documentationc             C   sX  i  } x|  j    D]
} | |  j k r8 |  j | } n |  j d  k	 rd  d  g } t |  j d  r{ |  j j |  | d <t |  j d  r |  j j |  | d <t |  } | d k r | } qt |  j d  s
y t |  j |  } Wqt k
 r| } YqXq| } n  | | | <q Wt	   } | j
 |  j |  j |  } | j |  j |  S)N_get_method_argstringr   rG   r/   r1   )NN)r)   r   r   rC   r   rG   r   r   r   r   r   r   r   Zpager   )r!   rE   rF   r9   Zmethod_infoZ
documenterZdocumentationr   r   r   generate_html_documentationI  s8    				z.XMLRPCDocGenerator.generate_html_documentationN)r$   rS   rT   r"   r   r   r   r   r   r   r   r   r   +  s
   r   c               @   s   e  Z d  Z d d   Z d S)DocXMLRPCRequestHandlerc             C   s   |  j    s |  j   d  S|  j j   j d  } |  j d  |  j d d  |  j d t t |    |  j	   |  j
 j |  d  S)Nzutf-8rl   zContent-typez	text/htmlzContent-length)re   ro   rv   r   r4   rw   rx   ry   rs   r|   r   r   )r!   r:   r   r   r   do_GET  s    

zDocXMLRPCRequestHandler.do_GETN)r$   rS   rT   r   r   r   r   r   r   |  s   
r   c               @   s.   e  Z d  Z e d d d d d d d  Z d S)DocXMLRPCServerTFNc          	   C   s3   t  j |  | | | | | | |  t j |   d  S)N)r   r"   r   )r!   r   r   r   r   r   r   r    r   r   r   r"     s    	zDocXMLRPCServer.__init__)r$   rS   rT   r   r"   r   r   r   r   r     s   	r   c               @   s(   e  Z d  Z d d   Z d d   Z d S)DocCGIXMLRPCRequestHandlerc             C   sn   |  j    j d  } t d  t d t |   t   t j j   t j j j |  t j j j   d  S)Nzutf-8zContent-Type: text/htmlzContent-Length: %d)	r   r4   r   rs   r2   r   r   r   r   )r!   r:   r   r   r   r     s    
z%DocCGIXMLRPCRequestHandler.handle_getc             C   s   t  j |   t j |   d  S)N)r   r"   r   )r!   r   r   r   r"     s    z#DocCGIXMLRPCRequestHandler.__init__N)r$   rS   rT   r   r"   r   r   r   r   r     s   r   __main__c               @   s/   e  Z d  Z d d   Z Gd d   d  Z d S)ExampleServicec             C   s   d S)NZ42r   )r!   r   r   r   getData  s    zExampleService.getDatac               @   s"   e  Z d  Z e d d    Z d S)zExampleService.currentTimec               C   s   t  j  j   S)N)datetimeZnowr   r   r   r   getCurrentTime  s    z)ExampleService.currentTime.getCurrentTimeN)r$   rS   rT   staticmethodr   r   r   r   r   currentTime  s   r   N)r$   rS   rT   r   r   r   r   r   r   r     s   r   	localhosti@  c             C   s   |  | S)Nr   )xyr   r   r   <lambda>  s    r   addr   z&Serving XML-RPC on localhost port 8000zKIt is advisable to run this example server within a secure, closed network.z&
Keyboard interrupt received, exiting.)-xmlrpc.clientr   r   r   r   r   Zhttp.serverr   r   r   r2   r   r   rI   r   rz   ZfcntlImportErrorr   r   r   rU   r   r   r   r   ZHTMLDocr   r   r   r   r   r$   r   r   rv   r'   powr#   r.   r   Zserve_foreverKeyboardInterruptZserver_closeexitr   r   r   r   <module>k   sZ   ( 	(ErQ			




