Пример #1
0
    def test_class_to_parent_element(self):
        m = Message.produce(namespace=None,
                            type_name='myMessage',
                            members={'p': Person})

        m.resolve_namespace(m, "punk")

        m_inst = m()
        m_inst.p = Person()
        m_inst.p.name = 'steve-o'
        m_inst.p.age = 2
        m_inst.p.addresses = []

        element = etree.Element('test')
        Soap11().to_parent_element(m, m_inst, m.get_namespace(), element)
        element = element[0]

        self.assertEquals(element.tag, '{%s}myMessage' % m.get_namespace())
        self.assertEquals(
            element[0].find('{%s}name' % Person.get_namespace()).text,
            'steve-o')
        self.assertEquals(
            element[0].find('{%s}age' % Person.get_namespace()).text, '2')
        self.assertEquals(
            len(element[0].find('{%s}addresses' % Person.get_namespace())), 0)

        p1 = Soap11().from_element(m, element)[0]

        self.assertEquals(p1.name, m_inst.p.name)
        self.assertEquals(p1.age, m_inst.p.age)
        self.assertEquals(p1.addresses, [])
Пример #2
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)
Пример #3
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)
Пример #4
0
    def test_data(self):
        element = etree.Element('test')
        Soap11().to_parent_element(ByteArray, self.data, ns_test, element)
        print etree.tostring(element, pretty_print=True)
        element = element[0]

        a2 = Soap11().from_element(ByteArray, element)
        self.assertEquals(_bytes_join(self.data), _bytes_join(a2))
Пример #5
0
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
Пример #6
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
Пример #7
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)
Пример #8
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)
Пример #9
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
Пример #10
0
    def test_to_parent_element_nested(self):
        m = Message.produce(namespace=None,
                            type_name='myMessage',
                            members={'p': Person})

        m.resolve_namespace(m, "m")

        p = Person()
        p.name = 'steve-o'
        p.age = 2
        p.addresses = []

        for i in range(0, 100):
            a = Address()
            a.street = '123 happy way'
            a.zip = i
            a.laditude = '45.22'
            a.longitude = '444.234'
            p.addresses.append(a)

        m_inst = m(p=p)

        element = etree.Element('test')
        Soap11().to_parent_element(m, m_inst, m.get_namespace(), element)
        element = element[0]

        self.assertEquals('{%s}myMessage' % m.get_namespace(), element.tag)

        addresses = element[0].find('{%s}addresses' % Person.get_namespace())
        self.assertEquals(100, len(addresses))
        self.assertEquals(
            '0', addresses[0].find('{%s}zip' % Address.get_namespace()).text)
Пример #11
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)
Пример #12
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
Пример #13
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)
Пример #14
0
    def test_simple_message(self):
        m = Message.produce(namespace=None,
                            type_name='myMessage',
                            members={
                                's': String,
                                'i': Integer
                            })
        m.resolve_namespace(m, 'test')

        m_inst = m(s="a", i=43)

        e = etree.Element('test')
        Soap11().to_parent_element(m, m_inst, m.get_namespace(), e)
        e = e[0]

        self.assertEquals(e.tag, '{%s}myMessage' % m.get_namespace())

        self.assertEquals(e.find('{%s}s' % m.get_namespace()).text, 'a')
        self.assertEquals(e.find('{%s}i' % m.get_namespace()).text, '43')

        values = Soap11().from_element(m, e)

        self.assertEquals('a', values.s)
        self.assertEquals(43, values.i)
Пример #15
0
    def test_namespaces(self):
        m = Message.produce(
            namespace="some_namespace",
            type_name='myMessage',
            members={
                's': String,
                'i': Integer
            },
        )

        mi = m()
        mi.s = 'a'

        e = etree.Element('test')
        Soap11().to_parent_element(m, mi, m.get_namespace(), e)
        e = e[0]

        self.assertEquals(e.tag, '{some_namespace}myMessage')
Пример #16
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',
        )
Пример #17
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()
Пример #18
0
    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)
Пример #19
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()
Пример #20
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()
Пример #21
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")
Пример #22
0
    if "session-id" not in cookie:
        raise UnauthenticatedError()
    session_cookie = cookie["session-id"].value
    session_id = tuple(base64.urlsafe_b64decode(session_cookie).split("\0", 1))
    if not session_id in session_db:
        raise AuthenticationError(session_id[0])
    ctx.udc = session_id[0]     # user name
    

UserService.event_manager.add_listener('method_call', _on_method_call)

if __name__=='__main__':
    from rpclib.util.wsgi_wrapper import run_twisted

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

    application = Application([UserService],
        tns='rpclib.examples.authentication',
        interface=Wsdl11(),
        in_protocol=Soap11(validator='lxml'),
        out_protocol=Soap11()
    )

    twisted_apps = [
        (WsgiApplication(application), 'app'),
    ]

    sys.exit(run_twisted(twisted_apps, 7789))
Пример #23
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()
Пример #24
0
 def setUp(self):
     self.app = Application([MultipleReturnService], 'tns', Wsdl11(),
                            Soap11(), Soap11())
     self.app.interface.build_interface_document('url')