a
    ze@                  	   @   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d dlZzd dlZW n ey   dZY n0 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( ze'-  W n& e.y   e,d) e/d  Y n0 W d   n1 s0    Y  dS )+    )Faultdumpsloadsgzip_encodegzip_decode)BaseHTTPRequestHandler)partial)	signatureNTc                 C   sF   |r| d}n|g}|D ]&}|dr6td| qt| |} q| S )N._z(attempt to access private attribute "%s")split
startswithAttributeErrorgetattr)objattrallow_dotted_namesattrsi r   #/usr/lib/python3.9/xmlrpc/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>)dirr   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 N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 u rt | j|dS |d u r$|j}|| j|< |S )N)name)r   register_function__name__r"   )r(   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"   r0   system_multicallr4   r   r   r   register_multicall_functions   s    z3SimpleXMLRPCDispatcher.register_multicall_functionsc                 C   s   zPt || jd\}}|d ur(|||}n| ||}|f}t|d| j| jd}W n ty } zt|| j| jd}W Y d }~nbd }~0    t \}}	}
z0ttdd||	f | j| jd}W d  } }	}
nd  } }	}
0 Y n0 |	| jdS )N)r&      )Zmethodresponser$   r%   )r$   r%   %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 urVt| jdr8|t | j O }nt| jdsV|t t| jO }t|S )N_listMethodsr<   )setr"   keysr#   hasattrrK   r   sorted)r(   methodsr   r   r   r1     s    
z)SimpleXMLRPCDispatcher.system_listMethodsc                 C   s   dS )Nzsignatures not supportedr   )r(   method_namer   r   r   r2   /  s    z-SimpleXMLRPCDispatcher.system_methodSignaturec                 C   s   d }|| j v r| j | }nV| jd urpt| jdr<| j|S t| jdspzt| j|| j}W n tyn   Y n0 |d u r|dS t|S d S )N_methodHelpr<    )	r"   r#   rN   rR   r   r   r   pydocgetdoc)r(   rQ   rD   r   r   r   r3   <  s$    

z(SimpleXMLRPCDispatcher.system_methodHelpc           
      C   s   g }|D ]}|d }|d }z| | ||g W q tyl } z | |j|jd W Y d }~qd }~0    t \}}}	z(| dd||f d W d  } }}	nd  } }}	0 Y q0 q|S )NZ
methodNamerC   )	faultCodefaultStringr8   r9   )appendr<   r   rV   rW   r=   r>   )
r(   Z	call_listresultscallrQ   rC   rF   rG   rH   rI   r   r   r   r6   [  s,    

$z'SimpleXMLRPCDispatcher.system_multicallc                 C   s   z| j | }W n ty    Y n0 |d ur2|| S td| | jd urt| jdrb| j||S zt| j|| j}W n ty   Y n0 |d ur|| S td| d S )Nzmethod "%s" is not supportedr<   )	r"   KeyError	Exceptionr#   rN   r<   r   r   r   )r(   rD   rC   funcr   r   r   r<     s*    
z SimpleXMLRPCDispatcher._dispatch)FNF)F)NN)NN)r.   
__module____qualname__r)   r+   r-   r5   r7   rJ   r1   r2   r3   r6   r<   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   s^   i }| j dd}|dD ]<}| j|}|r|d}|rFt|nd}|||d< q|S )NzAccept-EncodingrS   ,   g      ?r8   )headersgetr   	aepatternmatchgroupfloat)r(   rZaeerh   vr   r   r   accept_encodings  s    
z+SimpleXMLRPCRequestHandler.accept_encodingsc                 C   s   | j r| j| j v S dS d S )NT)	rpc_pathsrB   r4   r   r   r   is_rpc_path_valid  s    z,SimpleXMLRPCRequestHandler.is_rpc_path_validc              
   C   s  |   s|   d S zd}t| jd }g }|rht||}| j|}|sLqh|| |t|d 8 }q,d	|}| 
