选项
选项
mitmproxy
的核心是全局选项存储,其中包含确定mitmproxy
及其附加组件行为的设置。可以从配置文件中读取选项,在命令行上进行设置,并由用户即时进行交互更改。
所有选项都用一组受支持的类型中的一个进行注释。Mitmproxy
知道如何序列化和反序列化这些类型,并具有呈现类型化值以在交互式程序中进行编辑的标准方法。尝试使用错误的类型设置值将导致错误。这意味着,只需声明类型,插件选项即可在整个mitmproxy
的工具链中获得全面支持。
简单的例子
"""
Add a new mitmproxy option.
Usage:
mitmproxy -s options-simple.py --set addheader true
"""
from mitmproxy import ctx
class AddHeader:
def __init__(self):
self.num = 0
def load(self, loader):
loader.add_option(
name = "addheader",
typespec = bool,
default = False,
help = "Add a count header to responses",
)
def response(self, flow):
if ctx.options.addheader:
self.num = self.num + 1
flow.response.headers["count"] = str(self.num)
addons = [
AddHeader()
]
该load事件接收的实例mitmproxy.addonmanager.Loader,该实例允许插件声明选项和命令。在这种情况下,插件会添加一个addheader带有type的选项bool。让我们通过在mitmproxy控制台中运行脚本来进行尝试:
> mitmproxy -s ./examples/addons/options-simple.py
现在,您可以使用CURL
通过代理发出请求,如下所示:
> env http_proxy=http://localhost:8080 curl -I http://google.com
如果立即运行此请求,您会注意到没有添加计数头。这是因为该选项的默认值为false。按O 进入选项编辑器,然后找到addheader选项。您会注意到mitmproxy知道这是一个布尔值,并允许您在true和false之间切换值。将值设置为true,您应该看到类似以下的结果:
> env http_proxy=http://localhost:8080 curl -I http://google.com
HTTP/1.1 301 Moved Permanently
Location: http://www.google.com/
Content-Length: 219
count: 1
加载此插件后,该addheader设置在持久YAML配置文件中可用。您还可以使用--set标志直接从命令行为任何工具覆盖该值:
mitmproxy -s ./examples/addons/options-simple.py --set addheader=true
处理配置更新
有时,仅测试事件中期权的价值是不够的。相反,我们希望在用户更改选项时立即采取行动。这就是configure事件的用途-触发事件时,它将收到一组更改的选项。插件可以检查选项是否在此集合中,然后从上下文中的options对象读取值。
此功能的一个常见用途是检查选项是否有效,如果无效,则向用户提供反馈。如果exceptions.OptionsError在配置过程中引发异常,则更新中的所有更改将自动回滚,并向用户显示错误。让我们来看一个例子。
"""React to configuration changes."""
import typing
from mitmproxy import ctx
from mitmproxy import exceptions
class AddHeader:
def load(self, loader):
loader.add_option(
name = "addheader",
typespec = typing.Optional[int],
default = None,
help = "Add a header to responses",
)
def configure(self, updates):
if "addheader" in updates:
if ctx.options.addheader is not None and ctx.options.addheader > 100:
raise exceptions.OptionsError("addheader must be <= 100")
def response(self, flow):
if ctx.options.addheader is not None:
flow.response.headers["addheader"] = str(ctx.options.addheader)
addons = [
AddHeader()
]
这里有几件事要注意。首先,我们添加的选项使用 typing.Optional。这会向mitmproxy发出信号,该信号None是此选项的有效值-也就是说,可以将其取消设置。其次,configure首先使用我们的默认值(None)调用该方法,然后如果更改了选项,则使用更新后的值调用该方法。如果我们尝试使用错误的值加载脚本,现在会看到错误:
> mitmdump -s ./examples/addons/options-configure.py --set addheader=1000
Loading script: ./examples/addons/options-configure.py
/Users/cortesi/mitmproxy/mitmproxy/venv/bin/mitmdump: addheader must be <= 100
支持的类型
选项支持以下类型。
- 基本类型-
str, int, float, bool
。 - 可选值,使用注释
typing.Optional
。 - 值的序列,使用注释
typing.Sequence
。