我正在尝试将任意异常从XMLRPC服务器传递给客户端(两个python脚本,双方都定义了异常类型)。有一个模范的客户端实现 激活食谱 解析返回的“故障串”,将其与已知异常列表进行比较,如果发现,则提出了例外(而不是将其包装在 xmlrpclib.Fault).

XMLRPC异常响应的示例:

<?xml version='1.0'?>
<methodResponse>
  <fault>
    <value>
      <struct>
        <member>
          <name>faultCode</name>
          <value>
            <int>1</int>
          </value>
        </member>
        <member>
          <name>faultString</name>
          <value>
            <string>ValueError:</string>
          </value>
        </member>
      </struct>
    </value>
  </fault>
</methodResponse>

激活配方将“ valueerror:”字符串和比较“ valueerror”与 ValueError.__name__ (在 allowed_errors = [ValueError, TypeError], ,参见。上面的链接)。

可以通过吗 全部 这样的例外,IE会自动提出任何例外(源自 Exception 还是客户端(在服务器上抬起之后)上的其他一些基类)?

激活脚本有效,但我不想注册每个例外 可以 被扔 allowed_errors).

(奖励问题:除了XMLRPC可以正确处理此问题外,还有其他技术吗?PYRO?)

有帮助吗?

解决方案

你可以填充 allowed_errors 列表 __builtins__:

[exc for exc in __builtins__ if isinstance(exc, BaseException)]

这将处理常见的情况,对于内置的例外 ValueError, TypeError, OSError, 等等。您可能会做一些更先进的事情,例如Pyyaml和Pickle,在那里他们会自动寻找发送的任何引用的例外,但这使您对恶意攻击打开了自己的攻击。

如果您想要一种客户/服务器透明度,这些客户端/服务器透明度会自动从客户端上的服务器提高异常,那么Pyro可能是比XML-RPC更好的选择。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top