o
    g@                  	   @   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_namesattrsi r   C/Users/admin/.pyenv/versions/3.10.0/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"   r0   system_multicallr4   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#   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 | }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#   rN   rR   r   r   r   pydocgetdoc)r(   rQ   rD   r   r   r   r3   <  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
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   [  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#   rN   r<   r   r   r   )r(   rD   rC   funcr   r   r   r<     s0   
z SimpleXMLRPCDispatcher._dispatchFNF)FNN)r.   
__module____qualname__r)   r+   r-   r5   r7   rJ   r1   r2   r3   r6   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-EncodingrS   ,   g      ?r8   )headersgetr   	aepatternmatchgroupfloat)r(   rZaeerj   vr   r   r   accept_encodings  s   
z+SimpleXMLRPCRequestHandler.accept_encodingsc                 C   s   | j r	| j| j v 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 zJd}t| jd }g }|r6t||}| j|}|s'q6|| |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-lengthrd       r<   i  _send_traceback_headerzX-exceptionASCIIbackslashreplacezX-tracebackContent-length0   Content-typeztext/xmlgzipr   zContent-Encoding) rr   
report_404intrg   minZrfilereadrX   lenjoindecode_request_contentserverrJ   r   rB   r\   send_responserN   rt   send_headerstr	traceback
format_excr?   end_headersencode_thresholdrp   rh   r   NotImplementedErrorwfilewrite)r(   Zmax_chunk_sizeZsize_remainingLZ
chunk_sizechunkr@   rE   rn   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-encodingZidentityr{   i  zencoding %r not supported  zerror decoding gzip contentrw   rx   )	rg   rh   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 pagerz   z
text/plainrw   )r   r   r   r   r   r   r   r(   rE   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`   ra   rq   r   ZwbufsizeZdisable_nagle_algorithmrecompileVERBOSE
IGNORECASEri   rp   rr   r   r   r|   r   r   r   r   r   rb     s    
G	rb   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`   ra   Zallow_reuse_addressrt   rb   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 |S    t d d \}}zttdd||f | j| jd}|| jd}W d  }}Y |S d  }}w )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_dispatchr_   )r.   r`   ra   rb   r)   r   r   rJ   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)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   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_LENGTHrd   )osenvironrh   r   r}   r   	TypeErrorr=   stdinr   r   )r(   r   lengthr   r   r   handle_request  s   z&CGIXMLRPCRequestHandler.handle_requestr^   r*   )r.   r`   ra   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q|	 \}
}|||||
  |	 \}}}}}}|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|\.)+))\br8   "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>rS   )escaper   r   searchspanrX   groupsreplacer}   Znamelinkr   )r(   textr   r"   classesrP   rY   herepatternrj   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 )
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|}	|	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#eeaa77rS   )
itemsr   Z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`   ra   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_titler4   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   rR   r8   r_   r<   )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`   ra   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!   ry   rz   z	text/htmlrw   )rr   r|   r   r   r?   r   r   r   r   r   r   r   r   r   r   r   do_GET  s   
zDocXMLRPCRequestHandler.do_GETN)r.   r`   ra   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`   ra   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   r4   r   r   r   r)     s   
z#DocCGIXMLRPCRequestHandler.__init__N)r.   r`   ra   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`   ra   staticmethodr   r   r   r   r   currentTime  s    r   N)r.   r`   ra   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   rT   r   fcntlImportErrorr   r   r   rb   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>   sx    j
   ,EbQ

	
$