#!/usr/bin/env python3 # Copyright 2022 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import json import sys if (sys.version_info < (3, )): print("FAILURE. Python 3 or greater required. Please run with \"python3\".") sys.exit(7) from http.server import HTTPServer, SimpleHTTPRequestHandler, test from functools import partial import sys import urllib.request import socketserver import webbrowser import os debugger_port = 0 remote_port = 7777 class CORSRequestHandler(SimpleHTTPRequestHandler): def do_GET(self): if (self.path == "/discover.json"): remote_discovery_url = "http://localhost:{remote_port}/json/version".format( remote_port=remote_port) try: contents = urllib.request.urlopen(remote_discovery_url).read() except Exception: output = { "error": '''\ Cannot connect to remote discovery page on: {remote_discovery_url} Check for target command line parameter: --remote-debugging-port={remote_port} If the target is a remote DUT tunnel forwarding is required from local to remote: ssh root@$DUT_IP -L {remote_port}:localhost:{remote_port} '''.format(remote_port=remote_port, remote_discovery_url=remote_discovery_url) } contents = json.dumps(output) contents = bytes(contents, 'UTF-8') self.send_response(200) self.send_header("Content-type", "application/json") self.send_header("Content-length", len(contents)) self.end_headers() self.wfile.write(contents) else: SimpleHTTPRequestHandler.do_GET(self) if __name__ == '__main__': try: remote_port = int(sys.argv[1]) if len(sys.argv) > 1 else remote_port debugger_port = int(sys.argv[2]) if len(sys.argv) > 2 else debugger_port # Creates a partial object that will behave like a function called with args # and kwargs, while overriding directory with the given path. Handler = partial(CORSRequestHandler, directory=os.path.dirname(os.path.abspath(__file__))) socketserver.TCPServer.allow_reuse_address = True tpc_server = socketserver.TCPServer(("", debugger_port), Handler) # If socket is not specified it was assigned so we must grab it. if (debugger_port == 0): debugger_port = tpc_server.server_address[1] print("Server running on port", debugger_port) webbrowser.open("http://localhost:" + str(debugger_port) + "/app.html", new=1, autoraise=True) tpc_server.serve_forever() except KeyboardInterrupt: tpc_server.server_close() sys.exit()