aboutsummaryrefslogtreecommitdiffstats
path: root/mitmproxy
diff options
context:
space:
mode:
authorMaximilian Hils <git@maximilianhils.com>2017-06-24 19:54:04 +0200
committerGitHub <noreply@github.com>2017-06-24 19:54:04 +0200
commitbde64746a91666a3ae8b693fed05bc29824b814c (patch)
treeff9899f1f61795e1299c76d36937d46b56745677 /mitmproxy
parenta0abc7b748425e450a51873749d8275265991622 (diff)
parent18633262201b33fb0c36381fbc65febf21313eb7 (diff)
downloadmitmproxy-bde64746a91666a3ae8b693fed05bc29824b814c.tar.gz
mitmproxy-bde64746a91666a3ae8b693fed05bc29824b814c.tar.bz2
mitmproxy-bde64746a91666a3ae8b693fed05bc29824b814c.zip
Merge pull request #2395 from MatthewShao/mitmweb-options
[WIP] Add RESTful API for mitmweb option
Diffstat (limited to 'mitmproxy')
-rw-r--r--mitmproxy/optmanager.py33
-rw-r--r--mitmproxy/tools/web/app.py14
-rw-r--r--mitmproxy/utils/typecheck.py12
3 files changed, 50 insertions, 9 deletions
diff --git a/mitmproxy/optmanager.py b/mitmproxy/optmanager.py
index 1680d346..68c2f975 100644
--- a/mitmproxy/optmanager.py
+++ b/mitmproxy/optmanager.py
@@ -401,21 +401,36 @@ def dump_defaults(opts):
if o.choices:
txt += " Valid values are %s." % ", ".join(repr(c) for c in o.choices)
else:
- if o.typespec in (str, int, bool):
- t = o.typespec.__name__
- elif o.typespec == typing.Optional[str]:
- t = "optional str"
- elif o.typespec == typing.Sequence[str]:
- t = "sequence of str"
- else: # pragma: no cover
- raise NotImplementedError
+ t = typecheck.typespec_to_str(o.typespec)
txt += " Type %s." % t
txt = "\n".join(textwrap.wrap(txt))
- s.yaml_set_comment_before_after_key(k, before = "\n" + txt)
+ s.yaml_set_comment_before_after_key(k, before="\n" + txt)
return ruamel.yaml.round_trip_dump(s)
+def dump_dicts(opts):
+ """
+ Dumps the options into a list of dict object.
+
+ Return: A list like: [ { name: "anticache", type: "bool", default: false, value: true, help: "help text"} ]
+ """
+ options_list = []
+ for k in sorted(opts.keys()):
+ o = opts._options[k]
+ t = typecheck.typespec_to_str(o.typespec)
+ option = {
+ 'name': k,
+ 'type': t,
+ 'default': o.default,
+ 'value': o.current(),
+ 'help': o.help,
+ 'choices': o.choices
+ }
+ options_list.append(option)
+ return options_list
+
+
def parse(text):
if not text:
return {}
diff --git a/mitmproxy/tools/web/app.py b/mitmproxy/tools/web/app.py
index c55c0cb5..8b4a39b6 100644
--- a/mitmproxy/tools/web/app.py
+++ b/mitmproxy/tools/web/app.py
@@ -17,6 +17,7 @@ from mitmproxy import http
from mitmproxy import io
from mitmproxy import log
from mitmproxy import version
+from mitmproxy import optmanager
import mitmproxy.tools.web.master # noqa
@@ -438,6 +439,18 @@ class Settings(RequestHandler):
self.master.options.update(**update)
+class Options(RequestHandler):
+ def get(self):
+ self.write(optmanager.dump_dicts(self.master.options))
+
+ def put(self):
+ update = self.json
+ try:
+ self.master.options.update(**update)
+ except (KeyError, TypeError) as err:
+ raise APIError(400, "{}".format(err))
+
+
class Application(tornado.web.Application):
def __init__(self, master, debug):
self.master = master
@@ -462,6 +475,7 @@ class Application(tornado.web.Application):
FlowContentView),
(r"/settings", Settings),
(r"/clear", ClearAll),
+ (r"/options", Options)
]
settings = dict(
template_path=os.path.join(os.path.dirname(__file__), "templates"),
diff --git a/mitmproxy/utils/typecheck.py b/mitmproxy/utils/typecheck.py
index a5f27fee..87a0e804 100644
--- a/mitmproxy/utils/typecheck.py
+++ b/mitmproxy/utils/typecheck.py
@@ -98,3 +98,15 @@ def check_option_type(name: str, value: typing.Any, typeinfo: typing.Any) -> Non
return
elif not isinstance(value, typeinfo):
raise e
+
+
+def typespec_to_str(typespec: typing.Any) -> str:
+ if typespec in (str, int, bool):
+ t = typespec.__name__
+ elif typespec == typing.Optional[str]:
+ t = 'optional str'
+ elif typespec == typing.Sequence[str]:
+ t = 'sequence of str'
+ else:
+ raise NotImplementedError
+ return t