B
    v9a               	   @   s  d dl mZmZmZmZmZ d dlmZ d dl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yd dlZW n ek
r   dZY nX d*ddZd	d
 ZG dd dZG dd deZG dd dejeZG dd deZG dd deZG dd dejZG dd dZG dd deZ G dd deeZ!G dd deeZ"e#dkrd dl$Z$G d d! d!Z%ed"~Z&e&'e( e&'d#d$ d% e&j)e% dd& e&*  e+d' e+d( ye&,  W n( e-k
r   e+d) e.d  Y nX W dQ R X dS )+    )Faultdumpsloadsgzip_encodegzip_decode)BaseHTTPRequestHandler)partial)	signatureNTc             C   sJ   |r| d}n|g}x.|D ]&}|dr8t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   /usr/lib/python3.7/server.pyresolve_dotted_attribute{   s    


r   c                s    fddt  D S )Nc                s(   g | ] }| d s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               @   sl   e Zd ZdddZdddZdddZd	d
 Zdd ZdddZdd Z	dd Z
dd Zdd Zdd ZdS )SimpleXMLRPCDispatcherFNc             C   s&   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   s2   |d krt | j|dS |d kr$|j}|| j|< |S )N)name)r   register_function__name__r   )r#   Zfunctionr&   r   r   r   r'      s    
z(SimpleXMLRPCDispatcher.register_functionc             C   s   | j | j| j| jd d S )N)z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 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   yPt || jd\}}|d k	r(|||}n| ||}|f}t|d| j| jd}W n tk
r } zt|| j| jd}W d d }~X Y nN   t \}}	}
z$ttdd||	f | j| jd}W d d  } }	}
X Y nX |	| jdS )N)r"      )Zmethodresponser    r!   )r    r!   z%s:%s)r!   r    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d k	rVt| jdr8|t | j O }nt| jdsV|t t| jO }t|S )N_listMethodsr2   )setr   keysr   hasattrrA   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 | }nX| jd k	rrt| jdr<| j|S t| jdsryt| j|| j}W n tk
rp   Y nX |d kr~dS t|S d S )N_methodHelpr2    )	r   r   rD   rH   r   r   r   pydocgetdoc)r#   rG   r:   r   r   r   r,   ;  s"    

z(SimpleXMLRPCDispatcher.system_methodHelpc       
      C   s   g }x|D ]}|d }|d }y| | ||g W q
 tk
rl } z| |j|jd W d d }~X Y q
   t \}}}	z| dd||f d W d d  } }}	X Y q
X q
W |S )NZ
methodNamer9   )	faultCodefaultStringr0   z%s:%s)appendr2   r   rL   rM   r3   r4   )
r#   Z	call_listresultsZcallrG   r9   r<   r=   r>   r?   r   r   r   r.   Z  s$    

z'SimpleXMLRPCDispatcher.system_multicallc             C   s   y| j | }W n tk
r"   Y nX |d k	r4|| S td| | jd k	rt| jdrd| j||S yt| j|| j}W n tk
r   Y nX |d k	r|| S td| d S )Nzmethod "%s" is not supportedr2   )	r   KeyError	Exceptionr   rD   r2   r   r   r   )r#   r:   r9   funcr   r   r   r2   ~  s(    
z SimpleXMLRPCDispatcher._dispatch)FNF)F)NN)NN)r(   
__module____qualname__r$   r%   r'   r-   r/   r@   r*   r+   r,   r.   r2   r   r   r   r   r      s   	 

$

)$r   c               @   sb   e Zd ZdZdZdZdZe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ZdS )SimpleXMLRPCRequestHandler)/z/RPC2ix  Tz
                            \s* ([^\s;]+) \s*            #content-coding
                            (;\s* q \s*=\s* ([0-9\.]+))? #q
                            c             C   sb   i }| j dd}xJ|dD ]<}| j|}|r|d}|rHt|nd}|||d< qW |S )NzAccept-EncodingrI   ,   g      ?r0   )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S dS d S )NT)	rpc_pathsr8   )r#   r   r   r   is_rpc_path_valid  s    z,SimpleXMLRPCRequestHandler.is_rpc_path_validc          
   C   s  |   s|   d S yd}t| jd }g }x>|rjt||}| j|}|sNP || |t|d 8 }q.W d	|}| 
|}|d krd S | j|t| dd | j}W n tk
r8 } zp| d t| jdr| jjr| dt| t }	t|	d	d
d	}	| d|	 | dd |   W d d }~X Y nX | d | dd | jd k	rt|| jkr|  dd}
|
ryt|}| dd W n tk
r   Y nX | dtt| |   | j| d S )Ni   zcontent-lengthrW       r2   i  _send_traceback_headerzX-exceptionASCIIbackslashreplacezX-tracebackzContent-length0   zContent-typeztext/xmlgzipr   zContent-Encoding) re   
report_404intrZ   minZrfilereadrN   lenjoindecode_request_contentserverr@   r   r8   rQ   send_responserD   rg   send_headerstr	traceback
format_excr5   end_headersencode_thresholdrc   r[   r   NotImplementedErrorwfilewrite)r#   Zmax_chunk_sizeZsize_remainingLZ
chunk_sizechunkr6   r;   ra   Ztraceqr   r   r   do_POST  sX    






