示例#1
0
    def test_multiple_return(self):
        class SomeNotSoComplexModel(ComplexModel):
            s = String

        class SomeService(ServiceBase):
            @srpc(_returns=[Integer, String])
            def some_call():
                return 1, 's'

        app = Application([SomeService], 'tns', Wsdl11(), HttpRpc(), HttpRpc())

        from rpclib.server.wsgi import WsgiMethodContext

        initial_ctx = WsgiMethodContext(app, {
            'QUERY_STRING': '',
            'PATH_INFO': '/some_call',
        }, 'some-content-type')

        from rpclib.server import ServerBase

        server = ServerBase(app)
        try:
            ctx, = server.generate_contexts(initial_ctx)
            server.get_in_object(ctx)
            server.get_out_object(ctx)
            server.get_out_string(ctx)
        except ValueError:
            pass
        else:
            raise Exception("Must Fail")
示例#2
0
    def test_primitive_only(self):
        class SomeComplexModel(ComplexModel):
            i = Integer
            s = String

        class SomeService(ServiceBase):
            @srpc(SomeComplexModel, _returns=SomeComplexModel)
            def some_call(scm):
                return SomeComplexModel(i=5, s='5x')

        app = Application([SomeService], 'tns', Wsdl11(), HttpRpc(), HttpRpc())

        from rpclib.server.wsgi import WsgiMethodContext

        initial_ctx = WsgiMethodContext(app, {
            'QUERY_STRING': '',
            'PATH_INFO': '/some_call',
        }, 'some-content-type')

        from rpclib.server import ServerBase

        server = ServerBase(app)

        ctx, = server.generate_contexts(initial_ctx)
        server.get_in_object(ctx)
        print "!", ctx.in_object
        server.get_out_object(ctx)

        try:
            server.get_out_string(ctx)
        except:
            pass
        else:
            raise Exception("Must Fail")
示例#3
0
    def test_basic(self):
        class SomeService(ServiceBase):
            @srpc(String(pattern='a'))
            def some_method(s):
                pass

        application = Application(
            [SomeService],
            interface=Wsdl11(),
            in_protocol=Soap11(validator='soft'),
            out_protocol=Soap11(),
            name='Service',
            tns='tns',
        )

        ctx = MethodContext(application)
        ctx.in_string = [
            u"""
            <SOAP-ENV:Envelope xmlns:ns0="tns"
                               xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
               <SOAP-ENV:Body>
                  <ns0:some_method>
                     <ns0:s>OK</ns0:s>
                  </ns0:some_method>
               </SOAP-ENV:Body>
            </SOAP-ENV:Envelope>
        """
        ]

        from rpclib.server import ServerBase

        server = ServerBase(application)
        server.get_in_object(ctx)

        self.assertEquals(isinstance(ctx.in_error, ValidationError), True)
示例#4
0
    def test_complex(self):
        class CM(ComplexModel):
            i = Integer
            s = String

        class CCM(ComplexModel):
            c = CM
            i = Integer
            s = String

        class SomeService(ServiceBase):
            @srpc(CCM, _returns=CCM)
            def some_call(ccm):
                return CCM(c=ccm.c, i=ccm.i, s=ccm.s)

        app = Application([SomeService], 'tns', Wsdl11(), HttpRpc(), HttpRpc())

        from rpclib.server.wsgi import WsgiMethodContext

        initial_ctx = WsgiMethodContext(app, {
            'QUERY_STRING': '',
            'PATH_INFO': '/some_call',
        }, 'some-content-type')

        from rpclib.server import ServerBase

        server = ServerBase(app)
        ctx, = server.generate_contexts(initial_ctx)
        server.get_in_object(ctx)
        server.get_out_object(ctx)
        server.get_out_string(ctx)
