test_llsdmessage_peer.py
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:5k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. #!/usr/bin/python
  2. """
  3. @file   test_llsdmessage_peer.py
  4. @author Nat Goodspeed
  5. @date   2008-10-09
  6. @brief  This script asynchronously runs the executable (with args) specified on
  7.         the command line, returning its result code. While that executable is
  8.         running, we provide dummy local services for use by C++ tests.
  9. $LicenseInfo:firstyear=2008&license=viewergpl$
  10. Copyright (c) 2008-2010, Linden Research, Inc.
  11. Second Life Viewer Source Code
  12. The source code in this file ("Source Code") is provided by Linden Lab
  13. to you under the terms of the GNU General Public License, version 2.0
  14. ("GPL"), unless you have obtained a separate licensing agreement
  15. ("Other License"), formally executed by you and Linden Lab.  Terms of
  16. the GPL can be found in doc/GPL-license.txt in this distribution, or
  17. online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  18. There are special exceptions to the terms and conditions of the GPL as
  19. it is applied to this Source Code. View the full text of the exception
  20. in the file doc/FLOSS-exception.txt in this software distribution, or
  21. online at
  22. http://secondlifegrid.net/programs/open_source/licensing/flossexception
  23. By copying, modifying or distributing this software, you acknowledge
  24. that you have read and understood your obligations described above,
  25. and agree to abide by those obligations.
  26. ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  27. WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  28. COMPLETENESS OR PERFORMANCE.
  29. $/LicenseInfo$
  30. """
  31. import os
  32. import sys
  33. from threading import Thread
  34. from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
  35. mydir = os.path.dirname(__file__)       # expected to be .../indra/llmessage/tests/
  36. sys.path.insert(0, os.path.join(mydir, os.pardir, os.pardir, "lib", "python"))
  37. from indra.util.fastest_elementtree import parse as xml_parse
  38. from indra.base import llsd
  39. from testrunner import run, debug
  40. class TestHTTPRequestHandler(BaseHTTPRequestHandler):
  41.     """This subclass of BaseHTTPRequestHandler is to receive and echo
  42.     LLSD-flavored messages sent by the C++ LLHTTPClient.
  43.     """
  44.     def read(self):
  45.         # The following logic is adapted from the library module
  46.         # SimpleXMLRPCServer.py.
  47.         # Get arguments by reading body of request.
  48.         # We read this in chunks to avoid straining
  49.         # socket.read(); around the 10 or 15Mb mark, some platforms
  50.         # begin to have problems (bug #792570).
  51.         try:
  52.             size_remaining = int(self.headers["content-length"])
  53.         except (KeyError, ValueError):
  54.             return ""
  55.         max_chunk_size = 10*1024*1024
  56.         L = []
  57.         while size_remaining:
  58.             chunk_size = min(size_remaining, max_chunk_size)
  59.             chunk = self.rfile.read(chunk_size)
  60.             L.append(chunk)
  61.             size_remaining -= len(chunk)
  62.         return ''.join(L)
  63.         # end of swiped read() logic
  64.     def read_xml(self):
  65.         # This approach reads the entire POST data into memory first
  66.         return llsd.parse(self.read())
  67. ##         # This approach attempts to stream in the LLSD XML from self.rfile,
  68. ##         # assuming that the underlying XML parser reads its input file
  69. ##         # incrementally. Unfortunately I haven't been able to make it work.
  70. ##         tree = xml_parse(self.rfile)
  71. ##         debug("Finished raw parsen")
  72. ##         debug("parsed XML tree %sn" % tree)
  73. ##         debug("parsed root node %sn" % tree.getroot())
  74. ##         debug("root node tag %sn" % tree.getroot().tag)
  75. ##         return llsd.to_python(tree.getroot())
  76.     def do_GET(self):
  77.         # Of course, don't attempt to read data.
  78.         self.answer(dict(reply="success", status=500,
  79.                          reason="Your GET operation requested failure"))
  80.     def do_POST(self):
  81.         # Read the provided POST data.
  82.         self.answer(self.read_xml())
  83.     def answer(self, data):
  84.         if "fail" not in self.path:
  85.             response = llsd.format_xml(data.get("reply", llsd.LLSD("success")))
  86.             self.send_response(200)
  87.             self.send_header("Content-type", "application/llsd+xml")
  88.             self.send_header("Content-Length", str(len(response)))
  89.             self.end_headers()
  90.             self.wfile.write(response)
  91.         else:                           # fail requested
  92.             status = data.get("status", 500)
  93.             reason = data.get("reason",
  94.                                self.responses.get(status,
  95.                                                   ("fail requested",
  96.                                                    "Your request specified failure status %s "
  97.                                                    "without providing a reason" % status))[1])
  98.             self.send_error(status, reason)
  99.     def log_request(self, code, size=None):
  100.         # For present purposes, we don't want the request splattered onto
  101.         # stderr, as it would upset devs watching the test run
  102.         pass
  103.     def log_error(self, format, *args):
  104.         # Suppress error output as well
  105.         pass
  106. class TestHTTPServer(Thread):
  107.     def run(self):
  108.         httpd = HTTPServer(('127.0.0.1', 8000), TestHTTPRequestHandler)
  109.         debug("Starting HTTP server...n")
  110.         httpd.serve_forever()
  111. if __name__ == "__main__":
  112.     sys.exit(run(server=TestHTTPServer(name="httpd"), *sys.argv[1:]))