#!/usr/bin/env python # # Copyright (c) 2001 actzero, inc. All rights reserved. import sys sys.path.insert(1, "..") from SOAPpy import * # Uncomment to see outgoing HTTP headers and SOAP and incoming Config.dumpSOAPIn = 1 Config.dumpSOAPOut = 1 Config.debug = 1 # specify name of authorization function Config.authMethod = "_authorize" # Set this to 0 to test authorization allowAll = 1 # ask for returned SOAP responses to be converted to basic python types Config.simplify_objects = 1 # provide a mechanism to stop the server run = 1 def quit(): global run run=0; if Config.SSLserver: from M2Crypto import SSL def _authorize(*args, **kw): global allowAll, Config if Config.debug: print "Authorize (function) called! (result = %d)" % allowAll print "Arguments: %s" % kw if allowAll: return 1 else: return 0 # Simple echo def echo(s): global Config # Test of context retrieval ctx = Server.GetSOAPContext() if Config.debug: print "SOAP Context: ", ctx return s + s # An echo class class echoBuilder2: def echo2(self, val): return val * 3 # A class that has an instance variable which is an echo class class echoBuilder: def __init__(self): self.prop = echoBuilder2() def echo_ino(self, val): return val + val def _authorize(self, *args, **kw): global allowAll, Config if Config.debug: print "Authorize (method) called with arguments:" print "*args=%s" % str(args) print "**kw =%s" % str(kw) print "Approved -> %d" % allowAll if allowAll: return 1 else: return 0 # Echo with context def echo_wc(s, _SOAPContext): global Config c = _SOAPContext sep = '-' * 72 # The Context object has extra info about the call if Config.debug: print "-- XML", sep[7:] # The original XML request print c.xmldata print "-- Header", sep[10:] # The SOAP Header or None if not present print c.header if c.header: print "-- Header.mystring", sep[19:] # An element of the SOAP Header print c.header.mystring print "-- Body", sep[8:] # The whole Body object print c.body print "-- Peer", sep[8:] if not GSI: # The socket object, useful for print c.connection.getpeername() else: # The socket object, useful for print c.connection.get_remote_address() ctx = c.connection.get_security_context() print ctx.inquire()[0].display() print "-- SOAPAction", sep[14:] # The SOAPaction HTTP header print c.soapaction print "-- HTTP headers", sep[16:] # All the HTTP headers print c.httpheaders return s + s # Echo with keyword arguments def echo_wkw(**kw): return kw['first'] + kw['second'] + kw['third'] # Simple echo def echo_simple(*arg): return arg def echo_header(s, _SOAPContext): global Config c = _SOAPContext return s, c.header addr = ('localhost', 9900) GSI = 0 SSL = 0 if len(sys.argv) > 1 and sys.argv[1] == '-s': SSL = 1 if not Config.SSLserver: raise RuntimeError, \ "this Python installation doesn't have OpenSSL and M2Crypto" ssl_context = SSL.Context() ssl_context.load_cert('validate/server.pem') server = SOAPServer(addr, ssl_context = ssl_context) prefix = 'https' elif len(sys.argv) > 1 and sys.argv[1] == '-g': GSI = 1 from SOAPpy.GSIServer import GSISOAPServer server = GSISOAPServer(addr) prefix = 'httpg' else: server = SOAPServer(addr) prefix = 'http' print "Server listening at: %s://%s:%d/" % (prefix, addr[0], addr[1]) # register the method server.registerFunction(echo) server.registerFunction(echo, path = "/pathtest") server.registerFunction(_authorize) server.registerFunction(_authorize, path = "/pathtest") # Register a whole object o = echoBuilder() server.registerObject(o, path = "/pathtest") server.registerObject(o) # Register a function which gets called with the Context object server.registerFunction(MethodSig(echo_wc, keywords = 0, context = 1), path = "/pathtest") server.registerFunction(MethodSig(echo_wc, keywords = 0, context = 1)) # Register a function that takes keywords server.registerKWFunction(echo_wkw, path = "/pathtest") server.registerKWFunction(echo_wkw) server.registerFunction(echo_simple) server.registerFunction(MethodSig(echo_header, keywords=0, context=1)) server.registerFunction(quit) # Start the server try: while run: server.handle_request() except KeyboardInterrupt: pass