aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mitmproxy/ctx.py6
-rw-r--r--mitmproxy/options.py79
-rw-r--r--mitmproxy/optmanager.py3
-rw-r--r--test/helper_tools/typehints_for_options.py34
-rw-r--r--test/mitmproxy/test_optmanager.py4
5 files changed, 123 insertions, 3 deletions
diff --git a/mitmproxy/ctx.py b/mitmproxy/ctx.py
index 954edcb1..2ad1faec 100644
--- a/mitmproxy/ctx.py
+++ b/mitmproxy/ctx.py
@@ -2,6 +2,6 @@ import mitmproxy.master # noqa
import mitmproxy.log # noqa
import mitmproxy.options # noqa
-master = None # type: "mitmproxy.master.Master"
-log = None # type: "mitmproxy.log.Log"
-options = None # type: "mitmproxy.options.Options"
+master = None # type: mitmproxy.master.Master
+log = None # type: mitmproxy.log.Log
+options = None # type: mitmproxy.options.Options
diff --git a/mitmproxy/options.py b/mitmproxy/options.py
index 8a01cf40..10aaee12 100644
--- a/mitmproxy/options.py
+++ b/mitmproxy/options.py
@@ -48,6 +48,85 @@ LISTEN_PORT = 8080
class Options(optmanager.OptManager):
+
+ if False:
+ # This provides type hints for IDEs (e.g. PyCharm) and mypy.
+ # Autogenerated using test/helper_tools/typehints_for_options.py
+ add_upstream_certs_to_client_chain = None # type: bool
+ allow_remote = None # type: bool
+ anticache = None # type: bool
+ anticomp = None # type: bool
+ body_size_limit = None # type: Optional[str]
+ cadir = None # type: str
+ certs = None # type: Sequence[str]
+ ciphers_client = None # type: Optional[str]
+ ciphers_server = None # type: Optional[str]
+ client_certs = None # type: Optional[str]
+ client_replay = None # type: Sequence[str]
+ console_focus_follow = None # type: bool
+ console_layout = None # type: str
+ console_layout_headers = None # type: bool
+ console_mouse = None # type: bool
+ console_order = None # type: str
+ console_order_reversed = None # type: bool
+ console_palette = None # type: str
+ console_palette_transparent = None # type: bool
+ default_contentview = None # type: str
+ flow_detail = None # type: int
+ http2 = None # type: bool
+ http2_priority = None # type: bool
+ ignore_hosts = None # type: Sequence[str]
+ intercept = None # type: Optional[str]
+ intercept_active = None # type: bool
+ keep_host_header = None # type: bool
+ keepserving = None # type: bool
+ listen_host = None # type: str
+ listen_port = None # type: int
+ mode = None # type: str
+ onboarding = None # type: bool
+ onboarding_host = None # type: str
+ onboarding_port = None # type: int
+ proxyauth = None # type: Optional[str]
+ rawtcp = None # type: bool
+ refresh_server_playback = None # type: bool
+ replacements = None # type: Sequence[str]
+ replay_kill_extra = None # type: bool
+ rfile = None # type: Optional[str]
+ save_stream_file = None # type: Optional[str]
+ save_stream_filter = None # type: Optional[str]
+ scripts = None # type: Sequence[str]
+ server = None # type: bool
+ server_replay = None # type: Sequence[str]
+ server_replay_ignore_content = None # type: bool
+ server_replay_ignore_host = None # type: bool
+ server_replay_ignore_params = None # type: Sequence[str]
+ server_replay_ignore_payload_params = None # type: Sequence[str]
+ server_replay_nopop = None # type: bool
+ server_replay_use_headers = None # type: Sequence[str]
+ setheaders = None # type: Sequence[str]
+ showhost = None # type: bool
+ spoof_source_address = None # type: bool
+ ssl_insecure = None # type: bool
+ ssl_verify_upstream_trusted_ca = None # type: Optional[str]
+ ssl_verify_upstream_trusted_cadir = None # type: Optional[str]
+ ssl_version_client = None # type: str
+ ssl_version_server = None # type: str
+ stickyauth = None # type: Optional[str]
+ stickycookie = None # type: Optional[str]
+ stream_large_bodies = None # type: Optional[str]
+ stream_websockets = None # type: bool
+ tcp_hosts = None # type: Sequence[str]
+ upstream_auth = None # type: Optional[str]
+ upstream_bind_address = None # type: str
+ upstream_cert = None # type: bool
+ verbosity = None # type: str
+ view_filter = None # type: Optional[str]
+ web_debug = None # type: bool
+ web_iface = None # type: str
+ web_open_browser = None # type: bool
+ web_port = None # type: int
+ websocket = None # type: bool
+
def __init__(self, **kwargs) -> None:
super().__init__()
self.add_option(
diff --git a/mitmproxy/optmanager.py b/mitmproxy/optmanager.py
index c28ec685..84c8d2ea 100644
--- a/mitmproxy/optmanager.py
+++ b/mitmproxy/optmanager.py
@@ -170,6 +170,9 @@ class OptManager:
def keys(self):
return set(self._options.keys())
+ def items(self):
+ return self._options.items()
+
def __contains__(self, k):
return k in self._options
diff --git a/test/helper_tools/typehints_for_options.py b/test/helper_tools/typehints_for_options.py
new file mode 100644
index 00000000..8c7d006c
--- /dev/null
+++ b/test/helper_tools/typehints_for_options.py
@@ -0,0 +1,34 @@
+import typing
+from unittest import mock
+
+from mitmproxy import proxy, options
+from mitmproxy.tools import dump, console, web
+
+
+def print_typehints(opts):
+ for name, option in sorted(opts.items()):
+ print(
+ # For Python 3.6, we can just use "{}: {}".
+ "{} = None # type: {}".format(
+ name,
+ {
+ int: "int",
+ str: "str",
+ bool: "bool",
+ typing.Optional[str]: "Optional[str]",
+ typing.Sequence[str]: "Sequence[str]"
+ }[option.typespec]
+ )
+ )
+
+
+if __name__ == "__main__":
+ opts = options.Options()
+ server = proxy.server.DummyServer(None)
+
+ # initialize with all three tools here to capture tool-specific options defined in addons.
+ dump.DumpMaster(opts, server)
+ with mock.patch("sys.stdout.isatty", lambda: True):
+ console.master.ConsoleMaster(opts, server)
+ web.master.WebMaster(opts, server)
+ print_typehints(opts)
diff --git a/test/mitmproxy/test_optmanager.py b/test/mitmproxy/test_optmanager.py
index 7b4ffb8b..fe72e6bb 100644
--- a/test/mitmproxy/test_optmanager.py
+++ b/test/mitmproxy/test_optmanager.py
@@ -229,6 +229,10 @@ def test_simple():
assert "one" in TO()
+def test_items():
+ assert TO().items()
+
+
def test_serialize():
o = TD2()
o.three = "set"