remove intercept events, update view manually

This commit is contained in:
Maximilian Hils
2016-12-16 00:13:18 +01:00
parent 6b5673e849
commit 388fa7e716
8 changed files with 33 additions and 34 deletions

View File

@@ -1,4 +1,3 @@
from mitmproxy import ctx
from mitmproxy import flowfilter
from mitmproxy import exceptions
@@ -25,7 +24,7 @@ class Intercept:
not f.request.is_replay,
])
if should_intercept:
f.intercept(ctx.master)
f.intercept()
# Handlers

View File

@@ -157,7 +157,7 @@ class Flow(stateobject.StateObject):
def killable(self):
return self.reply and self.reply.state in {"handled", "taken"}
def kill(self, master):
def kill(self):
"""
Kill this request.
"""
@@ -170,9 +170,8 @@ class Flow(stateobject.StateObject):
self.reply.kill(force=True)
self.reply.commit()
self.live = False
master.addons("kill", self)
def intercept(self, master):
def intercept(self):
"""
Intercept this Flow. Processing will stop until resume is
called.
@@ -181,9 +180,8 @@ class Flow(stateobject.StateObject):
return
self.intercepted = True
self.reply.take()
master.addons("intercept", self)
def resume(self, master):
def resume(self):
"""
Continue with the flow - called after an intercept().
"""
@@ -192,4 +190,3 @@ class Flow(stateobject.StateObject):
self.intercepted = False
self.reply.ack()
self.reply.commit()
master.addons("resume", self)

View File

@@ -165,12 +165,12 @@ class FlowItem(urwid.WidgetWrap):
(maxcol,) = xxx_todo_changeme
key = common.shortcuts(key)
if key == "a":
self.flow.resume(self.master)
signals.flowlist_change.send(self)
self.flow.resume()
self.master.view.update(self.flow)
elif key == "d":
if self.flow.killable:
self.flow.kill(self.master)
self.master.view.remove(self.master.view.focus.flow)
self.flow.kill()
self.master.view.remove(self.flow)
elif key == "D":
cp = self.flow.copy()
self.master.view.add(cp)
@@ -232,7 +232,8 @@ class FlowItem(urwid.WidgetWrap):
)
elif key == "X":
if self.flow.killable:
self.flow.kill(self.master)
self.flow.kill()
self.master.view.update(self.flow)
elif key == "enter":
if self.flow.request:
self.master.view_flow(self.flow)
@@ -351,8 +352,8 @@ class FlowListBox(urwid.ListBox):
if key == "A":
for f in self.master.view:
if f.intercepted:
f.resume(self.master)
signals.flowlist_change.send(self)
f.resume()
self.master.view.update(f)
elif key == "z":
self.master.view.clear()
elif key == "e":

View File

@@ -510,16 +510,16 @@ class FlowView(tabs.Tabs):
# Pass scroll events to the wrapped widget
self._w.keypress(size, key)
elif key == "a":
self.flow.resume(self.master)
signals.flow_change.send(self, flow = self.flow)
self.flow.resume()
self.master.view.update(self.flow)
elif key == "A":
for f in self.view:
if f.intercepted:
f.resume(self.master)
signals.flow_change.send(self, flow=f)
f.resume()
self.master.view.update(self.flow)
elif key == "d":
if self.flow.killable:
self.flow.kill(self.master)
self.flow.kill()
self.view.remove(self.flow)
if not self.view.focus.flow:
self.master.view_flowlist()

View File

@@ -226,31 +226,35 @@ class ClearAll(RequestHandler):
class ResumeFlows(RequestHandler):
def post(self):
for f in self.view:
f.resume(self.master)
f.resume()
self.view.update(f)
class KillFlows(RequestHandler):
def post(self):
for f in self.view:
if f.killable:
f.kill(self.master)
f.kill()
self.view.update(f)
class ResumeFlow(RequestHandler):
def post(self, flow_id):
self.flow.resume(self.master)
self.flow.resume()
self.view.update(self.flow)
class KillFlow(RequestHandler):
def post(self, flow_id):
if self.flow.killable:
self.flow.kill(self.master)
self.flow.kill()
self.view.update(self.flow)
class FlowHandler(RequestHandler):
def delete(self, flow_id):
if self.flow.killable:
self.flow.kill(self.master)
self.flow.kill()
self.view.remove(self.flow)
def put(self, flow_id):

View File

@@ -31,9 +31,9 @@ class WebMaster(master.Master):
self.addons.add(*addons.default_addons())
self.addons.add(
intercept.Intercept(),
self.view,
self.events,
intercept.Intercept(),
termlog.TermLog(),
)
self.app = app.Application(

View File

@@ -1,5 +1,4 @@
from mitmproxy.test import tflow
import mock
import io
from mitmproxy.test import tutils
@@ -97,21 +96,20 @@ class TestHTTPFlow:
assert f.get_state() == f2.get_state()
def test_kill(self):
fm = mock.Mock()
f = tflow.tflow()
f.reply.handle()
f.intercept(fm)
f.intercept()
assert f.killable
f.kill(fm)
f.kill()
assert not f.killable
assert f.reply.value == Kill
def test_resume(self):
f = tflow.tflow()
f.reply.handle()
f.intercept(mock.Mock())
f.intercept()
assert f.reply.state == "taken"
f.resume(mock.Mock())
f.resume()
assert f.reply.state == "committed"
def test_replace_unicode(self):

View File

@@ -83,7 +83,7 @@ class TestApp(tornado.testing.AsyncHTTPTestCase):
def test_resume(self):
for f in self.view:
f.reply.handle()
f.intercept(self.master)
f.intercept()
assert self.fetch(
"/flows/42/resume", method="POST").code == 200
@@ -95,7 +95,7 @@ class TestApp(tornado.testing.AsyncHTTPTestCase):
for f in self.view:
f.backup()
f.reply.handle()
f.intercept(self.master)
f.intercept()
assert self.fetch("/flows/42/kill", method="POST").code == 200
assert sum(f.killable for f in self.view) == 1