|}|d u rW d S | j|t| dd | j}W n ty8 } zx| d t| jdr| jjr| dt| t }	t|	d	d
d	}	| d|	 | dd |   W Y d }~nd }~0 0 | d | dd | jd urt|| jkr|  dd}
|
rzt|}| dd W n ty   Y n0 | dtt| |   | j| d S )Ni   zcontent-lengthrb       r<   i  _send_traceback_headerzX-exceptionASCIIbackslashreplacezX-tracebackContent-length0   Content-typeztext/xmlgzipr   zContent-Encoding) rp   
report_404intre   minZrfilereadrX   lenjoindecode_request_contentserverrJ   r   rB   r\   send_responserN   rr   send_headerstr	traceback
format_excr?   end_headersencode_thresholdrn   rf   r   NotImplementedErrorwfilewrite)r(   Zmax_chunk_sizeZsize_remainingLZ
chunk_sizechunkr@   rE   rl   Ztraceqr   r   r   do_POST  s\    





z"SimpleXMLRPCRequestHandler.do_POSTc                 C   s   | j dd }|dkr|S |dkrrz
t|W S  tyR   | dd|  Y q tyn   | dd Y q0 n| dd|  | dd	 |   d S )
Nzcontent-encodingidentityry   i  zencoding %r not supported  zerror decoding gzip contentru   rv   )	re   rf   lowerr   r   r   
ValueErrorr   r   )r(   r@   r%   r   r   r   r   $  s    
z1SimpleXMLRPCRequestHandler.decode_request_contentc                 C   sF   |  d d}| dd | dtt| |   | j| d S )Ni  s   No such pagerx   z
text/plainru   )r   r   r   r~   r   r   r   r(   rE   r   r   r   rz   5  s    
z%SimpleXMLRPCRequestHandler.report_404-c                 C   s   | j jrt| || d S r*   )r   logRequestsr   log_request)r(   codesizer   r   r   r   >  s    z&SimpleXMLRPCRequestHandler.log_requestN)r   r   )r.   r^   r_   ro   r   ZwbufsizeZdisable_nagle_algorithmrecompileVERBOSE
IGNORECASErg   rn   rp   r   r   rz   r   r   r   r   r   r`     s   	
G	r`   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 r*   )r   r   r)   socketserver	TCPServerr(   addrZrequestHandlerr   r$   r%   Zbind_and_activater&   r   r   r   r)   W  s    zSimpleXMLRPCServer.__init__)r.   r^   r_   Zallow_reuse_addressrr   r`   r)   r   r   r   r   r   D  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 r    )r   r)   dispatchersr$   r%   r   r   r   r   r)   h  s    zMultiPathXMLRPCServer.__init__c                 C   s   || j |< |S r*   r   )r(   rB   
dispatcherr   r   r   add_dispatcherr  s    
z$MultiPathXMLRPCServer.add_dispatcherc                 C   s
   | j | S r*   r   )r(   rB   r   r   r   get_dispatcherv  s    z$MultiPathXMLRPCServer.get_dispatcherc                 C   s   z| j | |||}W nf   t d d \}}z:ttdd||f | j| jd}|| jd}W d  }}n
d  }}0 Y n0 |S )N   r8   r9   r:   r;   )	r   rJ   r=   r>   r   r   r%   r$   r?   )r(   r@   rA   rB   rE   rG   rH   r   r   r   rJ   y  s    
z)MultiPathXMLRPCServer._marshaled_dispatch)NN)r.   r^   r_   r`   r)   r   r   rJ   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 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/xmlContent-Length: %d)rJ   printr~   r=   stdoutflushbufferr   )r(   request_textrE   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 )Nr   )r   messageexplainr!   zStatus: %d %szContent-Type: %sr   )r   Z	responseshttpr   ZDEFAULT_ERROR_MESSAGEr?   r   ZDEFAULT_ERROR_CONTENT_TYPEr~   r=   r   r   r   r   )r(   r   r   r   rE   r   r   r   
handle_get  s     

z"CGIXMLRPCRequestHandler.handle_getc              	   C   sx   |d u r$t jdd dkr$|   nPztt jdd }W n ttfyT   d}Y n0 |d u rjtj	|}| 
| d S )NZREQUEST_METHODGETZCONTENT_LENGTHrb   )osenvironrf   r   r{   r   	TypeErrorr=   stdinr}   r   )r(   r   lengthr   r   r   handle_request  s    

z&CGIXMLRPCRequestHandler.handle_request)FNF)N)r.   r^   r_   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   sZ  |p| j }g }d}td}|||}	|	s0q:|	 \}
}|||||
  |	 \}}}}}}|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||||d   d
