>>> sample = {'foo': (1, ['x', 'y', 1.2])}
if we put the sample in a security proxy:
>>> from zope.security.checker import ProxyFactory >>> proxied_sample = ProxyFactory(sample)
We can still get to the data, but the non-rock data is proxied:
>>> from zope.security.proxy import Proxy >>> proxied_sample['foo'] (1, ['x', 'y', 1.2])>>> type(proxied_sample['foo']) is Proxy True >>> type(proxied_sample['foo'][1]) is Proxy True
But we can strip the proxies using premarshal:
>>> from zope.publisher.xmlrpc import premarshal>>> stripped = premarshal(proxied_sample) >>> stripped {'foo': [1, ['x', 'y', 1.2]]}>>> type(stripped['foo']) is Proxy False >>> type(stripped['foo'][1]) is Proxy False
So xmlrpclib will be happy. :)
We can also use premarshal to strip proxies off of Fault objects. We have to make a security declaration first though:
>>> import xmlrpclib >>> fault = xmlrpclib.Fault(1, 'waaa') >>> proxied_fault = ProxyFactory(fault) >>> stripped_fault = premarshal(proxied_fault) >>> type(stripped_fault) is Proxy False
Standard python datetime objects are also handled:
>>> import datetime >>> sample = datetime.datetime(2006,06,17,21,41,00) >>> stripped_date = premarshal(sample) >>> isinstance(stripped_date, datetime.datetime) False >>> isinstance(stripped_date, xmlrpclib.DateTime) True
We can also use premarshal to strip proxies off of Binary objects. We have to make a security declaration first though:
>>> import xmlrpclib
>>> binary = xmlrpclib.Binary('foobar')
>>> proxied_binary = ProxyFactory(binary)
>>> stripped_binary = premarshal(proxied_binary)
>>> type(stripped_binary) is Proxy
False