示例#5
0
    def test_add_to_schema_w_extends(self):
        import rpclib.const.xml_ns
        ns_xsd = rpclib.const.xml_ns.xsd

        class base(Fault):
            __namespace__ = 'ns'
            @classmethod
            def get_type_name_ns(self, app):
                return 'testing:Base'
        class cls(Fault):
            __namespace__ = 'ns'
            @classmethod
            def get_type_name_ns(self, app):
                return 'testing:My'

        interface = Wsdl11(FakeApp())
        interface.add(cls)

        pref = cls.get_namespace_prefix(interface)
        schema = interface.get_schema_info(pref)

        self.assertEqual(len(schema.types), 1)
        self.assertEqual(len(interface.classes), 1)
        c_cls = interface.classes.values()[0]
        c_elt = schema.types.values()[0]
        print c_cls, cls
        self.failUnless(c_cls is cls)
        self.assertEqual(c_elt.tag, '{%s}complexType' % ns_xsd)
        self.assertEqual(c_elt.get('name'), 'Fault')
        self.assertEqual(len(c_elt), 0)
示例#6
0
    def setUp(self):
        self.app = Application([TestService], 'tns', Wsdl11(), Soap11(),
                               Soap11())
        self.srv = TestService()

        self.app.interface.build_interface_document('URL')
        self.wsdl_str = self.app.interface.get_interface_document()
        self.wsdl_doc = etree.fromstring(self.wsdl_str)
示例#7
0
文件: __init__.py 项目: rch/rpclib
def build_app(service_list, tns, name):
    app = Application(service_list,
                      tns,
                      Wsdl11(),
                      Soap11(),
                      Soap11(),
                      name=name)
    app.transport = 'http://schemas.xmlsoap.org/soap/http'
    return app
示例#8
0
    def test_single_method(self):
        try:
            app = Application([MultipleMethods1, MultipleMethods2], 'tns',
                              Wsdl11(), Soap11(), Soap11())
            app.interface.build_interface_document('url')
            raise Exception('must fail.')

        except ValueError:
            pass
示例#9
0
文件: _base.py 项目: rch/rpclib
    def set_app(self, value):
        ProtocolBase.set_app(self, value)

        self.validation_schema = None

        if value:
            from rpclib.interface.wsdl import Wsdl11

            wsdl = Wsdl11(value)
            wsdl.build_validation_schema()

            self.validation_schema = wsdl.validation_schema
示例#10
0
    def test_add_to_schema(self):
        app = FakeApp()
        schema = Wsdl11(app)
        schema.add(Parameter)

        pref = Parameter.get_namespace_prefix(schema)
        type_def = schema.get_schema_info(pref).types[
            Parameter.get_type_name()]
        attribute_def = type_def.find('{%s}attribute' % xml_ns.xsd)
        self.assertIsNotNone(attribute_def)
        self.assertEqual(attribute_def.get('name'), 'name')
        self.assertEqual(attribute_def.get('type'), Parameter.name._typ)
示例#11
0
    def setup_services(self, applications):
        """Setting up the service that should be run by twisted. This is here
        an rpclib service in the standard WSGI format."""
        if type(applications) not in (list, tuple, dict):
            applications = [applications]

        self.service = rpclib.application.Application(
            applications,
            tns=self.namespace,
            interface=Wsdl11(),
            in_protocol=Soap11(validator='lxml'),
            out_protocol=Soap11())
        self.wsgi_application = WsgiApplication(self.service)
示例#12
0
def wsgi_soap11_application(services,
                            tns='rpclib.simple.soap',
                            validator=None):
    """Wraps `services` argument inside a WsgiApplication that uses Wsdl 1.1 as
    interface document and Soap 1.1 and both input and output protocols.
    """

    application = Application(services,
                              tns,
                              interface=Wsdl11(),
                              in_protocol=Soap11(validator=validator),
                              out_protocol=Soap11())

    return WsgiApplication(application)
示例#13
0
    def test_call(self):
        queue = set()

        class MessageService(ServiceBase):
            @srpc(String)
            def send_message(s):
                queue.add(s)

        application = Application([MessageService], 'some_tns',
            interface=Wsdl11(), in_protocol=Soap11(), out_protocol=Soap11())

        server = NullServer(application)
        server.service.send_message("zabaaa")

        assert set(["zabaaa"]) == queue
