\section{\module{SimpleXMLRPCServer} ---
         Basic XML-RPC server}

\declaremodule{standard}{SimpleXMLRPCServer}
\modulesynopsis{Basic XML-RPC server implementation.}
\moduleauthor{Brian Quinlan}{brianq@activestate.com}
\sectionauthor{Fred L. Drake, Jr.}{fdrake@acm.org}


The \module{SimpleXMLRPCServer} module provides a basic server
framework for XML-RPC servers written in Python.  Servers can either
be free standing, using \class{SimpleXMLRPCServer}, or embedded in a
CGI environment, using \class{CGIXMLRPCRequestHandler}.

\begin{classdesc}{SimpleXMLRPCServer}{addr\optional{,
                                      requestHandler\optional{, logRequests}}}

  Create a new server instance.  The \var{requestHandler} parameter
  should be a factory for request handler instances; it defaults to
  \class{SimpleXMLRPCRequestHandler}.  The \var{addr} and
  \var{requestHandler} parameters are passed to the
  \class{\refmodule{SocketServer}.TCPServer} constructor.  If
  \var{logRequests} is true (the default), requests will be logged;
  setting this parameter to false will turn off logging.  This class
  provides methods for registration of functions that can be called by
  the XML-RPC protocol.
\end{classdesc}

\begin{classdesc}{CGIXMLRPCRequestHandler}{}
  Create a new instance to handle XML-RPC requests in a CGI
  environment. \versionadded{2.3}
\end{classdesc}

\begin{classdesc}{SimpleXMLRPCRequestHandler}{}
  Create a new request handler instance.  This request handler
  supports \code{POST} requests and modifies logging so that the
  \var{logRequests} parameter to the \class{SimpleXMLRPCServer}
  constructor parameter is honored.
\end{classdesc}


\subsection{SimpleXMLRPCServer Objects \label{simple-xmlrpc-servers}}

The \class{SimpleXMLRPCServer} class is based on
\class{SocketServer.TCPServer} and provides a means of creating
simple, stand alone XML-RPC servers.

\begin{methoddesc}[SimpleXMLRPCServer]{register_function}{function\optional{,
                                                          name}}
  Register a function that can respond to XML-RPC requests.  If
  \var{name} is given, it will be the method name associated with
  \var{function}, otherwise \code{\var{function}.__name__} will be
  used.  \var{name} can be either a normal or Unicode string, and may
  contain characters not legal in Python identifiers, including the
  period character.
\end{methoddesc}

\begin{methoddesc}[SimpleXMLRPCServer]{register_instance}{instance}
  Register an object which is used to expose method names which have
  not been registered using \method{register_function()}.  If
  \var{instance} contains a \method{_dispatch()} method, it is called
  with the requested method name and the parameters from the request;
  the return value is returned to the client as the result.  If
  \var{instance} does not have a \method{_dispatch()} method, it is
  searched for an attribute matching the name of the requested method;
  if the requested method name contains periods, each component of the
  method name is searched for individually, with the effect that a
  simple hierarchical search is performed.  The value found from this
  search is then called with the parameters from the request, and the
  return value is passed back to the client.
\end{methoddesc}

\begin{methoddesc}{register_introspection_functions}{}
  Registers the XML-RPC introspection functions \code{system.listMethods},
  \code{system.methodHelp} and \code{system.methodSignature}. 
  \versionadded{2.3}
\end{methoddesc}

\begin{methoddesc}{register_multicall_functions}{}
  Registers the XML-RPC multicall function system.multicall.
\end{methoddesc}

Example:

\begin{verbatim}
class MyFuncs:
    def div(self, x, y) : return div(x,y)


server = SimpleXMLRPCServer(("localhost", 8000))
server.register_function(pow)
server.register_function(lambda x,y: x+y, 'add')
server.register_introspection_functions()
server.register_instance(MyFuncs())
server.serve_forever()
\end{verbatim}

\subsection{CGIXMLRPCRequestHandler}

The \class{CGIXMLRPCRequestHandler} class can be used to 
handle XML-RPC requests sent to Python CGI scripts.

\begin{methoddesc}{register_function}{function\optional{, name}}
Register a function that can respond to XML-RPC requests. If 
\var{name} is given, it will be the method name associated with 
function, otherwise \var{function.__name__} will be used. \var{name}
can be either a normal or Unicode string, and may contain 
characters not legal in Python identifiers, including the period
character. 
\end{methoddesc}

\begin{methoddesc}{register_instance}{instance}
Register an object which is used to expose method names 
which have not been registered using \method{register_function()}. If 
instance contains a \method{_dispatch()} method, it is called with the 
requested method name and the parameters from the 
request; the return value is returned to the client as the result.
If instance does not have a \method{_dispatch()} method, it is searched 
for an attribute matching the name of the requested method; if 
the requested method name contains periods, each 
component of the method name is searched for individually, 
with the effect that a simple hierarchical search is performed. 
The value found from this search is then called with the 
parameters from the request, and the return value is passed 
back to the client. 
\end{methoddesc}

\begin{methoddesc}{register_introspection_functions}{}
Register the XML-RPC introspection functions 
\code{system.listMethods}, \code{system.methodHelp} and 
\code{system.methodSignature}.
\end{methoddesc}

\begin{methoddesc}{register_multicall_functions}{}
Register the XML-RPC multicall function \code{system.multicall}.
\end{methoddesc}

\begin{methoddesc}{handle_request}{\optional{request_text = None}}
Handle a XML-RPC request. If \var{request_text} is given, it 
should be the POST data provided by the HTTP server, 
otherwise the contents of stdin will be used.
\end{methoddesc}

Example:

\begin{verbatim}
class MyFuncs:
    def div(self, x, y) : return div(x,y)


handler = CGIXMLRPCRequestHandler()
handler.register_function(pow)
handler.register_function(lambda x,y: x+y, 'add')
handler.register_introspection_functions()
handler.register_instance(MyFuncs())
handler.handle_request()
\end{verbatim}
