Be more tolerant of corrupted or truncated flows.

We load as far as possible. mitmproxy will only terminate if it was not able to
recover any flows. mitmdump will stop loading as soon as an error is
encountered, but not exit with an error.
This commit is contained in:
Aldo Cortesi 2012-07-24 15:15:41 +12:00
parent a5bf9d3eb3
commit b4e9e55c34
3 changed files with 8 additions and 5 deletions

View File

@ -548,7 +548,9 @@ class ConsoleMaster(flow.FlowMaster):
if self.options.rfile: if self.options.rfile:
ret = self.load_flows(self.options.rfile) ret = self.load_flows(self.options.rfile)
if ret: if ret and self.state.flow_count():
self.add_event("File truncated or corrupted. Loaded as many flows as possible.")
else:
self.shutdown() self.shutdown()
print >> sys.stderr, "Could not load file:", ret print >> sys.stderr, "Could not load file:", ret
sys.exit(1) sys.exit(1)
@ -653,14 +655,16 @@ class ConsoleMaster(flow.FlowMaster):
fr = flow.FlowReader(f) fr = flow.FlowReader(f)
except IOError, v: except IOError, v:
return v.strerror return v.strerror
reterr = None
try: try:
flow.FlowMaster.load_flows(self, fr) flow.FlowMaster.load_flows(self, fr)
except flow.FlowReadError, v: except flow.FlowReadError, v:
return v.strerror reterr = v.strerror
f.close() f.close()
if self.flow_list_walker: if self.flow_list_walker:
self.sync_list_view() self.sync_list_view()
self.focus_current() self.focus_current()
return reterr
def path_prompt(self, prompt, text, callback, *args): def path_prompt(self, prompt, text, callback, *args):
self.statusbar.path_prompt(prompt, text) self.statusbar.path_prompt(prompt, text)

View File

@ -128,8 +128,7 @@ class DumpMaster(flow.FlowMaster):
try: try:
self.load_flows(freader) self.load_flows(freader)
except flow.FlowReadError, v: except flow.FlowReadError, v:
raise DumpError(v) self.add_event("Flow file corrupted. Stopped loading.")
def _readflow(self, path): def _readflow(self, path):
path = os.path.expanduser(path) path = os.path.expanduser(path)

View File

@ -1482,7 +1482,7 @@ class FlowReader:
raise FlowReadError("Incompatible serialized data version: %s"%v) raise FlowReadError("Incompatible serialized data version: %s"%v)
off = self.fo.tell() off = self.fo.tell()
yield Flow._from_state(data) yield Flow._from_state(data)
except ValueError: except ValueError, v:
# Error is due to EOF # Error is due to EOF
if self.fo.tell() == off and self.fo.read() == '': if self.fo.tell() == off and self.fo.read() == '':
return return