示例#14
0
    def setUp(self):
        class SomeService(ServiceBase):
            @srpc(String(pattern='a'))
            def some_method(s):
                pass

            @srpc(String(pattern='a', max_occurs=2))
            def some_other_method(s):
                pass

        self.application = Application(
            [SomeService],
            interface=Wsdl11(),
            in_protocol=HttpRpc(validator='soft'),
            out_protocol=Soap11(),
            name='Service',
            tns='tns',
        )
示例#15
0
    def test_multiple_methods(self):
        in_protocol = Soap11()
        out_protocol = Soap11()

        # for the sake of this test.
        in_protocol.supports_fanout_methods = True
        out_protocol.supports_fanout_methods = True

        app = Application([MultipleMethods1, MultipleMethods2],
                          'tns',
                          Wsdl11(),
                          in_protocol,
                          out_protocol,
                          supports_fanout_methods=True)
        app.interface.build_interface_document('url')

        mm = app.interface.service_method_map['{tns}multi']

        def find_class_in_mm(c):
            found = False
            for s, _ in mm:
                if s is c:
                    found = True
                    break

            return found

        assert find_class_in_mm(MultipleMethods1)
        assert find_class_in_mm(MultipleMethods2)

        def find_function_in_mm(f):
            i = 0
            found = False
            for _, d in mm:
                i += 1
                if d.function is f:
                    found = True
                    print i
                    break

            return found

        assert find_function_in_mm(MultipleMethods1.multi)
        assert find_function_in_mm(MultipleMethods2.multi)
示例#16
0
    def test_fanout(self):
        arr = set()

        class MessageService1(ServiceBase):
            @srpc()
            def send_message():
                arr.add(1)

        class MessageService2(ServiceBase):
            @srpc()
            def send_message():
                arr.add(2)

        application = Application([MessageService1,MessageService2], 'some_tns',
            interface=Wsdl11(), in_protocol=Soap11(), out_protocol=Soap11(),
            supports_fanout_methods=True)

        server = NullServer(application)
        server.service.send_message()

        assert set([1,2]) == arr
示例#17
0
    def test_nested_flatten(self):
        class CM(ComplexModel):
            i = Integer
            s = String

        class CCM(ComplexModel):
            c = CM
            i = Integer
            s = String

        class SomeService(ServiceBase):
            @srpc(CCM, _returns=String)
            def some_call(ccm):
                return repr(ccm)

        app = Application([SomeService], 'tns', Wsdl11(), HttpRpc(), HttpRpc())

        from rpclib.server.wsgi import WsgiMethodContext

        initial_ctx = WsgiMethodContext(
            app, {
                'QUERY_STRING': 'ccm_i=1&ccm_s=s&ccm_c_i=3&ccm_c_s=cs',
                'PATH_INFO': '/some_call',
            }, 'some-content-type')

        from rpclib.server import ServerBase

        server = ServerBase(app)
        ctx, = server.generate_contexts(initial_ctx)

        server.get_in_object(ctx)
        assert ctx.in_error is None

        server.get_out_object(ctx)
        assert ctx.out_error is None

        server.get_out_string(ctx)

        print ctx.out_string
        assert ctx.out_string == ["CCM(i=1, c=CM(i=3, s='cs'), s='s')"]
示例#18
0
    def test_nested_flatten_with_multiple_values_2(self):
        class CM(ComplexModel):
            i = Integer
            s = String

        class CCM(ComplexModel):
            c = CM.customize(max_occurs=2)
            i = Integer
            s = String

        class SomeService(ServiceBase):
            @srpc(CCM, _returns=String)
            def some_call(ccm):
                return repr(ccm)

        app = Application([SomeService], 'tns', Wsdl11(), HttpRpc(), HttpRpc())

        from rpclib.server.wsgi import WsgiMethodContext

        initial_ctx = WsgiMethodContext(
            app, {
                'QUERY_STRING': 'ccm_i=1&ccm_s=s&ccm_c_i=3&ccm_c_s=cs',
                'PATH_INFO': '/some_call',
            }, 'some-content-type')

        from rpclib.server import ServerBase

        server = ServerBase(app)
        ctx, = server.generate_contexts(initial_ctx)

        try:
            server.get_in_object(ctx)
        except:
            pass
        else:
            raise Exception(
                "Must fail with: Exception: HttpRpc deserializer "
                "does not support non-primitives with max_occurs > 1")
