[Checkins] SVN: ZODB/branches/jim-3.8-connection/src/ZEO/zrpc/c Allow the connection object to be None, in which case messages to the

Jim Fulton jim at zope.com
Fri Jul 11 17:41:36 EDT 2008


Log message for revision 88270:
  Allow the connection object to be None, in which case messages to the
  object are discarded. This is to avoid sending invalidations to a
  client when it isn't ready or from requests that aren't used.
  
  Don't initially set the connection object for managed client
  connections.  The object will be set by the client when it connects.
  

Changed:
  U   ZODB/branches/jim-3.8-connection/src/ZEO/zrpc/client.py
  U   ZODB/branches/jim-3.8-connection/src/ZEO/zrpc/connection.py

-=-
Modified: ZODB/branches/jim-3.8-connection/src/ZEO/zrpc/client.py
===================================================================
--- ZODB/branches/jim-3.8-connection/src/ZEO/zrpc/client.py	2008-07-11 21:41:31 UTC (rev 88269)
+++ ZODB/branches/jim-3.8-connection/src/ZEO/zrpc/client.py	2008-07-11 21:41:34 UTC (rev 88270)
@@ -447,8 +447,7 @@
         Call the client's testConnection(), giving the client a chance
         to do app-level check of the connection.
         """
-        self.conn = ManagedClientConnection(self.sock, self.addr,
-                                            self.client, self.mgr)
+        self.conn = ManagedClientConnection(self.sock, self.addr, self.mgr)
         self.sock = None # The socket is now owned by the connection
         try:
             self.preferred = self.client.testConnection(self.conn)

Modified: ZODB/branches/jim-3.8-connection/src/ZEO/zrpc/connection.py
===================================================================
--- ZODB/branches/jim-3.8-connection/src/ZEO/zrpc/connection.py	2008-07-11 21:41:31 UTC (rev 88269)
+++ ZODB/branches/jim-3.8-connection/src/ZEO/zrpc/connection.py	2008-07-11 21:41:34 UTC (rev 88270)
@@ -555,14 +555,23 @@
             self.replies_cond.release()
 
     def handle_request(self, msgid, flags, name, args):
-        if not self.check_method(name):
-            msg = "Invalid method name: %s on %s" % (name, repr(self.obj))
+        obj = self.obj
+        
+        if name.startswith('_') or not hasattr(obj, name):
+            if obj is None:
+                if __debug__:
+                    self.log("no object calling %s%s"
+                             % (name, short_repr(args)),
+                             level=logging.DEBUG)
+                return
+                
+            msg = "Invalid method name: %s on %s" % (name, repr(obj))
             raise ZRPCError(msg)
         if __debug__:
             self.log("calling %s%s" % (name, short_repr(args)),
                      level=logging.DEBUG)
 
-        meth = getattr(self.obj, name)
+        meth = getattr(obj, name)
         try:
             self.waiting_for_reply = True
             try:
@@ -601,12 +610,6 @@
                  level=logging.ERROR, exc_info=True)
         self.close()
 
-    def check_method(self, name):
-        # TODO:  This is hardly "secure".
-        if name.startswith('_'):
-            return None
-        return hasattr(self.obj, name)
-
     def send_reply(self, msgid, ret):
         # encode() can pass on a wide variety of exceptions from cPickle.
         # While a bare `except` is generally poor practice, in this case
@@ -897,7 +900,7 @@
     __super_close = Connection.close
     base_message_output = Connection.message_output
 
-    def __init__(self, sock, addr, obj, mgr):
+    def __init__(self, sock, addr, mgr):
         self.mgr = mgr
 
         # We can't use the base smac's message_output directly because the
@@ -914,7 +917,7 @@
         self.queue_output = True
         self.queued_messages = []
 
-        self.__super_init(sock, addr, obj, tag='C', map=client_map)
+        self.__super_init(sock, addr, None, tag='C', map=client_map)
         self.thr_async = True
         self.trigger = client_trigger
         client_trigger.pull_trigger()



More information about the Checkins mailing list