Add addons.intercept

- Add an addon to handle intercept based on a filter pattern
- Start sketching out a nicer testing truss for addons in mitmproxy.test.taddon
This commit is contained in:
Aldo Cortesi 2016-10-29 15:44:48 +13:00
parent 71d2636594
commit 2dc3284fbb
4 changed files with 65 additions and 7 deletions

View File

@ -1,4 +1,4 @@
import ctx
from mitmproxy import ctx
from mitmproxy import flowfilter
from mitmproxy import exceptions
@ -11,8 +11,8 @@ class Intercept:
if "intercept" in updated:
if not opts.intercept:
self.filt = None
filt = flowfilter.parse(opts.intercept)
if not filt:
self.filt = flowfilter.parse(opts.intercept)
if not self.filt:
raise exceptions.OptionsError(
"Invalid interception filter: %s" % opts.intercept
)

37
mitmproxy/test/taddons.py Normal file
View File

@ -0,0 +1,37 @@
import mitmproxy.master
import mitmproxy.options
from mitmproxy import proxy
class context:
"""
A helper context for testing addons. Its most important function is to
set up the ctx module so handlers can be called just like they would be
when running from within mitmproxy.
"""
def __init__(self, master = None, options = None):
self.options = options or mitmproxy.options.Options()
self.master = master or mitmproxy.master.Master(
options, proxy.DummyServer(options)
)
self.wrapped = None
def __enter__(self):
self.wrapped = self.master.handlecontext()
self.wrapped.__enter__()
return self
def __exit__(self, exc_type, exc_value, traceback):
self.wrapped.__exit__(exc_type, exc_value, traceback)
self.wrapped = None
return False
def configure(self, addon, **kwargs):
"""
A helper for testing configure methods. Modifies the registered
Options object with the given keyword arguments, then calls the
configure method on the addon with the updated value.
"""
for k, v in kwargs.items():
setattr(self.options, k, v)
addon.configure(self.options, kwargs.keys())

View File

@ -0,0 +1,25 @@
from mitmproxy.addons import intercept
from mitmproxy import options
from mitmproxy import exceptions
from mitmproxy.test import taddons
from mitmproxy.test import tutils
class Options(options.Options):
def __init__(self, *, intercept=None, **kwargs):
self.intercept = intercept
super().__init__(**kwargs)
def test_simple():
r = intercept.Intercept()
with taddons.context(options=Options()) as tctx:
assert not r.filt
tctx.configure(r, intercept="~q")
assert r.filt
tutils.raises(
exceptions.OptionsError,
tctx.configure,
r,
intercept="~~"
)

View File

@ -10,10 +10,6 @@ from mitmproxy import http
from mitmproxy import options
class TestMaster:
pass
class MasterTest:
def cycle(self, master, content):