z"SimpleXMLRPCRequestHandler.do_POSTc             C   s   | j dd }|dkr|S |dkrtyt|S  tk
rR   | dd|  Y q tk
rp   | dd Y qX n| dd|  | dd	 |   d S )
Nzcontent-encodingidentityrl   i  zencoding %r not supportedi  zerror decoding gzip contentzContent-lengthrj   )	rZ   r[   lowerr   r|   ru   
ValueErrorrv   rz   )r#   r6   r!   r   r   r   rs   #  s    z1SimpleXMLRPCRequestHandler.decode_request_contentc             C   sF   |  d d}| dd | dtt| |   | j| d S )Ni  s   No such pagezContent-typez
text/plainzContent-length)ru   rv   rw   rq   rz   r}   r~   )r#   r;   r   r   r   rm   4  s    
z%SimpleXMLRPCRequestHandler.report_404-c             C   s   | j jrt| || d S )N)rt   logRequestsr   log_request)r#   codesizer   r   r   r   =  s    z&SimpleXMLRPCRequestHandler.log_requestN)r   r   )r(   rS   rT   rd   r{   ZwbufsizeZdisable_nagle_algorithmrecompileVERBOSE
IGNORECASEr\   rc   re   r   rs   rm   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fddZdS )SimpleXMLRPCServerTFNc             C   s,   || _ t| ||| tj| ||| d S )N)r   r   r$   socketserver	TCPServer)r#   addrrequestHandlerr   r    r!   bind_and_activater"   r   r   r   r$   V  s    zSimpleXMLRPCServer.__init__)r(   rS   rT   Zallow_reuse_addressrg   rU   r$   r   r   r   r   r   C  s
   r   c               @   s<   e Zd ZedddddfddZdd Zdd	 Zdd
dZdS )MultiPathXMLRPCServerTFNc          
   C   s2   t | ||||||| i | _|| _|p*d| _d S )Nzutf-8)r   r$   dispatchersr    r!   )r#   r   r   r   r    r!   r   r"   r   r   r   r$   g  s
    
zMultiPathXMLRPCServer.__init__c             C   s   || j |< |S )N)r   )r#   r8   Z
dispatcherr   r   r   add_dispatcherq  s    
z$MultiPathXMLRPCServer.add_dispatcherc             C   s
   | j | S )N)r   )r#   r8   r   r   r   get_dispatcheru  s    z$MultiPathXMLRPCServer.get_dispatcherc             C   s|   y| j | |||}W n^   t d d \}}z2ttdd||f | j| jd}|| jd}W d d  }}X Y nX |S )N   r0   z%s:%s)r!   r    r1   )	r   r@   r3   r4   r   r   r!   r    r5   )r#   r6   r7   r8   r;   r=   r>   r   r   r   r@   x  s    
z)MultiPathXMLRPCServer._marshaled_dispatch)NN)r(   rS   rT   rU   r$   r   r   r@   r   r   r   r   r   _  s   r   c               @   s0   e Zd ZdddZdd Zdd Zdd	d
ZdS )CGIXMLRPCRequestHandlerFNc             C   s   t | ||| d S )N)r   r$   )r#   r    r!   r"   r   r   r   r$     s    z CGIXMLRPCRequestHandler.__init__c             C   sP   |  |}td tdt|  t  tj  tjj| tjj  d S )NzContent-Type: text/xmlzContent-Length: %d)r@   printrq   r3   stdoutflushbufferr~   )r#   request_textr;   r   r   r   handle_xmlrpc  s    

z%CGIXMLRPCRequestHandler.handle_xmlrpcc             C   s   d}t j| \}}tjj|||d }|d}td||f  tdtjj  tdt|  t  t	j
  t	j
j| t	j
j  d S )Ni  )r   messageexplainzutf-8zStatus: %d %szContent-Type: %szContent-Length: %d)r   Z	responseshttprt   ZDEFAULT_ERROR_MESSAGEr5   r   ZDEFAULT_ERROR_CONTENT_TYPErq   r3   r   r   r   r~   )r#   r   r   r   r;   r   r   r   
handle_get  s    


z"CGIXMLRPCRequestHandler.handle_getc          	   C   sz   |d kr$t jdd dkr$|   nRytt jdd }W n ttfk
rV   d}Y nX |d krltj	|}| 
| d S )NZREQUEST_METHODZGETZCONTENT_LENGTHrW   )osenvironr[   r   rn   r   	TypeErrorr3   stdinrp   r   )r#   r   lengthr   r   r   handle_request  s    

