ソースを参照

clean up multicall recursion guard a little, add test.

Chris McDonough 18 年 前
コミット
1c62d9f364
2 ファイル変更17 行追加3 行削除
  1. 16 0
      src/supervisor/tests.py
  2. 1 3
      src/supervisor/xmlrpc.py

+ 16 - 0
src/supervisor/tests.py

@@ -1240,6 +1240,22 @@ class SystemNamespaceXMLRPCInterfaceTests(TestBase):
         self.assertEqual(result[0], interface.methodHelp('system.methodHelp'))
         self.assertEqual(result[1], interface.listMethods())
 
+    def test_multicall_recursion_guard(self):
+        interface = self._makeOne()
+        callback = interface.multicall([
+            {'methodName': 'system.multicall', 'params': []},        
+        ])
+
+        result = http.NOT_DONE_YET
+        while result is http.NOT_DONE_YET:
+            result = callback()
+        
+        code = xmlrpc.Faults.INCORRECT_PARAMETERS
+        desc = xmlrpc.getFaultDescription(code)
+        recursion_fault = {'faultCode': code, 'faultString': desc}
+
+        self.assertEqual(result, [recursion_fault])
+        
     def test_multicall_nested_callback(self):
         interface = self._makeOne()
         callback = interface.multicall([

+ 1 - 3
src/supervisor/xmlrpc.py

@@ -823,9 +823,7 @@ class SystemNamespaceRPCInterface:
                 params = call.get('params', [])
                 if name == 'system.multicall':
                     # Recursive system.multicall forbidden
-                    error = 'INCORRECT_PARAMETERS'
-                    raise xmlrpclib.Fault(Faults.INCORRECT_PARAMETERS,
-                                          error)
+                    raise RPCError(Faults.INCORRECT_PARAMETERS)
                 root = AttrDict(self.namespaces)
                 value = traverse(root, name, params)
             except RPCError, inst: