aboutsummaryrefslogtreecommitdiffstats
path: root/mitmproxy/models/flow.py
diff options
context:
space:
mode:
Diffstat (limited to 'mitmproxy/models/flow.py')
-rw-r--r--mitmproxy/models/flow.py13
1 files changed, 12 insertions, 1 deletions
diff --git a/mitmproxy/models/flow.py b/mitmproxy/models/flow.py
index f4a2b54b..fc673274 100644
--- a/mitmproxy/models/flow.py
+++ b/mitmproxy/models/flow.py
@@ -149,13 +149,22 @@ class Flow(stateobject.StateObject):
self.set_state(self._backup)
self._backup = None
+ @property
+ def killable(self):
+ return self.reply and self.reply.state in {"handled", "taken"}
+
def kill(self, master):
"""
Kill this request.
"""
self.error = Error("Connection killed")
self.intercepted = False
- self.reply.kill()
+ # reply.state should only be "handled" or "taken" here.
+ # if none of this is the case, .take() will raise an exception.
+ if self.reply.state != "taken":
+ self.reply.take()
+ self.reply.kill(force=True)
+ self.reply.commit()
master.error(self)
def intercept(self, master):
@@ -166,6 +175,7 @@ class Flow(stateobject.StateObject):
if self.intercepted:
return
self.intercepted = True
+ self.reply.take()
master.handle_intercept(self)
def accept_intercept(self, master):
@@ -176,6 +186,7 @@ class Flow(stateobject.StateObject):
return
self.intercepted = False
self.reply.ack()
+ self.reply.commit()
master.handle_accept_intercept(self)
def match(self, f):