z&CGIXMLRPCRequestHandler.handle_request)FNF)N)r(   rS   rT   r$   r   r   r   r   r   r   r   r     s   
r   c               @   s:   e Zd Zdi i i fddZdi i i dfddZdd ZdS )ServerHTMLDocNc             C   s^  |p| j }g }d}td}x|||}	|	s2P |	 \}
}|||||
  |	 \}}}}}}|r||dd}|d||f  n|rdt| }|d|||f  n~|rdt| }|d|||f  nV|||d  d	kr|| 	|||| n(|r$|d
|  n|| 	|| |}q W ||||d   d
|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/r0   (zself.<strong>%s</strong>rI   )escaper   r   searchspanrN   groupsreplacern   Znamelinkrr   )r#   textr   r   classesrF   rO   herepatternr]   startendallZschemeZrfcZpepZselfdotr&   Zurlr   r   r   markup  s8    

 zServerHTMLDoc.markupc             C   s   |r
|j pdd | }d}	d| || |f }
t|rHtt|}nd}t|trp|d p`|}|d pld}n
t|}|
| |	o| 	d|	  }| 
|| j|||}|od| }d	||f S )
NrI   r   z$<a name="%s"><strong>%s</strong></a>z(...)r   r0   z'<font face="helvetica, arial">%s</font>z<dd><tt>%s</tt></dd>z<dl><dt>%s</dt>%s</dl>
)r(   r   r   rw   r	   
isinstancetuplerJ   rK   Zgreyr   	preformat)r#   objectr&   modr   r   rF   ZclZanchorZnotetitleZargspecZ	docstringZdecldocr   r   r   
docroutine  s"    

zServerHTMLDoc.docroutinec          	   C   s   i }x,|  D ] \}}d| ||< || ||< qW | |}d| }| |dd}| || j|}	|	old|	 }	|d|	  }g }
t|  }x&|D ]\}}|
| j|||d qW || ddd	d
	|
 }|S )Nz#-z)<big><big><strong>%s</strong></big></big>z#ffffffz#7799eez<tt>%s</tt>z
<p>%s</p>
)r   ZMethodsz#eeaa77rI   )
itemsr   headingr   r   rE   rN   r   Z
bigsectionrr   )r#   server_nameZpackage_documentationrF   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               @   s4   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$   9  s    zXMLRPCDocGenerator.__init__c             C   s
   || _ d S )N)r   )r#   r   r   r   r   set_server_titleA  s    z#XMLRPCDocGenerator.set_server_titlec             C   s
   || _ d S )N)r   )r#   r   r   r   r   set_server_nameF  s    z"XMLRPCDocGenerator.set_server_namec             C   s
   || _ d S )N)r   )r#   r   r   r   r   set_server_documentationK  s    z+XMLRPCDocGenerator.set_server_documentationc          	   C   s   i }x|   D ]}|| jkr(| j| }n| jd k	rd d g}t| jdrV| j||d< t| jdrr| j||d< t|}|dkr|}qt| jdsyt| j|}W q tk
r   |}Y qX q|}n |||< qW t	 }|
| j| j|}|| j|S )N_get_method_argstringr   rH   r0   )NNr2   )r*   r   r   rD   r   rH   r   r   r   r   r   r   r   Zpager   )r#   rF   rG   r:   Zmethod_infoZ
documenterZdocumentationr   r   r   generate_html_documentationP  s8    


z.XMLRPCDocGenerator.generate_html_documentationN)r(   rS   rT   r$   r   r   r   r   r   r   r   r   r   2  s
   r   c               @   s   e Zd Zdd ZdS )DocXMLRPCRequestHandlerc             C   sf   |   s|   d S | j d}| d | dd | dtt| | 	  | j
| d S )Nzutf-8rk   zContent-typez	text/htmlzContent-length)re   rm   rt   r   r5   ru   rv   rw   rq   rz   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fddZdS )DocXMLRPCServerTFNc          
   C   s&   t | ||||||| t|  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   sT   |   d}td tdt|  t  tj  tjj| tjj  d S )Nzutf-8zContent-Type: text/htmlzContent-Length: %d)	r   r5   r   rq   r3   r   r   r   r~   )r#   r;   r   r   r   r     s    
z%DocCGIXMLRPCRequestHandler.handle_getc             C   s   t |  t|  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G d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  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   )Z	localhosti@  c             C   s   | | S )Nr   )xyr   r   r   <lambda>  rf   r   add)r   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.)T)/Zxmlrpc.clientr   r   r   r   r   Zhttp.serverr   	functoolsr   inspectr	   r   r   r3   r   r   rJ   rx   ZfcntlImportErrorr   r   r   rU   r   r   r   r   ZHTMLDocr   r   r   r   r   r(   r   r   rt   r'   powr%   r/   r   Zserve_foreverKeyboardInterruptexitr   r   r   r   <module>k   s^   

   ,EbQ
	

