o
    JAf@                  	   @   s6  	 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yR   dZY nw 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"KZ'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	w W d   dS W d   dS 1 sw   Y  dS dS )+    )Faultdumpsloadsgzip_encodegzip_decode)BaseHTTPRequestHandler)partial)	signatureNTc                 C   sF   	 |r	| d}n|g}|D ]}|drtd| t| |} q| S )N._z(attempt to access private attribute "%s")split
startswithAttributeErrorgetattr)objattrallow_dotted_namesZattrsi r   $/usr/lib/python3.10/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                   @   sr   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   s4   	 |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!   r/   system_multicallr3   r   r   r   register_multicall_functions   s   z3SimpleXMLRPCDispatcher.register_multicall_functionsc                 C   s   	 z(t || jd\}}|d ur|||}n| ||}|f}t|d| j| jd}W nE tyD } zt|| j| jd}W Y d }~n/d }~w   t \}}	}
zttdd||	f | j| jd}W d  } }	}
nd  } }	}
w Y |	| 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   s0   
z*SimpleXMLRPCDispatcher._marshaled_dispatchc                 C   sf   	 t | j }| jd ur/t| jdr |t | j O }t|S t| jds/|t t| jO }t|S )N_listMethodsr;   )setr!   keysr"   hasattrrJ   r   sorted)r'   methodsr   r   r   r0     s   
z)SimpleXMLRPCDispatcher.system_listMethodsc                 C   s   	 dS )Nzsignatures not supportedr   )r'   method_namer   r   r   r1   /  s   
z-SimpleXMLRPCDispatcher.system_methodSignaturec                 C   s   	 d }|| j v r| j | }n+| jd ur9t| jdr| j|S t| jds9z
t| j|| j}W n	 ty8   Y nw |d u r?dS t|S )N_methodHelpr;    )	r!   r"   rM   rQ   r   r   r   pydocgetdoc)r'   rP   rC   r   r   r   r2   <  s(   


z(SimpleXMLRPCDispatcher.system_methodHelpc           
      C   s   	 g }|D ]Y}|d }|d }z| | ||g W q ty7 } z| |j|jd W Y d }~qd }~w   t \}}}	z| dd||f d W d  } }}	nd  } }}	w Y q|S )NZ
methodNamerB   )	faultCodefaultStringr7   r8   )appendr;   r   rU   rV   r<   r=   )
r'   Z	call_listresultscallrP   rB   rE   rF   rG   rH   r   r   r   r5   [  s0   	
 z'SimpleXMLRPCDispatcher.system_multicallc                 C   s   	 z| j | }W n	 ty   Y nw |d ur|| S td| | jd urNt| jdr2| j||S z
t| j|| j}W n	 tyE   Y n	w |d urN|| S td| )Nzmethod "%s" is not supportedr;   )	r!   KeyError	Exceptionr"   rM   r;   r   r   r   )r'   rC   rB   funcr   r   r   r;     s0   
z SimpleXMLRPCDispatcher._dispatchFNF)FNN)r-   
__module____qualname__r(   r*   r,   r4   r6   rI   r0   r1   r2   r5   r;   r   r   r   r   r      s    


$
)$r   c                   @   sd   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}|r#t|nd}|||d< q|S )NzAccept-EncodingrR   ,   g      ?r7   )headersgetr   	aepatternmatchgroupfloat)r'   rZaeeri   vr   r   r   accept_encodings  s   
z+SimpleXMLRPCRequestHandler.accept_encodingsc                 C   s   | j r	| j| j v S dS )NT)	rpc_pathsrA   r3   r   r   r   is_rpc_path_valid  s   z,SimpleXMLRPCRequestHandler.is_rpc_path_validc              
   C   s  	 |   s|   d S zJd}t| jd }g }|r6t||}| j|}|s'n|| |t|d 8 }|sd	|}| 
|}|d u rGW d S | j|t| dd | j}W nG ty } z;| d t| jdr| jjr| dt| t }	t|	d	d
d	}	| d|	 | dd |   W Y d }~d S d }~ww | d | dd | jd urt|| jkr|  dd}
|
rzt|}| dd W n	 ty   Y nw | dtt| |   | j| d S )Ni   zcontent-lengthrc       r;   i  _send_traceback_headerzX-exceptionASCIIbackslashreplacezX-tracebackContent-length0   Content-typeztext/xmlgzipr   zContent-Encoding) rq   
report_404intrf   minZrfilereadrW   lenjoindecode_request_contentserverrI   r   rA   r[   send_responserM   rs   send_headerstr	traceback
format_excr>   end_headersencode_thresholdro   rg   r   NotImplementedErrorwfilewrite)r'   Zmax_chunk_sizeZsize_remainingLZ
chunk_sizechunkr?   rD   rm   Ztraceqr   r   r   do_POST  sf   