示例#19
0
    def setup_services(self, applications):
        """Setting up the service that should be run by twisted. This is here
        an rpclib service in the standard WSGI format."""
        if type(applications) not in (list, tuple, dict):
            applications = [applications]

        # Set the encoding for SOAP data, converting it from unicode to some
        # str encoding. We could instead use the Unicode classes, but Cerebrum
        # doesn't support unicode natively quite yet.
        String.Attributes.encoding = 'latin1'

        # Ignore unencodable characters
        # The following function does the same as String.from_string, except
        # that it supplies 'ignore' as an argument to encode()
        from rpclib.model import nillable_string

        @classmethod
        @nillable_string
        def from_string(cls, value):
            retval = value
            if isinstance(value, unicode):
                if cls.Attributes.encoding is None:
                    raise Exception("You need to define an encoding to "
                                    "convert the incoming unicode values to.")
                else:
                    retval = value.encode(cls.Attributes.encoding, 'ignore')
            return retval

        String.from_string = from_string

        self.service = rpclib.application.Application(
            applications,
            tns=self.namespace,
            interface=Wsdl11(),
            in_protocol=Soap11(validator='lxml'),
            out_protocol=Soap11())
        self.wsgi_application = WsgiApplication(self.service)
示例#20
0
    def test_multiple(self):
        class SomeService(ServiceBase):
            @srpc(String(max_occurs='unbounded'), _returns=String)
            def some_call(s):
                return '\n'.join(s)

        app = Application([SomeService], 'tns', Wsdl11(), HttpRpc(), HttpRpc())

        from rpclib.server.wsgi import WsgiMethodContext

        initial_ctx = WsgiMethodContext(app, {
            'QUERY_STRING': 's=1&s=2',
            'PATH_INFO': '/some_call',
        }, 'some-content-type')

        from rpclib.server import ServerBase

        server = ServerBase(app)
        ctx, = server.generate_contexts(initial_ctx)
        server.get_in_object(ctx)
        server.get_out_object(ctx)
        server.get_out_string(ctx)

        assert ctx.out_string == ['1\n2']
示例#21
0
    def send_location(clientid):
        print "Asking the RMI Server about ", clientid
        push_property = Pyro4.Proxy("PYRONAME:property.id")
        a = push_property.scanProplist(clientid)
        yield str(a)


if __name__ == '__main__':
    try:
        from wsgiref.simple_server import make_server
    except ImportError:
        print "Error: server requires Python >= 2.5"

    logging.basicConfig(level=logging.INFO)
    logging.getLogger('rpclib.protocol.xml').setLevel(logging.DEBUG)

    application = Application([MessageService],
                              'org.temporary.soap',
                              interface=Wsdl11(),
                              in_protocol=Soap11(),
                              out_protocol=Soap11())

    port = int(os.environ.get('PORT', 5007))

    server = make_server('0.0.0.0', port, WsgiApplication(application))

    print "listening to http://0.0.0.0:%s" % port
    print "wsdl is at: http://0.0.0.0:%s/?wsdl" % port

    server.serve_forever()
