选项

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