diff --git a/libmproxy/console.py b/libmproxy/console.py
index 1f19671ae..9bf032e68 100644
--- a/libmproxy/console.py
+++ b/libmproxy/console.py
@@ -19,6 +19,7 @@ import cStringIO
import urwid.curses_display
import urwid
import controller, utils, filt, proxy, flow
+import recorder
class Stop(Exception): pass
@@ -707,6 +708,7 @@ class ConsoleState(flow.State):
flow.State.__init__(self)
self.focus = None
self.beep = None
+ self.store = None
self.view_body_mode = VIEW_BODY_RAW
self.view_flow_mode = VIEW_FLOW_REQUEST
@@ -727,6 +729,8 @@ class ConsoleState(flow.State):
return flow.State.add_request(self, req)
def add_response(self, resp):
+ if self.store is not None:
+ self.store.save_response(resp)
f = flow.State.add_response(self, resp)
if self.focus is None:
self.set_focus(0)
@@ -737,6 +741,9 @@ class ConsoleState(flow.State):
self.set_focus(self.focus)
return ret
+ def start_recording(self, recorder):
+ self.store = recorder
+
def get_focus(self):
if not self.view or self.focus is None:
return None, None
@@ -815,6 +822,9 @@ class ConsoleMaster(controller.Master):
self.stickycookie = None
self.stickyhosts = {}
+ if options.cache is not None:
+ self.state.start_recording(recorder.Recorder(options))
+
def spawn_external_viewer(self, data, contenttype):
if contenttype:
ext = mimetypes.guess_extension(contenttype) or ""
diff --git a/libmproxy/recorder.py b/libmproxy/recorder.py
index 51c8a6e02..bbbe36646 100644
--- a/libmproxy/recorder.py
+++ b/libmproxy/recorder.py
@@ -101,7 +101,10 @@ class Recorder:
for cookie in options.cookies:
self.cookies[cookie] = True
except AttributeError: pass
- self.verbosity = options.verbose
+ try:
+ self.verbosity = options.verbose
+ except AttributeError:
+ self.verbosity = False
self.storedir = options.cache
self.patterns = []
self.indexfp = None
@@ -253,6 +256,7 @@ class Recorder:
print >> self.indexfp, 'cookies:', ','.join(self.cookies)
print >> self.indexfp , path
print >> self.indexfp , ""
+ self.indexfp.flush()
def get_response(self, request):
diff --git a/libmproxy/utils.py b/libmproxy/utils.py
index 42e4d28c6..87fca5ce6 100644
--- a/libmproxy/utils.py
+++ b/libmproxy/utils.py
@@ -12,7 +12,7 @@
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-import re, os, subprocess, datetime, textwrap
+import re, os, subprocess, datetime, textwrap, errno
def format_timestamp(s):
@@ -341,3 +341,12 @@ def make_bogus_cert(path):
stdin=subprocess.PIPE
)
+def mkdir_p(path):
+ try:
+ os.makedirs(path)
+ except OSError as exc:
+ if exc.errno == errno.EEXIST:
+ pass
+ else:
+ raise
+
diff --git a/mitmproxy b/mitmproxy
index 7b55b8489..074a439c6 100755
--- a/mitmproxy
+++ b/mitmproxy
@@ -72,6 +72,23 @@ if __name__ == '__main__':
)
parser.add_option_group(group)
+ group = OptionGroup(
+ parser,
+ "Recorder",
+ "Options controlling recorder behavior"
+ )
+ group.add_option(
+ "-w", "--store", action="store",
+ type = "str", dest="cache", default=None,
+ help = "Session store location"
+ )
+ group.add_option(
+ "-C", "--cookies", action="append",
+ type = "str", dest="cookies", default=[],
+ help = "Persistent client cookies already set or generated in client"
+ )
+ parser.add_option_group(group)
+
options, args = parser.parse_args()
certpath = os.path.expanduser(options.cert)
@@ -82,6 +99,11 @@ if __name__ == '__main__':
proxy.config = proxy.Config(
certpath
)
+ if options.cache is not None:
+ utils.mkdir_p(options.cache)
+ if os.path.exists(options.cache + "/index.txt"):
+ print >> sys.stderr, "ERROR: data already recorded in %s"%options.cache
+ sys.exit(1)
server = proxy.ProxyServer(options.port, options.addr)
m = console.ConsoleMaster(server, options)
diff --git a/mitmrecord b/mitmrecord
index 0fcb91c2c..1fcfde4a3 100755
--- a/mitmrecord
+++ b/mitmrecord
@@ -18,20 +18,11 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-import sys, os.path, os, errno
+import sys, os.path
from libmproxy import proxy, controller, record, utils
from libmproxy import VERSION
from optparse import OptionParser, OptionGroup
-def mkdir_p(path):
- try:
- os.makedirs(path)
- except OSError as exc:
- if exc.errno == errno.EEXIST:
- pass
- else:
- raise
-
if __name__ == '__main__':
parser = OptionParser(
usage = "%prog [options] output",
@@ -85,7 +76,7 @@ if __name__ == '__main__':
certpath
)
server = proxy.ProxyServer(options.port)
- mkdir_p(options.cache)
+ utils.mkdir_p(options.cache)
if os.path.exists(options.cache + "/index.txt"):
print >> sys.stderr, "ERROR: data already recorded in %s"%options.cache
sys.exit(1)