示例#22
0
文件: test_sqla.py 项目: rch/rpclib
    def test_rpc(self):
        import sqlalchemy
        from sqlalchemy import sql

        class KeyValuePair(TableSerializer, self.DeclarativeBase):
            __tablename__ = 'key_value_store'
            __namespace__ = 'punk'

            key = Column(sqlalchemy.String(100), nullable=False, primary_key=True)
            value = Column(sqlalchemy.String, nullable=False)

        self.metadata.create_all(self.engine)

        import hashlib

        session = self.Session()

        for i in range(1, 10):
            key = str(i)
            m = hashlib.md5()
            m.update(key)
            value = m.hexdigest()

            session.add(KeyValuePair(key=key, value=value))

        session.commit()

        from rpclib.service import ServiceBase
        from rpclib.model.complex import Array
        from rpclib.model.primitive import String

        class Service(ServiceBase):
            @rpc(String(max_occurs='unbounded'),
                    _returns=Array(KeyValuePair),
                    _in_variable_names={
                        'keys': 'key'
                    }
                )
            def get_values(ctx, keys):
                session = self.Session()

                return session.query(KeyValuePair).filter(sql.and_(
                    KeyValuePair.key.in_(keys)
                )).order_by(KeyValuePair.key)

        application = Application([Service],
            interface=Wsdl11(),
            in_protocol=HttpRpc(),
            out_protocol=Soap11(),
            name='Service', tns='tns'
        )

        from rpclib.server.wsgi import WsgiMethodContext

        ctx = WsgiMethodContext(application, {
            'QUERY_STRING': 'key=1&key=2&key=3',
            'PATH_INFO': '/get_values',
        }, 'some-content-type')

        from rpclib.server import ServerBase

        server = ServerBase(application)
        server.get_in_object(ctx)
        server.get_out_object(ctx)
        server.get_out_string(ctx)

        i = 0
        for e in ctx.out_document[0][0][0]:
            i+=1
            key = str(i)
            m = hashlib.md5()
            m.update(key)
            value = m.hexdigest()

            _key = e.find('{%s}key' % KeyValuePair.get_namespace())
            _value = e.find('{%s}value' % KeyValuePair.get_namespace())

            print((_key, _key.text))
            print((_value, _value.text))

            self.assertEquals(_key.text, key)
            self.assertEquals(_value.text, value)
示例#23
0
from rpclib.protocol.soap import Soap11
from rpclib.service import ServiceBase
from rpclib.model.complex import Iterable
from rpclib.model.primitive import Integer
from rpclib.model.primitive import String
from rpclib.server.wsgi import WsgiApplication

class MessageService(ServiceBase):
    @srpc(String, Integer, _returns=Iterable(String))
    def send_message(msg):
        yield 'Your message: %s' % msg

    if __name__=='__main__':
        try:
            from wsgiref.simple_server import make_server
        except ImportError:
            print "Error: server requires Python >= 2.5"

logging.basicConfig(level=logging.INFO)
logging.getLogger('rpclib.protocol.xml').setLevel(logging.DEBUG)

application = Application([MessageService], 'org.temporary.soap',interface=Wsdl11(), in_protocol=Soap11(), out_protocol=Soap11())

port = int(os.environ.get('PORT', 5000))

server = make_server('0.0.0.0', port, WsgiApplication(application))

print "listening to http://0.0.0.0:%s" % port
print "wsdl is at: http://0.0.0.0:%s/?wsdl" % port

