>>> 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
There is also skin support for XML-RPC:
Create two skins:
>>> import zope.interface >>> from zope.publisher.interfaces.xmlrpc import IXMLRPCSkinType >>> class SkinA(zope.interface.Interface): ... pass >>> zope.interface.directlyProvides(SkinA, IXMLRPCSkinType) >>> class SkinB(zope.interface.Interface): ... pass >>> zope.interface.directlyProvides(SkinB, IXMLRPCSkinType)
And create a request:
>>> class IRequest(zope.interface.Interface): ... pass >>> class Request(object): ... zope.interface.implements(IRequest)
>>> request = Request()
Now apply SkinA two our request
>>> import zope.publisher.xmlrpc >>> zope.publisher.xmlrpc.applySkin(request, SkinA) >>> list(zope.interface.providedBy(request).interfaces()) ... # doctest: +NORMALIZE_WHITESPACE [<InterfaceClass __builtin__.SkinA>, <InterfaceClass __builtin__.IRequest>]
Applying SkinB removes SkinA:
>>> zope.publisher.xmlrpc.applySkin(request, SkinB) >>> list(zope.interface.providedBy(request).interfaces()) ... # doctest: +NORMALIZE_WHITESPACE [<InterfaceClass __builtin__.SkinB>, <InterfaceClass __builtin__.IRequest>]