| #!/usr/bin/env python |
| # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| import json |
| import optparse |
| import os |
| import sys |
| import time |
| import traceback |
| from build import generate_deps_js_contents as deps_generator |
| from build import generate_template_contents as template_generator |
| |
| import SocketServer |
| import SimpleHTTPServer |
| import BaseHTTPServer |
| |
| DEFAULT_PORT = 8003 |
| DEPS_CHECK_DELAY = 30 |
| |
| toplevel_dir = os.path.abspath(os.path.dirname(__file__)) |
| src_dir = os.path.join(toplevel_dir, 'src') |
| test_data_dir = os.path.join(toplevel_dir, 'test_data') |
| |
| class Handler(SimpleHTTPServer.SimpleHTTPRequestHandler): |
| def __init__(self, *args, **kwargs): |
| SimpleHTTPServer.SimpleHTTPRequestHandler.__init__(self, *args, **kwargs) |
| |
| def send_response(self, code, message=None): |
| SimpleHTTPServer.SimpleHTTPRequestHandler.send_response(self, code, message) |
| if code == 200: |
| self.send_header('Cache-Control', 'no-cache') |
| |
| def do_GET_json_tests(self): |
| def is_test(x): |
| basename = os.path.basename(x) |
| if basename.startswith('.'): |
| return False |
| |
| if basename.endswith('_test.js'): |
| return True |
| return False |
| |
| test_filenames = [] |
| for dirpath, dirnames, filenames in os.walk(src_dir): |
| for f in filenames: |
| x = os.path.join(dirpath, f) |
| y = '/' + os.path.relpath(x, toplevel_dir) |
| if is_test(y): |
| test_filenames.append(y) |
| |
| test_filenames.sort() |
| |
| tests_as_json = json.dumps(test_filenames) |
| |
| self.send_response(200) |
| self.send_header('Content-Type', 'application/json') |
| self.send_header('Content-Length', len(tests_as_json)) |
| self.end_headers() |
| self.wfile.write(tests_as_json) |
| |
| def do_GET_example_files(self): |
| data_files = [] |
| for dirpath, dirnames, filenames in os.walk(test_data_dir): |
| for f in filenames: |
| data_files.append(f) |
| |
| data_files.sort() |
| files_as_json = json.dumps(data_files) |
| |
| self.send_response(200) |
| self.send_header('Content-Type', 'application/json') |
| self.send_header('Content-Length', len(files_as_json)) |
| self.end_headers() |
| self.wfile.write(files_as_json) |
| |
| def do_GET_deps(self): |
| current_time = time.time() |
| if self.server.next_deps_check < current_time: |
| self.log_message('Regenerating ' + self.path) |
| try: |
| self.server.deps = deps_generator.generate_deps_js() |
| except Exception, ex: |
| msg = json.dumps({"details": traceback.format_exc(), |
| "message": ex.message}); |
| self.log_error('While parsing deps: %s', ex.message) |
| self.send_response(500) |
| self.send_header('Content-Type', 'application/json') |
| self.send_header('Cache-Control', 'no-cache') |
| self.send_header('Content-Length', len(msg)) |
| self.end_headers() |
| self.wfile.write(msg) |
| return |
| |
| self.server.next_deps_check = current_time + DEPS_CHECK_DELAY |
| |
| self.send_response(200) |
| self.send_header('Content-Type', 'application/javascript') |
| self.send_header('Content-Length', len(self.server.deps)) |
| self.end_headers() |
| self.wfile.write(self.server.deps) |
| |
| def do_GET_templates(self): |
| templates = template_generator.generate_templates() |
| |
| self.send_response(200) |
| self.send_header('Content-Type', 'text/html') |
| self.send_header('Content-Length', len(templates)) |
| self.end_headers() |
| self.wfile.write(templates) |
| |
| def do_GET(self): |
| if self.path == '/json/examples': |
| self.do_GET_example_files() |
| return |
| |
| if self.path == '/json/tests': |
| self.do_GET_json_tests() |
| return |
| |
| if self.path == '/templates': |
| self.do_GET_templates() |
| return |
| |
| if self.path == '/deps.js': |
| self.do_GET_deps() |
| return |
| |
| return SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self) |
| |
| def log_error(self, format, *args): |
| if self.path == '/favicon.ico': |
| return |
| self.log_message("While processing %s: ", self.path) |
| SimpleHTTPServer.SimpleHTTPRequestHandler.log_error(self, format, *args) |
| |
| def log_request(self, code='-', size='-'): |
| # Dont spam the console unless it is important. |
| pass |
| |
| |
| class Server(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer): |
| def __init__(self, *args, **kwargs): |
| BaseHTTPServer.HTTPServer.__init__(self, *args, **kwargs) |
| self.next_deps_check = -1 |
| self.deps = None |
| |
| def Main(args): |
| parser = optparse.OptionParser() |
| parser.add_option('--port', |
| action='store', |
| type='int', |
| default=DEFAULT_PORT, |
| help='Port to serve from') |
| options, args = parser.parse_args() |
| server = Server(('', options.port), Handler) |
| sys.stderr.write("Now running on http://localhost:%i\n" % options.port) |
| server.serve_forever() |
| |
| if __name__ == '__main__': |
| os.chdir(toplevel_dir) |
| sys.exit(Main(sys.argv[1:])) |