z"SimpleXMLRPCRequestHandler.do_POSTc                 C   s   | j dd }|dkr|S |dkr8zt|W S  ty)   | dd|  Y n ty7   | dd Y n	w | dd|  | dd	 |   d S )
Nzcontent-encodingidentityrz   i  zencoding %r not supported  zerror decoding gzip contentrv   rw   )	rf   rg   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 pagery   z
text/plainrv   )r   r   r   r   r   r   r   r'   rD   r   r   r   r{   5  s   
z%SimpleXMLRPCRequestHandler.report_404-c                 C   s    	 | j jrt| || d S d S r)   )r   logRequestsr   log_request)r'   codesizer   r   r   r   >  s   z&SimpleXMLRPCRequestHandler.log_requestN)r   r   )r-   r_   r`   rp   r   ZwbufsizeZdisable_nagle_algorithmrecompileVERBOSE
IGNORECASErh   ro   rq   r   r   r{   r   r   r   r   r   ra     s    
G	ra   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_addressrs   ra   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'   rA   
dispatcherr   r   r   add_dispatcherr  s   
z$MultiPathXMLRPCServer.add_dispatcherc                 C   s
   | j | S r)   r   )r'   rA   r   r   r   get_dispatcherv  s   
z$MultiPathXMLRPCServer.get_dispatcherc                 C   s   z| j | |||}W |S    t d d \}}zttdd||f | j| jd}|| jd}W d  }}Y |S d  }}w )N   r7   r8   r9   r:   )	r   rI   r<   r=   r   r   r$   r#   r>   )r'   r?   r@   rA   rD   rF   rG   r   r   r   rI   y  s    


z)MultiPathXMLRPCServer._marshaled_dispatchr^   )r-   r_   r`   ra   r(   r   r   rI   r   r   r   r   r   `  s    

r   c                   @   s2   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   sR   	 |  |}td tdt|  t  tj  tjj| tjj  d S )NzContent-Type: text/xmlContent-Length: %d)rI   printr   r<   stdoutflushbufferr   )r'   request_textrD   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   rD   r   r   r   
handle_get  s"   

z"CGIXMLRPCRequestHandler.handle_getc              	   C   s|   	 |d u rt jdd dkr|   d S ztt jdd }W n ttfy,   d}Y nw |d u r7tj	|}| 
| d S )NZREQUEST_METHODGETZCONTENT_LENGTHrc   )osenvironrg   r   r|   r   	TypeErrorr<   stdinr~   r   )r'   r   lengthr   r   r   handle_request  s   z&CGIXMLRPCRequestHandler.handle_requestr]   r)   )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   sX  	 |p| j }g }d}td}	 |||}	|	sn|	 \}
}|||||
  |	 \}}}}}}|rH||dd}|d||f  nQ|r\dt| }|d|||f  n=|rpdt| }|d|||f  n)|||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|\.)+))\br7   "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/(zself.<strong>%s</strong>rR   )escaper   r   searchspanrW   groupsreplacer|   Znamelinkr   )r'   textr   r!   classesrO   rX   herepatternri   startendallschemeZrfcZpepZselfdotr+   urlr   r   r   markup  s:   


zServerHTMLDoc.markupc                 C   s   	 |r|j pdd | }d}	d| || |f }
t|r%tt|}nd}t|tr9|d p1|}|d p7d}nt|}|
| |	oI| 	d|	  }| 
|| j|||}|oZd| }d	||f S )
NrR   r   z$<a name="%s"><strong>%s</strong></a>z(...)r   r7   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tuplerS   rT   Zgreyr   	preformat)r'   objectr+   modr!   r   rO   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|}	|	o5d|	 }	|d|	  }g }
t|  }|D ]\}}|
| j|||d qF|| 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#eeaa77rR   )
itemsr   headingr   r   rN   rW   r   Z
bigsectionr   )r'   server_nameZpackage_documentationrO   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                   @   s6   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_titler3   r   r   r   r(   :  s   
zXMLRPCDocGenerator.__init__c                 C      	 || _ d S r)   )r   )r'   r   r   r   r   set_server_titleB     
z#XMLRPCDocGenerator.set_server_titlec                 C   r   r)   )r   )r'   r   r   r   r   set_server_nameG  r   z"XMLRPCDocGenerator.set_server_namec                 C   r   r)   )r   )r'   r   r   r   r   set_server_documentationL  r   z+XMLRPCDocGenerator.set_server_documentationc              	   C   s   	 i }|   D ]]}|| jv r| j| }nL| jd ur`d d g}t| jdr+| j||d< t| jdr9| j||d< t|}|dkrD|}nt| jds^zt| j|}W n ty]   |}Y nw |}|||< qt	 }|
| j| j|}|t| j|S )N_get_method_argstringr   rQ   r7   r^   r;   )r0   r!   r"   rM   r   rQ   r   r   r   r   r   r   r   Zpagehtmlr   r   )r'   rO   rP   rC   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   sh   	 |   s|   d S | j d}| d | dd | dtt| | 	  | j
| d S )Nr    rx   ry   z	text/htmlrv   )rq   r{   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   sV   	 |   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   r3   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   r3   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>  s    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   rS   r   fcntlImportErrorr   r   r   ra   r   r   r   r   ZHTMLDocr   r   r   r   r   r-   r   r   r   r,   powr*   r6   r   Zserve_foreverKeyboardInterruptexitr   r   r   r   <module>   sx    j
   ,EbQ

	
$