Index: tests/translation_service/server.py |
=================================================================== |
--- tests/translation_service/server.py (revision 0) |
+++ tests/translation_service/server.py (revision 0) |
@@ -0,0 +1,97 @@ |
+import bc2nexe |
+import time |
+import sys |
+import urlparse |
+import urllib |
+import tempfile |
+import socket |
+import thread |
+from cache import * |
+from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer |
+ |
+class TranslateHandler(BaseHTTPRequestHandler): |
+ prefix = '/service?' |
+ # 10Mb translation cache |
+ cache = TranslationCache('./cache', 10 << 20) |
+ def do_GET(self): |
+ try: |
+ print self.server.server_port, self.path |
+ # You can't haz parent directories |
+ path = os.path.normpath(self.path) |
+ # Serve static data - for testing purposes |
+ if not self.path.startswith(TranslateHandler.prefix): |
+ f = open('.' + path, 'rb') |
+ self.send_response(200) |
+ self.end_headers() |
+ self.wfile.write(f.read()) |
+ f.close() |
+ return |
+ params = path[len(TranslateHandler.prefix):] |
+ params = urlparse.parse_qs(params, True) |
+ if not params.has_key('arch'): |
+ self.send_error(404, 'arch param not found') |
+ return |
+ arch = params['arch'][0] |
+ if not arch in ['x86-32', 'x86-64', 'arm']: |
+ self.send_error(404, 'arch param must be one of ' |
+ 'x86-32, x86-64, arm') |
+ return |
+ if not params.has_key('url'): |
+ self.send_error(404, 'url param not found') |
+ url = params['url'][0] |
+ if not url.startswith('http://') and not url.startswith('https://'): |
+ url = 'http://' + url |
+ t0 = time.time() |
+ tmpFile = tempfile.NamedTemporaryFile() |
+ try: |
+ _, message = urllib.urlretrieve(url, tmpFile.name) |
+ print "retrieve", "%.3f" % (time.time() - t0) |
+ if url.endswith(".nexe"): |
+ self.send_response(200) |
+ self.send_header('Content-type', '') |
+ self.end_headers() |
+ self.wfile.write(tmpFile.read()) |
+ return |
+ outFile = None |
+ try: |
+ nexe_file, bc_key = TranslateHandler.cache.get_nexe( |
+ tmpFile.name, (arch,)) |
+ if nexe_file is None: |
+ inst = bc2nexe.Compiler('../../..') |
+ outFile = tempfile.NamedTemporaryFile() |
+ inst.generateNEXE([tmpFile.name], arch, outFile.name) |
+ TranslateHandler.cache.cache_nexe( |
+ tmpFile.name, outFile.name, |
+ (arch,), file_key = bc_key) |
+ else: |
+ outFile = open(nexe_file, 'rb') |
+ self.send_response(200) |
+ self.send_header('Content-type', 'application/x-nacl-srpc') |
+ self.end_headers() |
+ t0 = time.time() |
+ self.wfile.write(outFile.read()) |
+ print "send", "%.3f" % (time.time() - t0) |
+ finally: |
+ if not (outFile is None): |
+ outFile.close() |
+ finally: |
+ tmpFile.close() |
+ except IOError, error: |
+ print error |
+ self.send_error(404, str(error)) |
+ except bc2nexe.TranslateError, error: |
+ print error |
+ self.send_error(500, str(error)) |
+def startserver(port): |
+ try: |
+ server = HTTPServer(('', port), TranslateHandler) |
+ server.serve_forever() |
+ except KeyboardInterrupt: |
+ server.socket.close() |
+ sys.exit(0) |
+if __name__ == '__main__': |
+ socket.setdefaulttimeout(30) |
+ # Our servers are single-threaded, so we need one server to retrieve |
+ # the bitcode and another server to compile it. |
+ thread.start_new_thread(startserver, (4444,)) |
+ startserver(4445) |
Property changes on: tests/translation_service/server.py |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |