
Starts a local proxy that rewrites prod server responses, adding new plugins, serving local files, enabling or disabling assets bundles. Prerequisite: Docker Target platform: OS X Change-Id: I9abd94c816f987bf43e4335aff5be7ad17dd0fde
47 lines
1.5 KiB
Python
47 lines
1.5 KiB
Python
# bazel build polygerrit-ui/app:gr-app
|
|
# mitmdump -s "serve-app-locally.py ~/gerrit/bazel-bin/polygerrit-ui/app"
|
|
from mitmproxy import http
|
|
import argparse
|
|
import os
|
|
import zipfile
|
|
|
|
class Server:
|
|
def __init__(self, bundle):
|
|
self.bundle = bundle
|
|
self.bundlemtime = 0
|
|
self.files = {
|
|
'polygerrit_ui/elements/gr-app.js': '',
|
|
'polygerrit_ui/elements/gr-app.html': '',
|
|
'polygerrit_ui/styles/main.css': '',
|
|
}
|
|
self.read_files()
|
|
|
|
def read_files(self):
|
|
if not os.path.isfile(self.bundle):
|
|
print("bundle not found!")
|
|
return
|
|
mtime = os.stat(self.bundle).st_mtime
|
|
if mtime <= self.bundlemtime:
|
|
return
|
|
self.bundlemtime = mtime
|
|
with zipfile.ZipFile(self.bundle) as z:
|
|
for fname in self.files:
|
|
print('Reading new content for ' + fname)
|
|
with z.open(fname, 'r') as content_file:
|
|
self.files[fname] = content_file.read()
|
|
|
|
def response(self, flow: http.HTTPFlow) -> None:
|
|
self.read_files()
|
|
for name in self.files:
|
|
if name.rsplit('/', 1)[1] in flow.request.pretty_url:
|
|
flow.response.content = self.files[name]
|
|
|
|
def expandpath(path):
|
|
return os.path.expanduser(path)
|
|
|
|
def start():
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("bundle", type=str)
|
|
args = parser.parse_args()
|
|
return Server(expandpath(args.bundle))
|