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, [])
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)
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)
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))
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
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
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)
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)
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
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)
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)
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
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)
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)
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')
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', )
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()
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)
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()
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()
# 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")
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))
# 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()
def setUp(self): self.app = Application([MultipleReturnService], 'tns', Wsdl11(), Soap11(), Soap11()) self.app.interface.build_interface_document('url')