|S )Nr   zS\b((http|https|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)https://www.python.org/dev/peps/pep-%04d/r8   (zself.<strong>%s</strong>rS   )escaper   r   searchspanrX   groupsreplacer{   Znamelinkr   )r(   textr   r"   classesrP   rY   herepatternrh   startendallschemeZrfcZpepZselfdotr,   urlr   r   r   markup  s4    

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 )
NrS   r   z$<a name="%s"><strong>%s</strong></a>z(...)r   r8   z'<font face="helvetica, arial">%s</font>z<dd><tt>%s</tt></dd>z<dl><dt>%s</dt>%s</dl>
)r.   r   r   r   r	   
isinstancetuplerT   rU   Zgreyr   	preformat)r(   objectr,   modr"   r   rP   ZclanchorZnotetitleZargspecZ	docstringZdecldocr   r   r   
docroutine  s(    

zServerHTMLDoc.docroutinec              	   C   s   i }|  D ] \}}d| ||< || ||< q| |}d| }| |dd}| || j|}	|	ohd|	 }	|d|	  }g }
t|  }|D ]\}}|
| j|||d q|| 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#eeaa77rS   )
itemsr   headingr   r   rO   rX   r   Z
bigsectionr   )r(   server_nameZpackage_documentationrP   Zfdictkeyvalueheadresultr   contentsZmethod_itemsr   r   r   	docserver  s$    
zServerHTMLDoc.docserver)r.   r^   r_   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_titler4   r   r   r   r)   :  s    zXMLRPCDocGenerator.__init__c                 C   s
   || _ d S r*   )r   )r(   r   r   r   r   set_server_titleB  s    z#XMLRPCDocGenerator.set_server_titlec                 C   s
   || _ d S r*   )r   )r(   r   r   r   r   set_server_nameG  s    z"XMLRPCDocGenerator.set_server_namec                 C   s
   || _ d S r*   )r   )r(   r   r   r   r   set_server_documentationL  s    z+XMLRPCDocGenerator.set_server_documentationc              	   C   s   i }|   D ]}|| jv r&| j| }n| jd urd d g}t| jdrT| j||d< t| jdrp| j||d< t|}|dkr|}qt| jdszt| j|}W q ty   |}Y q0 q|}n |||< qt	 }|
| j| j|}|t| j|S )N_get_method_argstringr   rR   r8   )NNr<   )r1   r"   r#   rN   r   rR   r   r   r   r   r   r   r   Zpagehtmlr   r   )r(   rP   rQ   rD   Zmethod_infoZ
documenterZdocumentationr   r   r   generate_html_documentationQ  s<    


z.XMLRPCDocGenerator.generate_html_documentationN)r.   r^   r_   r)   r   r   r   r   r   r   r   r   r   3  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 )Nr!   rw   rx   z	text/htmlru   )rp   rz   r   r   r?   r   r   r   r~   r   r   r   r   r   r   r   do_GET  s    
zDocXMLRPCRequestHandler.do_GETN)r.   r^   r_   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 r*   )r   r)   r   r   r   r   r   r)     s
    zDocXMLRPCServer.__init__)r.   r^   r_   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 )Nr!   zContent-Type: text/htmlr   )	r   r?   r   r~   r=   r   r   r   r   r   r   r   r   r     s    
z%DocCGIXMLRPCRequestHandler.handle_getc                 C   s   t |  t|  d S r*   )r   r)   r   r4   r   r   r   r)     s    
z#DocCGIXMLRPCRequestHandler.__init__N)r.   r^   r_   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   r4   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 r*   )datetimeZnowr   r   r   r   getCurrentTime  s    z)ExampleService.currentTime.getCurrentTimeN)r.   r^   r_   staticmethodr   r   r   r   r   currentTime  s   r   N)r.   r^   r_   r   r   r   r   r   r   r     s   r   )	localhosti@  c                 C   s   | | S r*   r   )xyr   r   r   <lambda>  rq   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)0xmlrpc.clientr   r   r   r   r   Zhttp.serverr   	functoolsr   inspectr	   r   r   r   r=   r   r   rT   r   ZfcntlImportErrorr   r   r   r`   r   r   r   r   ZHTMLDocr   r   r   r   r   r.   r   r   r   r-   powr+   r7   r   Zserve_foreverKeyboardInterruptexitr   r   r   r   <module>k   sf   

   ,EbQ
	

