aboutsummaryrefslogtreecommitdiffstats
path: root/mitmproxy/addons/browser.py
diff options
context:
space:
mode:
Diffstat (limited to 'mitmproxy/addons/browser.py')
-rw-r--r--mitmproxy/addons/browser.py74
1 files changed, 74 insertions, 0 deletions
diff --git a/mitmproxy/addons/browser.py b/mitmproxy/addons/browser.py
new file mode 100644
index 00000000..247c356b
--- /dev/null
+++ b/mitmproxy/addons/browser.py
@@ -0,0 +1,74 @@
+import shutil
+import subprocess
+import tempfile
+import typing
+
+from mitmproxy import command
+from mitmproxy import ctx
+
+
+def get_chrome_executable() -> typing.Optional[str]:
+ for browser in (
+ "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
+ # https://stackoverflow.com/questions/40674914/google-chrome-path-in-windows-10
+ r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe",
+ r"C:\Program Files (x86)\Google\Application\chrome.exe",
+ # Linux binary names from Python's webbrowser module.
+ "google-chrome",
+ "chrome",
+ "chromium",
+ "chromium-browser",
+ ):
+ if shutil.which(browser):
+ return browser
+ return None
+
+
+class Browser:
+ browser = None
+ tdir = None
+
+ @command.command("browser.start")
+ def start(self) -> None:
+ """
+ Start an isolated instance of Chrome that points to the currently
+ running proxy.
+ """
+ if self.browser:
+ if self.browser.poll() is None:
+ ctx.log.alert("Browser already running")
+ return
+ else:
+ self.done()
+
+ cmd = get_chrome_executable()
+ if not cmd:
+ ctx.log.alert("Your platform is not supported yet - please submit a patch.")
+ return
+
+ self.tdir = tempfile.TemporaryDirectory()
+ self.browser = subprocess.Popen(
+ [
+ cmd,
+ "--user-data-dir=%s" % str(self.tdir.name),
+ "--proxy-server=%s:%s" % (
+ ctx.options.listen_host or "127.0.0.1",
+ ctx.options.listen_port
+ ),
+ "--disable-fre",
+ "--no-default-browser-check",
+ "--no-first-run",
+ "--disable-extensions",
+
+ "about:blank",
+ ],
+ stdout = subprocess.DEVNULL,
+ stderr = subprocess.DEVNULL,
+ )
+
+ def done(self):
+ if self.browser:
+ self.browser.kill()
+ self.tdir.cleanup()
+ self.browser = None
+ self.tdir = None