Drop more obsolete xmlrpc code
This commit is contained in:
parent
04750e69d3
commit
4c35d77854
@ -15,19 +15,13 @@
|
|||||||
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
# Boston, MA 02111-1307, USA.
|
# Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
import socket
|
|
||||||
import os
|
import os
|
||||||
import threading
|
import threading
|
||||||
import traceback
|
|
||||||
import xmlrpclib
|
|
||||||
import sys
|
|
||||||
import httplib
|
|
||||||
import urllib
|
import urllib
|
||||||
import fcntl
|
import fcntl
|
||||||
import tempfile
|
import tempfile
|
||||||
|
|
||||||
import gobject
|
import gobject
|
||||||
import SimpleXMLRPCServer
|
|
||||||
import SimpleHTTPServer
|
import SimpleHTTPServer
|
||||||
import SocketServer
|
import SocketServer
|
||||||
|
|
||||||
@ -299,178 +293,3 @@ class GlibURLDownloader(gobject.GObject):
|
|||||||
if remove:
|
if remove:
|
||||||
os.remove(self._fname)
|
os.remove(self._fname)
|
||||||
self._outf = None
|
self._outf = None
|
||||||
|
|
||||||
|
|
||||||
class GlibXMLRPCRequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHandler):
|
|
||||||
""" GlibXMLRPCRequestHandler
|
|
||||||
|
|
||||||
The stock SimpleXMLRPCRequestHandler and server don't allow any way to pass
|
|
||||||
the client's address and/or SSL certificate into the function that actually
|
|
||||||
_processes_ the request. So we have to store it in a thread-indexed dict.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def do_POST(self):
|
|
||||||
_add_authinfo(self.client_address)
|
|
||||||
try:
|
|
||||||
SimpleXMLRPCServer.SimpleXMLRPCRequestHandler.do_POST(self)
|
|
||||||
except socket.timeout:
|
|
||||||
pass
|
|
||||||
except socket.error, e:
|
|
||||||
print "Error (%s): socket error - '%s'" % (self.client_address, e)
|
|
||||||
except:
|
|
||||||
print "Error while processing POST:"
|
|
||||||
traceback.print_exc()
|
|
||||||
_del_authinfo()
|
|
||||||
|
|
||||||
class GlibXMLRPCServer(GlibTCPServer,
|
|
||||||
SimpleXMLRPCServer.SimpleXMLRPCDispatcher):
|
|
||||||
"""GlibXMLRPCServer
|
|
||||||
|
|
||||||
Use nonblocking sockets and handle the accept via glib rather than
|
|
||||||
blocking on accept().
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, addr, requestHandler=GlibXMLRPCRequestHandler,
|
|
||||||
logRequests=0, allow_none=False):
|
|
||||||
self.logRequests = logRequests
|
|
||||||
if sys.version_info[:3] >= (2, 5, 0):
|
|
||||||
SimpleXMLRPCServer.SimpleXMLRPCDispatcher.__init__(
|
|
||||||
self, allow_none, encoding="utf-8")
|
|
||||||
else:
|
|
||||||
SimpleXMLRPCServer.SimpleXMLRPCDispatcher.__init__(self)
|
|
||||||
GlibTCPServer.__init__(self, addr, requestHandler)
|
|
||||||
|
|
||||||
def _marshaled_dispatch(self, data, dispatch_method = None):
|
|
||||||
"""Dispatches an XML-RPC method from marshalled (XML) data.
|
|
||||||
|
|
||||||
XML-RPC methods are dispatched from the marshalled (XML) data
|
|
||||||
using the _dispatch method and the result is returned as
|
|
||||||
marshalled data. For backwards compatibility, a dispatch
|
|
||||||
function can be provided as an argument (see comment in
|
|
||||||
SimpleXMLRPCRequestHandler.do_POST) but overriding the
|
|
||||||
existing method through subclassing is the prefered means
|
|
||||||
of changing method dispatch behavior.
|
|
||||||
"""
|
|
||||||
|
|
||||||
params, method = xmlrpclib.loads(data)
|
|
||||||
|
|
||||||
# generate response
|
|
||||||
try:
|
|
||||||
if dispatch_method is not None:
|
|
||||||
response = dispatch_method(method, params)
|
|
||||||
else:
|
|
||||||
response = self._dispatch(method, params)
|
|
||||||
# wrap response in a singleton tuple
|
|
||||||
response = (response,)
|
|
||||||
response = xmlrpclib.dumps(response, methodresponse=1)
|
|
||||||
except xmlrpclib.Fault, fault:
|
|
||||||
response = xmlrpclib.dumps(fault)
|
|
||||||
except:
|
|
||||||
print "Exception while processing request:"
|
|
||||||
traceback.print_exc()
|
|
||||||
|
|
||||||
# report exception back to server
|
|
||||||
response = xmlrpclib.dumps(
|
|
||||||
xmlrpclib.Fault(1, "%s:%s" % (sys.exc_type, sys.exc_value))
|
|
||||||
)
|
|
||||||
|
|
||||||
return response
|
|
||||||
|
|
||||||
|
|
||||||
class GlibHTTP(httplib.HTTP):
|
|
||||||
"""Subclass HTTP so we can return it's connection class' socket."""
|
|
||||||
def connect(self, host=None, port=None):
|
|
||||||
httplib.HTTP.connect(self, host, port)
|
|
||||||
self._conn.sock.setblocking(0)
|
|
||||||
|
|
||||||
class GlibXMLRPCTransport(xmlrpclib.Transport):
|
|
||||||
"""Integrate the request with the glib mainloop rather than blocking."""
|
|
||||||
##
|
|
||||||
# Connect to server.
|
|
||||||
#
|
|
||||||
# @param host Target host.
|
|
||||||
# @return A connection handle.
|
|
||||||
|
|
||||||
def __init__(self, use_datetime=0):
|
|
||||||
self.verbose = None
|
|
||||||
if sys.version_info[:3] >= (2, 5, 0):
|
|
||||||
xmlrpclib.Transport.__init__(self, use_datetime)
|
|
||||||
|
|
||||||
def make_connection(self, host):
|
|
||||||
"""Use our own connection object so we can get its socket."""
|
|
||||||
# create a HTTP connection object from a host descriptor
|
|
||||||
host, extra_headers_, x509_ = self.get_host_info(host)
|
|
||||||
return GlibHTTP(host)
|
|
||||||
|
|
||||||
##
|
|
||||||
# Send a complete request, and parse the response.
|
|
||||||
#
|
|
||||||
# @param host Target host.
|
|
||||||
# @param handler Target PRC handler.
|
|
||||||
# @param request_body XML-RPC request body.
|
|
||||||
# @param verbose Debugging flag.
|
|
||||||
# @return Parsed response.
|
|
||||||
|
|
||||||
def start_request(self, host, handler, request_body, verbose=0,
|
|
||||||
reply_handler=None, error_handler=None, user_data=None):
|
|
||||||
"""Do the first half of the request by sending data to the remote
|
|
||||||
server. The bottom half bits get run when the remote server's response
|
|
||||||
actually comes back."""
|
|
||||||
# issue XML-RPC request
|
|
||||||
|
|
||||||
h = self.make_connection(host)
|
|
||||||
if verbose:
|
|
||||||
h.set_debuglevel(1)
|
|
||||||
|
|
||||||
self.send_request(h, handler, request_body)
|
|
||||||
self.send_host(h, host)
|
|
||||||
self.send_user_agent(h)
|
|
||||||
self.send_content(h, request_body)
|
|
||||||
|
|
||||||
# Schedule a GIOWatch so we don't block waiting for the response
|
|
||||||
gobject.io_add_watch(h._conn.sock, gobject.IO_IN, self._finish_request,
|
|
||||||
h, host, handler, verbose, reply_handler, error_handler, user_data)
|
|
||||||
|
|
||||||
def _finish_request(self, source, condition, h, host, handler, verbose,
|
|
||||||
reply_handler=None, error_handler=None, user_data=None):
|
|
||||||
"""Parse and return response when the
|
|
||||||
remote server actually returns it."""
|
|
||||||
if not (condition & gobject.IO_IN):
|
|
||||||
return True
|
|
||||||
|
|
||||||
try:
|
|
||||||
errcode, errmsg, headers = h.getreply()
|
|
||||||
except socket.error, err:
|
|
||||||
if err[0] != 104:
|
|
||||||
raise socket.error(err)
|
|
||||||
else:
|
|
||||||
if error_handler:
|
|
||||||
gobject.idle_add(error_handler, err, user_data)
|
|
||||||
return False
|
|
||||||
|
|
||||||
if errcode != 200:
|
|
||||||
raise xmlrpclib.ProtocolError(host + handler, errcode,
|
|
||||||
errmsg, headers)
|
|
||||||
self.verbose = verbose
|
|
||||||
response = self._parse_response(h.getfile(), h._conn.sock)
|
|
||||||
if reply_handler:
|
|
||||||
# Coerce to a list so we can append user data
|
|
||||||
response = response[0]
|
|
||||||
if not isinstance(response, list):
|
|
||||||
response = [response]
|
|
||||||
response.append(user_data)
|
|
||||||
gobject.idle_add(reply_handler, *response)
|
|
||||||
return False
|
|
||||||
|
|
||||||
class _Method:
|
|
||||||
"""Right, so python people thought it would be funny to make this
|
|
||||||
class private to xmlrpclib.py..."""
|
|
||||||
# some magic to bind an XML-RPC method to an RPC server.
|
|
||||||
# supports "nested" methods (e.g. examples.getStateName)
|
|
||||||
def __init__(self, send, name):
|
|
||||||
self.__send = send
|
|
||||||
self.__name = name
|
|
||||||
def __getattr__(self, name):
|
|
||||||
return _Method(self.__send, "%s.%s" % (self.__name, name))
|
|
||||||
def __call__(self, *args, **kwargs):
|
|
||||||
return self.__send(self.__name, *args, **kwargs)
|
|
||||||
|
Loading…
Reference in New Issue
Block a user