mirror of
https://github.com/Grasscutters/mitmproxy.git
synced 2024-11-26 18:18:25 +00:00
Add --kill option to mitmdump
If this option is passed all requests that are not part of a replayed conversation are killed. If the option is not passed, such requests are passed through to the server as usual.
This commit is contained in:
parent
c3e3897071
commit
fe99871df8
@ -6,11 +6,12 @@ class DumpError(Exception): pass
|
||||
|
||||
class Options(object):
|
||||
__slots__ = [
|
||||
"verbosity",
|
||||
"wfile",
|
||||
"kill",
|
||||
"request_script",
|
||||
"response_script",
|
||||
"replay",
|
||||
"verbosity",
|
||||
"wfile",
|
||||
]
|
||||
def __init__(self, **kwargs):
|
||||
for k, v in kwargs.items():
|
||||
@ -66,7 +67,15 @@ class DumpMaster(flow.FlowMaster):
|
||||
f = flow.FlowMaster.handle_request(self, r)
|
||||
if self.o.request_script:
|
||||
self._runscript(f, self.o.request_script)
|
||||
if not self.playback(f):
|
||||
|
||||
if self.o.replay:
|
||||
pb = self.playback(f)
|
||||
if not pb:
|
||||
if self.o.kill:
|
||||
self.state.kill_flow(f)
|
||||
else:
|
||||
r.ack()
|
||||
else:
|
||||
r.ack()
|
||||
|
||||
def indent(self, n, t):
|
||||
|
@ -44,9 +44,10 @@ class ServerPlaybackState:
|
||||
chronological order.
|
||||
"""
|
||||
for i in flows:
|
||||
h = self._hash(i)
|
||||
l = self.fmap.setdefault(self._hash(i), [])
|
||||
l.append(i)
|
||||
if i.response:
|
||||
h = self._hash(i)
|
||||
l = self.fmap.setdefault(self._hash(i), [])
|
||||
l.append(i)
|
||||
|
||||
def _hash(self, flow):
|
||||
"""
|
||||
|
4
mitmdump
4
mitmdump
@ -50,6 +50,9 @@ if __name__ == '__main__':
|
||||
parser.add_option("-r", "--replay",
|
||||
action="store", dest="replay", default=None,
|
||||
help="Replay server responses from a saved file.")
|
||||
parser.add_option("-k", "--kill",
|
||||
action="store_true", dest="kill", default=False,
|
||||
help="Kill extra requests during replay.")
|
||||
|
||||
options, args = parser.parse_args()
|
||||
|
||||
@ -65,6 +68,7 @@ if __name__ == '__main__':
|
||||
request_script = options.request_script,
|
||||
response_script = options.response_script,
|
||||
replay = options.replay,
|
||||
kill = options.kill
|
||||
)
|
||||
if args:
|
||||
filt = " ".join(args)
|
||||
|
@ -26,19 +26,27 @@ class uDumpMaster(libpry.AutoTree):
|
||||
def test_replay(self):
|
||||
cs = StringIO()
|
||||
|
||||
o = dump.Options(replay="nonexistent")
|
||||
o = dump.Options(replay="nonexistent", kill=True)
|
||||
libpry.raises(dump.DumpError, dump.DumpMaster, None, o, None, outfile=cs)
|
||||
|
||||
t = self.tmpdir()
|
||||
p = os.path.join(t, "rep")
|
||||
f = open(p, "w")
|
||||
fw = flow.FlowWriter(f)
|
||||
t = utils.tflow()
|
||||
t = utils.tflow_full()
|
||||
t.response = utils.tresp(t.request)
|
||||
fw.add(t)
|
||||
f.close()
|
||||
|
||||
o = dump.Options(replay=p)
|
||||
o = dump.Options(replay=p, kill=True)
|
||||
m = dump.DumpMaster(None, o, None, outfile=cs)
|
||||
|
||||
self._cycle(m, "content")
|
||||
self._cycle(m, "content")
|
||||
|
||||
o = dump.Options(replay=p, kill=False)
|
||||
m = dump.DumpMaster(None, o, None, outfile=cs)
|
||||
self._cycle(m, "nonexistent")
|
||||
|
||||
def test_options(self):
|
||||
o = dump.Options(verbosity = 2)
|
||||
|
@ -19,10 +19,10 @@ class uServerPlaybackState(libpry.AutoTree):
|
||||
|
||||
def test_load(self):
|
||||
s = flow.ServerPlaybackState()
|
||||
r = utils.tflow()
|
||||
r = utils.tflow_full()
|
||||
r.request.headers["key"] = ["one"]
|
||||
|
||||
r2 = utils.tflow()
|
||||
r2 = utils.tflow_full()
|
||||
r2.request.headers["key"] = ["two"]
|
||||
|
||||
s.load([r, r2])
|
||||
|
@ -22,3 +22,10 @@ def tflow():
|
||||
return flow.Flow(r)
|
||||
|
||||
|
||||
def tflow_full():
|
||||
r = treq()
|
||||
f = flow.Flow(r)
|
||||
f.response = tresp(r)
|
||||
return f
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user