server.serve_forever()
示例#24
0
        and returns it. If the path isn't found, an exception is
        raised.
        '''

        if not os.path.exists(file_path) or file_path is None:
            raise ArgumentError("File '%s' not found" % file_path)

        document = open(file_path, 'rb').read()

        return [document]

if __name__=='__main__':
    # this must be set before instantiating the protocols.
    logging.getLogger('rpclib.protocol.xml').setLevel(logging.DEBUG)

    try:
        from wsgiref.simple_server import make_server
    except ImportError:
        print("Error: example server code requires Python >= 2.5")

    application = Application([DocumentArchiver], 'rpclib.examples.binary',
                interface=Wsdl11(), in_protocol=Soap11(), out_protocol=Soap11())

    logging.basicConfig(level=logging.DEBUG)

    server = make_server('127.0.0.1', 7789, WsgiApplication(application))
    print("listening to http://127.0.0.1:7789")
    print("wsdl is at: http://localhost:7789/?wsdl")

    server.serve_forever()
示例#25
0
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
#

import logging
logging.basicConfig(level=logging.DEBUG)
logging.getLogger('rpclib.protocol.xml').setLevel(logging.DEBUG)
logger = logging.getLogger('rpclib.test.interop.server.soap_http_basic')

from rpclib.server.wsgi import WsgiApplication
from rpclib.test.interop.server._service import services
from rpclib.application import Application
from rpclib.protocol.soap import Soap11
from rpclib.interface.wsdl import Wsdl11

soap_application = Application(services, 'rpclib.test.interop.server',
                               Wsdl11(), Soap11(validator='lxml'), Soap11())

if __name__ == '__main__':
    try:
        from wsgiref.simple_server import make_server
        from wsgiref.validate import validator

        wsgi_application = WsgiApplication(soap_application)
        server = make_server('0.0.0.0', 9753, validator(wsgi_application))

        logger.info('Starting interop server at %s:%s.' % ('0.0.0.0', 9753))
        logger.info('WSDL is at: /?wsdl')
        server.serve_forever()

    except ImportError:
        print("Error: example server code requires Python >= 2.5")
示例#26
0
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
#

import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger('rpclib.protocol.xml')
logger.setLevel(logging.DEBUG)

from rpclib.application import Application
from rpclib.test.interop.server._service import services
from rpclib.protocol.soap import Soap11
from rpclib.protocol.http import HttpRpc
from rpclib.interface.wsdl import Wsdl11

httprpc_soap_application = Application(services,
    'rpclib.test.interop.server.httprpc.soap', Wsdl11(), HttpRpc(), Soap11())

from rpclib.server.wsgi import WsgiApplication

if __name__ == '__main__':
    try:
        from wsgiref.simple_server import make_server
        from wsgiref.validate import validator

        wsgi_application = WsgiApplication(httprpc_soap_application)
        server = make_server('0.0.0.0', 9756, validator(wsgi_application))

        logger.info('Starting interop server at %s:%s.' % ('0.0.0.0', 9756))
        logger.info('WSDL is at: /?wsdl')
        server.serve_forever()
示例#27
0
 def setUp(self):
     self.app = Application([MultipleReturnService], 'tns', Wsdl11(),
                            Soap11(), Soap11())
     self.app.interface.build_interface_document('url')
示例#28
0
#

"""pod being plain old data"""

import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger('rpclib.protocol.xml')
logger.setLevel(logging.DEBUG)

from rpclib.application import Application
from rpclib.test.interop.server._service import services
from rpclib.protocol.http import HttpRpc
from rpclib.interface.wsdl import Wsdl11

httprpc_soap_application = Application(services,
        'rpclib.test.interop.server.httprpc.pod', Wsdl11(), HttpRpc(), HttpRpc())
from rpclib.server.wsgi import WsgiApplication

if __name__ == '__main__':
    try:
        from wsgiref.simple_server import make_server
        from wsgiref.validate import validator

        wsgi_application = WsgiApplication(httprpc_soap_application)
        server = make_server('0.0.0.0', 9757, validator(wsgi_application))

        logger.info('Starting interop server at %s:%s.' % ('0.0.0.0', 9757))
        logger.info('WSDL is at: /?wsdl')
        server.serve_forever()

    except ImportError:
示例#29
0
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
#

import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger('rpclib.protocol.xml')
logger.setLevel(logging.DEBUG)

from rpclib.application import Application
from rpclib.test.interop.server._service import services
from rpclib.protocol.csv import OutCsv
from rpclib.protocol.http import HttpRpc
from rpclib.interface.wsdl import Wsdl11

httprpc_csv_application = Application(
    services, 'rpclib.test.interop.server.httprpc.csv', Wsdl11(), HttpRpc(),
    OutCsv())
from rpclib.server.wsgi import WsgiApplication

if __name__ == '__main__':
    try:
        from wsgiref.simple_server import make_server
        from wsgiref.validate import validator

        wsgi_application = WsgiApplication(httprpc_csv_application)
        server = make_server('0.0.0.0', 9755, validator(wsgi_application))

        logger.info('Starting interop server at %s:%s.' % ('0.0.0.0', 9755))
        logger.info('WSDL is at: /?wsdl')
        server.serve_forever()