home *** CD-ROM | disk | FTP | other *** search
/ Australian Personal Computer 1999 May / APC452.ISO / netkit / xitami / xitami.exe / TESTLRWP.PY < prev    next >
Encoding:
Python Source  |  1998-05-06  |  6.3 KB  |  210 lines

  1. #!/bin/env python
  2. #------------------------------------------------------------------------
  3. #               Copyright (c) 1997 by Total Control Software
  4. #                         All Rights Reserved
  5. #------------------------------------------------------------------------
  6. #
  7. # Module Name:  testlrwp.py
  8. #
  9. # Description:  Class LRWP handles the connection to the LRWP agent in
  10. #               Xitami.  This class can be used standalone or derived
  11. #               from to override behavior.
  12. #
  13. # Creation Date:    11/11/97 8:36:21PM
  14. #
  15. #             $Id:$
  16. #
  17. #------------------------------------------------------------------------
  18.  
  19. import  sys, socket, string
  20. from    cStringIO import StringIO
  21.  
  22.  
  23. LENGTHSIZE  = 9
  24. LENGTHFMT   = '%09d'
  25.  
  26. #---------------------------------------------------------------------------
  27. # Exception objects
  28.  
  29. ConnectError        = 'lrwp.ConnectError'
  30. ConnectionClosed    = 'lrwp.ConnectionClosed'
  31. SocketError         = 'lrwp.SocketError'
  32.  
  33. #---------------------------------------------------------------------------
  34.  
  35. class Request:
  36.     def __init__(self, lrwp):
  37.         self.inp = lrwp.inp
  38.         self.out = lrwp.out
  39.         self.err = lrwp.out
  40.         self.env = lrwp.env
  41.         self.lrwp = lrwp
  42.  
  43.     def finish(self):
  44.         self.lrwp.finish()
  45.  
  46.     def getFieldStorage(self):
  47.         method = 'POST'
  48.         if self.env.has_key('REQUEST_METHOD'):
  49.             method = string.upper(self.env['REQUEST_METHOD'])
  50.         if method == 'GET':
  51.             return cgi.FieldStorage(environ=self.env, keep_blank_values=1)
  52.         else:
  53.             return cgi.FieldStorage(fp=self.inp, environ=self.env, keep_blank_values=1)
  54.  
  55.  
  56. #---------------------------------------------------------------------------
  57.  
  58. class LRWP:
  59.     def __init__(self, name, host, port, vhost='', filter='', useStdio=0):
  60.         self.name = name
  61.         self.host = host
  62.         self.port = port
  63.         self.vhost = vhost
  64.         self.filter = filter
  65.         self.useStdio = useStdio
  66.         self.sock = None
  67.         self.env = None
  68.         self.inp = None
  69.         self.out = None
  70.  
  71.     #----------------------------------------
  72.     def connect(self):
  73.         try:
  74.             self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  75.             self.sock.connect(self.host, self.port)
  76.             self.sock.send("%s\xFF%s\xFF%s" % (self.name, self.vhost, self.filter) )
  77.             buf = self.sock.recv(1024)
  78.             if buf != 'OK':
  79.                 raise ConnectError, buf
  80.         except socket.error, val:
  81.             raise SocketError, val
  82.  
  83.     #----------------------------------------
  84.     def acceptRequest(self):
  85.         if self.out:
  86.             self.finish()
  87.         try:
  88.             # get the length of the environment data
  89.             data = self.sock.recv(LENGTHSIZE)
  90.             if not data:        # server closed down
  91.                 raise ConnectionClosed
  92.             length = string.atoi(data)
  93.  
  94.             # and then the environment data
  95.             data = self.sock.recv(length)
  96.             if not data:        # server closed down
  97.                 raise ConnectionClosed
  98.             data = string.split(data, '\000')
  99.             self.env = {}
  100.             for x in data:
  101.                 x = string.split(x, '=')
  102.                 if len(x) > 1:
  103.                     self.env[x[0]] = string.join(x[1:], '=')
  104.  
  105.             # now get the size of the POST data
  106.             data = self.sock.recv(LENGTHSIZE)
  107.             if not data:        # server closed down
  108.                 raise ConnectionClosed
  109.             length = string.atoi(data)
  110.  
  111.             # and the POST data...
  112.             if length:
  113.                 data = self.sock.recv(length)
  114.                 if not data:        # server closed down
  115.                     raise ConnectionClosed
  116.                 self.inp = StringIO(data)
  117.             else:
  118.                 self.inp = StringIO()
  119.  
  120.             self.out = StringIO()
  121.  
  122.             if self.useStdio:
  123.                 self.saveStdio = sys.stdin, sys.stdout, sys.stderr, os.environ
  124.                 sys.stdin, sys.stdout, sys.stderr, os.environ = \
  125.                     self.inp, self.out, self.out, self.env
  126.  
  127.             return Request(self)
  128.  
  129.         except socket.error, val:
  130.             raise SocketError, val
  131.  
  132.  
  133.     #----------------------------------------
  134.     def finish(self):
  135.         doc = self.out.getvalue()
  136.         size = LENGTHFMT % (len(doc), )
  137.         try:
  138.             self.sock.send(size)
  139.             self.sock.send(doc)
  140.         except socket.error, val:
  141.             raise SocketError, val
  142.  
  143.         if self.useStdio:
  144.             sys.stdin, sys.stdout, sys.stderr, os.environ = self.saveStdio
  145.  
  146.         self.env = None
  147.         self.inp = None
  148.         self.out = None
  149.  
  150.     #----------------------------------------
  151.     def close(self):
  152.         self.sock.close()
  153.         self.sock = None
  154.         self.env = None
  155.         self.inp = None
  156.         self.out = None
  157.  
  158. #---------------------------------------------------------------------------
  159.  
  160.  
  161. def _test():
  162.     import os, time
  163.  
  164.     eol = '\r\n'
  165.     appname = 'testapp1'
  166.     vhost = ''
  167.     if len(sys.argv) > 1:
  168.         appname = sys.argv[1]
  169.     if len(sys.argv) > 2:
  170.         vhost = sys.argv[2]
  171.     lrwp = LRWP(appname, 'rogue', 5081, vhost)
  172.     lrwp.connect()
  173.  
  174.     count = 0
  175.     while count < 5:
  176.         req = lrwp.acceptRequest()
  177.  
  178.         doc = ['<HTML><HEAD><TITLE>LRWP TestApp ('+appname+')</TITLE></HEAD>\n<BODY>\n']
  179.         count = count + 1
  180.         doc.append('<H2>LRWP test app ('+appname+')</H2><P>')
  181.         doc.append('<b>request count</b> = %d<br>' % (count, ))
  182.         if hasattr(os, 'getpid'):
  183.             doc.append('<b>pid</b> = %s<br>' % (os.getpid(), ))
  184.         doc.append('<br><b>post data:</b> ' + req.inp.read() + '<br>')
  185.  
  186.         doc.append('<P><HR><P><pre>')
  187.         keys = req.env.keys()
  188.         keys.sort()
  189.         for k in keys:
  190.             doc.append('<b>%-20s :</b>  %s\n' % (k, req.env[k]))
  191.         doc.append('\n</pre><P><HR>\n')
  192.         doc.append('</BODY></HTML>\n')
  193.  
  194.  
  195.         req.out.write('Content-type: text/html' + eol)
  196.         req.out.write(eol)
  197.         req.out.write(string.join(doc, ''))
  198.  
  199.         #time.sleep(2)
  200.         req.finish()
  201.  
  202.     lrwp.close()
  203.  
  204.  
  205. if __name__ == '__main__':
  206.     #import pdb
  207.     #pdb.run('_test()')
  208.     _test()
  209.  
  210.