[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gnue] r8005 - in trunk/gnue-common/src/rpc: . drivers/xmlrpc
From: |
johannes |
Subject: |
[gnue] r8005 - in trunk/gnue-common/src/rpc: . drivers/xmlrpc |
Date: |
Wed, 28 Sep 2005 12:35:48 -0500 (CDT) |
Author: johannes
Date: 2005-09-27 05:12:29 -0500 (Tue, 27 Sep 2005)
New Revision: 8005
Modified:
trunk/gnue-common/src/rpc/client.py
trunk/gnue-common/src/rpc/drivers/xmlrpc/ClientAdapter.py
trunk/gnue-common/src/rpc/drivers/xmlrpc/ServerAdapter.py
trunk/gnue-common/src/rpc/drivers/xmlrpc/typeconv.py
Log:
Improved/Fixed object transports in xmlrpc
Modified: trunk/gnue-common/src/rpc/client.py
===================================================================
--- trunk/gnue-common/src/rpc/client.py 2005-09-27 09:46:10 UTC (rev 8004)
+++ trunk/gnue-common/src/rpc/client.py 2005-09-27 10:12:29 UTC (rev 8005)
@@ -195,12 +195,24 @@
res = subobj.argcheck (other)
print "subobj.argcheck (other)", res
+ print "<enter>"
+ raw_input ()
+
res = subobj.dictcheck (other, {'buddy': other})
print "Result-Object (buddy)=", res.printIt ()
- subobj._destroy ()
- other._destroy ()
+ print "removing result", res
+ del res
+ raw_input ()
+ print "removing subobj", subobj
+ del subobj
+ raw_input ()
+
+ print "removing other:", other
+ del other
+ raw_input ()
+
print 'shutting down server ...'
try:
# This will raise an exception because the server will not even answer any
@@ -208,3 +220,5 @@
obj.shutdown ()
except:
pass
+
+ del obj
Modified: trunk/gnue-common/src/rpc/drivers/xmlrpc/ClientAdapter.py
===================================================================
--- trunk/gnue-common/src/rpc/drivers/xmlrpc/ClientAdapter.py 2005-09-27
09:46:10 UTC (rev 8004)
+++ trunk/gnue-common/src/rpc/drivers/xmlrpc/ClientAdapter.py 2005-09-27
10:12:29 UTC (rev 8005)
@@ -23,6 +23,7 @@
import xmlrpclib
import socket
+import weakref
from gnue.common.apps import errors
from gnue.common.rpc import client
@@ -149,6 +150,7 @@
self._transport = PersistentTransport ()
self._verbose = params.get ('loglevel', 0)
self.__remote = "%s:%s" % (self._host, self._port)
+ self.__objectProxies = weakref.WeakValueDictionary ()
# ---------------------------------------------------------------------------
@@ -177,6 +179,10 @@
checktype (method, basestring)
+ if not self._transport:
+ assert gLeave (9)
+ return
+
__args = tuple ([typeconv.python_to_rpc (arg, self.__unwrapProxy) \
for arg in args])
try:
@@ -217,7 +223,12 @@
def __wrapProxy (self, item):
- return ObjectProxy (self, item)
+ if item ['__id__'] in self.__objectProxies:
+ return self.__objectProxies [item ['__id__']]
+ else:
+ result = ObjectProxy (self, item)
+ self.__objectProxies [item ['__id__']] = result
+ return result
# ---------------------------------------------------------------------------
@@ -239,6 +250,7 @@
"""
self._transport.close ()
+ self._transport = None
# =============================================================================
@@ -264,7 +276,7 @@
# Remove the object from the server's object store
# ---------------------------------------------------------------------------
- def _destroy (self):
+ def __del__ (self):
"""
Remove the object from the server's object store. Further access to this
object will lead to an exception
Modified: trunk/gnue-common/src/rpc/drivers/xmlrpc/ServerAdapter.py
===================================================================
--- trunk/gnue-common/src/rpc/drivers/xmlrpc/ServerAdapter.py 2005-09-27
09:46:10 UTC (rev 8004)
+++ trunk/gnue-common/src/rpc/drivers/xmlrpc/ServerAdapter.py 2005-09-27
10:12:29 UTC (rev 8005)
@@ -86,7 +86,8 @@
logRequests = parameters.get ('loglevel', 0), adapter = self)
# Store with all valid objects created by the server
- self._objectStore = {}
+ self._clientPerObject = {}
+ self._objectPerClient = {}
# Register the python object to be served as well as the introspection
# functions (system.list_methods,system.list_help, system.list_signatures)
@@ -102,7 +103,7 @@
# Dispatch a method with the given parameters
# ---------------------------------------------------------------------------
- def call (self, method, parameters):
+ def call (self, client, method, parameters):
"""
Dispatch a method with a given set of parameters
@@ -119,10 +120,10 @@
checktype (parameters, tuple)
params = typeconv.rpc_to_python (parameters, self._fetchFromStore,
- server.InvalidParameter)
+ server.InvalidParameter, client)
result = self._tcpServer._dispatch (method, params)
- result = typeconv.python_to_rpc (result, self._updateStore)
+ result = typeconv.python_to_rpc (result, self._updateStore, client)
assert gLeave (9, result)
return result
@@ -147,9 +148,16 @@
assert gEnter (9)
- if id (item) in self._objectStore:
- del self._objectStore [id (item)]
+ itemId = id (item)
+ client = self._clientPerObject.get (itemId)
+ if itemId in self._clientPerObject:
+ del self._clientPerObject [itemId]
+
+ if client in self._objectPerClient:
+ if itemId in self._objectPerClient [client]:
+ del self._objectPerClient [client][itemId]
+
assert gLeave (9)
@@ -157,12 +165,14 @@
# Add an object to the store or update it's reference
# ---------------------------------------------------------------------------
- def _updateStore (self, item):
+ def _updateStore (self, item, client):
gEnter (9)
- result = {'__id__': id (item), '__rpc_datatype__': 'object'}
- self._objectStore [id (item)] = item
+ itemId = id (item)
+ result = {'__id__': itemId, '__rpc_datatype__': 'object'}
+ self._objectPerClient.setdefault (client, {}) [itemId] = item
+ self._clientPerObject [itemId] = client
assert gLeave (9, result)
return result
@@ -172,16 +182,34 @@
# Fetch a real object from the store, identified by it's id-dictionary
# ---------------------------------------------------------------------------
- def _fetchFromStore (self, item):
+ def _fetchFromStore (self, item, client):
try:
- return self._objectStore [item ['__id__']]
+ itemId = item ['__id__']
+ return self._objectPerClient [client][itemId]
except KeyError:
raise ObjectNotFoundError, item
# ---------------------------------------------------------------------------
+ # Clear all object of a given client
+ # ---------------------------------------------------------------------------
+
+ def _clearClientObjects (self, client):
+
+ assert gEnter (9)
+
+ for itemId in self._objectPerClient.get (client, {}).keys ():
+ if itemId in self._clientPerObject:
+ del self._clientPerObject [itemId]
+
+ del self._objectPerClient [client] [itemId]
+
+ assert gLeave (9)
+
+
+ # ---------------------------------------------------------------------------
# Nice string representation
# ---------------------------------------------------------------------------
@@ -246,7 +274,8 @@
params, method = xmlrpclib.loads (data)
- response = self.server.serverAdapter.call (method, params)
+ response = self.server.serverAdapter.call (self.client_address, method,
+ params)
response = (response,)
response = xmlrpclib.dumps (response, methodresponse = 1, allow_none = 1)
@@ -321,19 +350,34 @@
to the socket.
"""
+ assert gEnter (9)
+
allowed = self.serverAdapter and self.serverAdapter.allowed_hosts
for host in allowed:
if client_address [0][:len (host)] == host:
+ assert gLeave (9, True)
return True
request.send ('HTTP/1.1 403 Forbidden\r\n\r\n')
self.close_request (request)
+ assert gLeave (9, False)
return False
+ # ---------------------------------------------------------------------------
+ # A connection to a given socket has been closed
+ # ---------------------------------------------------------------------------
+ def close_request (self, request):
+ if self.serverAdapter:
+ self.serverAdapter._clearClientObjects (request.getpeername ())
+
+ SimpleXMLRPCServer.close_request (self, request)
+
+
+
# =============================================================================
# A forking XML-RPC server
# =============================================================================
Modified: trunk/gnue-common/src/rpc/drivers/xmlrpc/typeconv.py
===================================================================
--- trunk/gnue-common/src/rpc/drivers/xmlrpc/typeconv.py 2005-09-27
09:46:10 UTC (rev 8004)
+++ trunk/gnue-common/src/rpc/drivers/xmlrpc/typeconv.py 2005-09-27
10:12:29 UTC (rev 8005)
@@ -54,7 +54,7 @@
# Convert native Python type to xmlrpc's type
# -----------------------------------------------------------------------------
-def python_to_rpc (value, wrapObject):
+def python_to_rpc (value, wrapObject, *wrapArgs):
"""
Convert a value from native python type into a type acceptable to xmlrpc.
@@ -109,11 +109,12 @@
# List
elif isinstance (value, list):
- return [python_to_rpc (element, wrapObject) for element in value]
+ return [python_to_rpc (element, wrapObject, *wrapArgs) for element in
value]
# Tuple
elif isinstance (value, tuple):
- return tuple ([python_to_rpc (element, wrapObject) for element in value])
+ return tuple ([python_to_rpc (element, wrapObject, *wrapArgs) \
+ for element in value])
# Dictionary
elif isinstance (value, dict):
@@ -130,14 +131,14 @@
key = ''
elif not isinstance (key, str):
- key = python_to_rpc (key, wrapObject)
+ key = python_to_rpc (key, wrapObject, *wrapArgs)
- result [key] = python_to_rpc (val, wrapObject)
+ result [key] = python_to_rpc (val, wrapObject, *wrapArgs)
return result
elif wrapObject is not None:
- return wrapObject (value)
+ return wrapObject (value, *wrapArgs)
else:
raise exception, repr (value)
@@ -147,7 +148,7 @@
# Convert xmlrpc's type to native Python type
# -----------------------------------------------------------------------------
-def rpc_to_python (value, wrapObject, exception):
+def rpc_to_python (value, wrapObject, exception, *wrapArgs):
"""
Convert a value from xmlrpc types into native python types.
@@ -195,21 +196,23 @@
# List
elif isinstance (value, list):
- return [rpc_to_python (element, wrapObject, exception) for element in
value]
+ return [rpc_to_python (element, wrapObject, exception, *wrapArgs) \
+ for element in value]
# Tuple
elif isinstance (value, tuple):
- return tuple ([rpc_to_python (e, wrapObject, exception) for e in value])
+ return tuple ([rpc_to_python (e, wrapObject, exception, *wrapArgs) \
+ for e in value])
# Dictionary
elif is_rpc_object (value):
- return wrapObject (value)
+ return wrapObject (value, *wrapArgs)
elif isinstance (value, dict):
result = {}
for (key, val) in value.items ():
- result [rpc_to_python (key, wrapObject, exception)] = \
- rpc_to_python (val, wrapObject, exception)
+ result [rpc_to_python (key, wrapObject, exception, *wrapArgs)] = \
+ rpc_to_python (val, wrapObject, exception, *wrapArgs)
return result
else:
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [gnue] r8005 - in trunk/gnue-common/src/rpc: . drivers/xmlrpc,
johannes <=