text: #!/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
  