aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@nullcube.com>2011-02-17 10:44:08 +1300
committerAldo Cortesi <aldo@nullcube.com>2011-02-17 10:44:08 +1300
commitf028dc7e1bb030035ecb72fa0e9f175910d83656 (patch)
tree77a3a1c36bf2479b84b43ec81877a42b18be1714
parentf0f1fb4b556b048c5a8f93541bea751981136aba (diff)
downloadmitmproxy-f028dc7e1bb030035ecb72fa0e9f175910d83656.tar.gz
mitmproxy-f028dc7e1bb030035ecb72fa0e9f175910d83656.tar.bz2
mitmproxy-f028dc7e1bb030035ecb72fa0e9f175910d83656.zip
Add filtering to mitmdump.
-rw-r--r--libmproxy/dump.py15
-rwxr-xr-xmitmdump9
-rw-r--r--test/test_dump.py17
3 files changed, 30 insertions, 11 deletions
diff --git a/libmproxy/dump.py b/libmproxy/dump.py
index e30c2422..ece6e190 100644
--- a/libmproxy/dump.py
+++ b/libmproxy/dump.py
@@ -1,5 +1,5 @@
import sys, os
-import flow
+import flow, filt
class DumpError(Exception): pass
@@ -18,11 +18,16 @@ class Options(object):
class DumpMaster(flow.FlowMaster):
- def __init__(self, server, options, outfile=sys.stdout):
+ def __init__(self, server, options, filtstr, outfile=sys.stdout):
flow.FlowMaster.__init__(self, server, flow.State())
self.outfile = outfile
self.o = options
+ if filtstr:
+ self.filt = filt.parse(filtstr)
+ else:
+ self.filt = None
+
if options.wfile:
path = os.path.expanduser(options.wfile)
try:
@@ -46,6 +51,9 @@ class DumpMaster(flow.FlowMaster):
def handle_response(self, msg):
f = flow.FlowMaster.handle_response(self, msg)
if f:
+ msg.ack()
+ if self.filt and not f.match(self.filt):
+ return
if 0 < self.o.verbosity < 3:
print >> self.outfile, ">>",
print >> self.outfile, msg.request.short()
@@ -66,10 +74,7 @@ class DumpMaster(flow.FlowMaster):
for i in msg.assemble().splitlines():
print >> self.outfile, "\t", i
print >> self.outfile, "<<"
-
- msg.ack()
self.state.delete_flow(f)
-
if self.o.wfile:
self.fwriter.add(f)
diff --git a/mitmdump b/mitmdump
index 47fe7c2d..886bc5cc 100755
--- a/mitmdump
+++ b/mitmdump
@@ -23,7 +23,7 @@ from optparse import OptionParser, OptionGroup
if __name__ == '__main__':
parser = OptionParser(
- usage = "%prog [options]",
+ usage = "%prog [options] [filter]",
version="%%prog %s"%VERSION,
)
utils.certificate_option_group(parser)
@@ -60,7 +60,12 @@ if __name__ == '__main__':
verbosity = options.verbose,
wfile = options.wfile
)
- m = dump.DumpMaster(server, dumpopts)
+ if args:
+ filt = " ".join(args)
+ else:
+ filt = None
+
+ m = dump.DumpMaster(server, dumpopts, filt)
if options.verbose > 0:
print >> sys.stderr, "Running on port %s"%options.port
diff --git a/test/test_dump.py b/test/test_dump.py
index 9aee5a31..0d0a6219 100644
--- a/test/test_dump.py
+++ b/test/test_dump.py
@@ -19,13 +19,22 @@ class uDumpMaster(libpry.AutoTree):
assert o.verbosity == 2
libpry.raises(AttributeError, dump.Options, nonexistent = 2)
- def test_basic_verbosities(self):
+ def test_filter(self):
+ cs = StringIO()
+ o = dump.Options(
+ verbosity = 1
+ )
+ m = dump.DumpMaster(None, o, "~u foo", outfile=cs)
+ self._dummy_cycle(m)
+ assert not "GET" in cs.getvalue()
+
+ def test_basic(self):
for i in (1, 2, 3):
cs = StringIO()
o = dump.Options(
verbosity = i
)
- m = dump.DumpMaster(None, o, cs)
+ m = dump.DumpMaster(None, o, "~s", outfile=cs)
self._dummy_cycle(m)
assert "GET" in cs.getvalue()
@@ -37,7 +46,7 @@ class uDumpMaster(libpry.AutoTree):
verbosity = 0
)
cs = StringIO()
- m = dump.DumpMaster(None, o, cs)
+ m = dump.DumpMaster(None, o, None, outfile=cs)
self._dummy_cycle(m)
del m
assert len(list(flow.FlowReader(open(p)).stream())) == 1
@@ -48,7 +57,7 @@ class uDumpMaster(libpry.AutoTree):
verbosity = 0
)
cs = StringIO()
- libpry.raises(dump.DumpError, dump.DumpMaster, None, o, cs)
+ libpry.raises(dump.DumpError, dump.DumpMaster, None, o, None)