Index: LayoutTests/imported/web-platform-tests/serve.py |
diff --git a/LayoutTests/imported/web-platform-tests/serve.py b/LayoutTests/imported/web-platform-tests/serve.py |
deleted file mode 100644 |
index 35a7c7262d5d25511fba6976fedbe8c7a2cfd7b2..0000000000000000000000000000000000000000 |
--- a/LayoutTests/imported/web-platform-tests/serve.py |
+++ /dev/null |
@@ -1,337 +0,0 @@ |
- # -*- coding: utf-8 -*- |
-import argparse |
-import json |
-import logging |
-import os |
-import signal |
-import socket |
-import sys |
-import threading |
-import time |
-import urllib2 |
-import uuid |
-from collections import defaultdict |
-from multiprocessing import Process, Event |
- |
-repo_root = os.path.abspath(os.path.split(__file__)[0]) |
- |
-sys.path.insert(1, os.path.join(repo_root, "tools", "wptserve")) |
-from wptserve import server as wptserve, handlers |
-from wptserve.router import any_method |
-sys.path.insert(1, os.path.join(repo_root, "tools", "pywebsocket", "src")) |
-from mod_pywebsocket import standalone as pywebsocket |
- |
-routes = [("GET", "/tools/runner/*", handlers.file_handler), |
- ("POST", "/tools/runner/update_manifest.py", handlers.python_script_handler), |
- (any_method, "/tools/*", handlers.ErrorHandler(404)), |
- (any_method, "/serve.py", handlers.ErrorHandler(404)), |
- (any_method, "*.py", handlers.python_script_handler), |
- ("GET", "*.asis", handlers.as_is_handler), |
- ("GET", "*", handlers.file_handler), |
- ] |
- |
-rewrites = [("GET", "/resources/WebIDLParser.js", "/resources/webidl2/lib/webidl2.js")] |
- |
-subdomains = [u"www", |
- u"www1", |
- u"www2", |
- u"天気の良い日", |
- u"élève"] |
- |
-logger = None |
- |
-def default_logger(level): |
- logger = logging.getLogger("web-platform-tests") |
- logging.basicConfig(level=getattr(logging, level.upper())) |
- return logger |
- |
-def open_socket(port): |
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
- if port != 0: |
- sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) |
- sock.bind(('127.0.0.1', port)) |
- sock.listen(5) |
- return sock |
- |
-def get_port(): |
- free_socket = open_socket(0) |
- port = free_socket.getsockname()[1] |
- logger.debug("Going to use port %s" % port) |
- free_socket.close() |
- return port |
- |
- |
-class ServerProc(object): |
- def __init__(self): |
- self.proc = None |
- self.daemon = None |
- self.stop = Event() |
- |
- def start(self, init_func, config, paths, port, bind_hostname): |
- self.proc = Process(target=self.create_daemon, args=(init_func, config, paths, port, bind_hostname)) |
- self.proc.daemon = True |
- self.proc.start() |
- |
- def create_daemon(self, init_func, config, paths, port, bind_hostname): |
- try: |
- self.daemon = init_func(config, paths, port, bind_hostname) |
- except socket.error: |
- print >> sys.stderr, "Socket error on port %s" % port |
- raise |
- |
- if self.daemon: |
- self.daemon.start(block=False) |
- try: |
- self.stop.wait() |
- except KeyboardInterrupt: |
- pass |
- |
- def wait(self): |
- self.stop.set() |
- self.proc.join() |
- |
- def kill(self): |
- self.stop.set() |
- self.proc.terminate() |
- self.proc.join() |
- |
- def is_alive(self): |
- return self.proc.is_alive() |
- |
-def check_subdomains(config, paths, subdomains, bind_hostname): |
- port = get_port() |
- wrapper = ServerProc() |
- wrapper.start(start_http_server, config, paths, port, bind_hostname) |
- |
- connected = False |
- for i in range(10): |
- try: |
- urllib2.urlopen("http://%s:%d/" % (config["host"], port)) |
- connected = True |
- break |
- except urllib2.URLError: |
- time.sleep(1) |
- |
- if not connected: |
- logger.critical("Failed to connect to test server on http://%s:%s You may need to edit /etc/hosts or similar" % (config["host"], port)) |
- sys.exit(1) |
- |
- for subdomain, (punycode, host) in subdomains.iteritems(): |
- domain = "%s.%s" % (punycode, host) |
- try: |
- urllib2.urlopen("http://%s:%d/" % (domain, port)) |
- except Exception as e: |
- logger.critical("Failed probing domain %s. You may need to edit /etc/hosts or similar." % domain) |
- sys.exit(1) |
- |
- wrapper.wait() |
- |
-def get_subdomains(config): |
- #This assumes that the tld is ascii-only or already in punycode |
- host = config["host"] |
- return {subdomain: (subdomain.encode("idna"), host) |
- for subdomain in subdomains} |
- |
-def start_servers(config, paths, ports, bind_hostname): |
- servers = defaultdict(list) |
- |
- host = config["host"] |
- |
- for scheme, ports in ports.iteritems(): |
- assert len(ports) == {"http":2}.get(scheme, 1) |
- |
- for port in ports: |
- init_func = {"http":start_http_server, |
- "https":start_https_server, |
- "ws":start_ws_server, |
- "wss":start_wss_server}[scheme] |
- |
- server_proc = ServerProc() |
- server_proc.start(init_func, config, paths, port, bind_hostname) |
- servers[scheme].append((port, server_proc)) |
- |
- return servers |
- |
-def start_http_server(config, paths, port, bind_hostname): |
- return wptserve.WebTestHttpd(host=config["host"], |
- port=port, |
- doc_root=paths["doc_root"], |
- routes=routes, |
- rewrites=rewrites, |
- bind_hostname=bind_hostname, |
- config=config, |
- use_ssl=False, |
- certificate=None) |
- |
-def start_https_server(config, paths, port, bind_hostname): |
- return |
- |
-class WebSocketDaemon(object): |
- def __init__(self, host, port, doc_root, handlers_root, log_level, bind_hostname): |
- self.host = host |
- cmd_args = ["-p", port, |
- "-d", doc_root, |
- "-w", handlers_root, |
- "--log-level", log_level] |
- if (bind_hostname): |
- cmd_args = ["-H", host] + cmd_args |
- opts, args = pywebsocket._parse_args_and_config(cmd_args) |
- opts.cgi_directories = [] |
- opts.is_executable_method = None |
- self.server = pywebsocket.WebSocketServer(opts) |
- ports = [item[0].getsockname()[1] for item in self.server._sockets] |
- assert all(item == ports[0] for item in ports) |
- self.port = ports[0] |
- self.started = False |
- self.server_thread = None |
- |
- def start(self, block=False): |
- self.started = True |
- if block: |
- self.server.serve_forever() |
- else: |
- self.server_thread = threading.Thread(target=self.server.serve_forever) |
- self.server_thread.setDaemon(True) # don't hang on exit |
- self.server_thread.start() |
- |
- def stop(self): |
- """ |
- Stops the server. |
- |
- If the server is not running, this method has no effect. |
- """ |
- if self.started: |
- try: |
- self.server.shutdown() |
- self.server.server_close() |
- self.server_thread.join() |
- self.server_thread = None |
- except AttributeError: |
- pass |
- self.started = False |
- self.server = None |
- |
-def start_ws_server(config, paths, port, bind_hostname): |
- return WebSocketDaemon(config["host"], |
- str(port), |
- repo_root, |
- paths["ws_doc_root"], |
- "debug", |
- bind_hostname) |
- |
-def start_wss_server(config, paths, port, bind_hostname): |
- return |
- |
-def get_ports(config): |
- rv = defaultdict(list) |
- for scheme, ports in config["ports"].iteritems(): |
- for i, port in enumerate(ports): |
- if port == "auto": |
- port = get_port() |
- else: |
- port = port |
- rv[scheme].append(port) |
- return rv |
- |
-def normalise_config(config, domains, ports): |
- ports_ = {} |
- for scheme, ports_used in ports.iteritems(): |
- ports_[scheme] = ports_used |
- |
- domains_ = domains.copy() |
- |
- for key, value in domains_.iteritems(): |
- domains_[key] = ".".join(value) |
- |
- domains_[""] = config["host"] |
- |
- return {"host":config["host"], |
- "domains":domains_, |
- "ports": ports_} |
- |
-def start(config): |
- ports = get_ports(config) |
- domains = get_subdomains(config) |
- bind_hostname = config["bind_hostname"] |
- |
- paths = {"doc_root": config["doc_root"], |
- "ws_doc_root": config["ws_doc_root"]} |
- |
- if config["check_subdomains"]: |
- check_subdomains(config, paths, domains, bind_hostname) |
- |
- config_ = normalise_config(config, domains, ports) |
- |
- servers = start_servers(config_, paths, ports, bind_hostname) |
- |
- return config_, servers |
- |
- |
-def iter_procs(servers): |
- for servers in servers.values(): |
- for port, server in servers: |
- yield server.proc |
- |
-def value_set(config, key): |
- return key in config and config[key] is not None |
- |
-def set_computed_defaults(config): |
- if not value_set(config, "ws_doc_root"): |
- if value_set(config, "doc_root"): |
- root = config["doc_root"] |
- else: |
- root = repo_root |
- config["ws_doc_root"] = os.path.join(repo_root, "websockets", "handlers") |
- |
- if not value_set(config, "doc_root"): |
- config["doc_root"] = repo_root |
- |
- |
-def merge_json(base_obj, override_obj): |
- rv = {} |
- for key, value in base_obj.iteritems(): |
- if key not in override_obj: |
- rv[key] = value |
- else: |
- if isinstance(value, dict): |
- rv[key] = merge_json(value, override_obj[key]) |
- else: |
- rv[key] = override_obj[key] |
- return rv |
- |
-def load_config(default_path, override_path=None): |
- if os.path.exists(default_path): |
- with open(default_path) as f: |
- base_obj = json.load(f) |
- else: |
- raise ValueError("Config path %s does not exist" % default_path) |
- |
- if os.path.exists(override_path): |
- with open(override_path) as f: |
- override_obj = json.load(f) |
- else: |
- override_obj = {} |
- rv = merge_json(base_obj, override_obj) |
- |
- set_computed_defaults(rv) |
- return rv |
- |
-def main(): |
- global logger |
- |
- config = load_config("config.default.json", |
- "config.json") |
- |
- logger = default_logger(config["log_level"]) |
- |
- config_, servers = start(config) |
- |
- try: |
- while any(item.is_alive() for item in iter_procs(servers)): |
- for item in iter_procs(servers): |
- item.join(1) |
- except KeyboardInterrupt: |
- logger.info("Shutting down") |
- |
-if __name__ == "__main__": |
- main() |