1: #!/usr/bin/python
   2: 
   3: #Requestor code
   4: 
   5: import string, httplib, mimetools
   6:
   7: thisport = 3333
   8: otherport = 3334
   9:
  10: def requestor_thread_function():
  11:     while 1:
  12:         num_series = raw_input("Please enter a series of numbers, separated by spaces: ")
  13:         num_list = string.split(num_series)
  14:         body = '<?xml version="1.0"?>\n<numbers-to-sum>\n'
  15:         for num in num_list:
  16:             body = body + "<number>" + num + "</number>\n"
  17:         body = body + "</numbers-to-sum>"
  18:         blen = len(body)
  19:         requestor = httplib.HTTP('127.0.0.1', otherport)
  20:         requestor.putrequest('POST', '/echo-request')
  21:         requestor.putheader('Host', '127.0.0.1')
  22:         requestor.putheader('Content-Type', 'text/plain; charset="iso-8859-1"')
  23:         requestor.putheader('Content-Length', str(blen))
  24:         requestor.endheaders()
  25:         requestor.send(body)
  26:         (status_code, message, reply_headers) = requestor.getreply()
  27:         reply_body = requestor.getfile().read()
  28:         print status_code
  29:         print message
  30:         print reply_body
  31:
  32:
  33: #Listener code
  34:
  35: import string, BaseHTTPServer
  36: from xml.dom.ext.reader import PyExpat
  37: reader = PyExpat.Reader()
  38:
  39: class XmlSumHttpServer(BaseHTTPServer.BaseHTTPRequestHandler):
  40:     def do_POST(self):
  41:         clen = self.headers.getheader('content-length')
  42:         if clen:
  43:             clen = string.atoi(clen)
  44:         else:
  45:             print 'POST ERROR: missing content-length'
  46:             return
  47:         input_body = self.rfile.read(clen)
  48:
  49:         xmldoc = reader.fromString(input_body)
  50:         nums = xmldoc.getElementsByTagNameNS('', 'number')
  51:         total = 0
  52:         for num_elem in nums:
  53:             num_node = num_elem.firstChild
  54:             num_str = num_node.data
  55:             total = total + string.atof(num_str)
  56:
  57:         output_body = '<?xml version="1.0"?>\n<total>' + str(total) + '</total>'
  58:         olen = len(output_body)
  59:         self.send_response(200, 'OK')
  60:         self.send_header('Content-type', 'text/plain; charset=iso-8859-1')
  61:         self.send_header('Content-length', str(output_body))
  62:         self.end_headers()
  63:         self.wfile.write(output_body)
  64:         return
  65:
  66:
  67: def listener_thread_function():
  68:     server_address = ('127.0.0.1', thisport)
  69:     httpd = BaseHTTPServer.HTTPServer(server_address, XmlSumHttpServer)
  70:     print "Listening on port", thisport
  71:     httpd.serve_forever()
  72:
  73:
  74: #Binding it together
  75:
  76: from threading import Thread
  77:
  78: listener_thread = Thread(None, listener_thread_function)
  79: requestor_thread = Thread(None, requestor_thread_function)
  80:
  81: listener_thread.start()
  82: requestor_thread.start()