aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mitmproxy/builtins/termlog.py23
-rw-r--r--mitmproxy/controller.py20
-rw-r--r--mitmproxy/dump.py19
-rw-r--r--mitmproxy/flow/master.py2
-rw-r--r--mitmproxy/proxy/__init__.py4
-rw-r--r--mitmproxy/proxy/root_context.py9
-rw-r--r--mitmproxy/proxy/server.py3
-rw-r--r--test/mitmproxy/builtins/test_termlog.py17
-rw-r--r--test/mitmproxy/data/addonscripts/recorder.py4
-rw-r--r--test/mitmproxy/data/scripts/all.py16
-rw-r--r--test/mitmproxy/mastertest.py5
-rw-r--r--test/mitmproxy/tservers.py5
12 files changed, 81 insertions, 46 deletions
diff --git a/mitmproxy/builtins/termlog.py b/mitmproxy/builtins/termlog.py
new file mode 100644
index 00000000..c8259f0c
--- /dev/null
+++ b/mitmproxy/builtins/termlog.py
@@ -0,0 +1,23 @@
+from __future__ import absolute_import, print_function, division
+
+import click
+
+from mitmproxy import utils
+
+
+class TermLog:
+ def __init__(self):
+ self.options = None
+
+ def configure(self, options, updated):
+ self.options = options
+
+ def log(self, e):
+ if self.options.verbosity >= utils.log_tier(e.level):
+ click.secho(
+ e.msg,
+ file=self.options.tfile,
+ fg=dict(error="red", warn="yellow").get(e.level),
+ dim=(e.level == "debug"),
+ err=(e.level == "error")
+ )
diff --git a/mitmproxy/controller.py b/mitmproxy/controller.py
index 51a9b146..1a8801e1 100644
--- a/mitmproxy/controller.py
+++ b/mitmproxy/controller.py
@@ -28,21 +28,26 @@ Events = frozenset([
"requestheaders",
"response",
"responseheaders",
+ "error",
"websocket_handshake",
"next_layer",
- "error",
- "log",
-
- "start",
"configure",
"done",
+ "log",
+ "start",
"tick",
])
+class LogEntry(object):
+ def __init__(self, msg, level):
+ self.msg = msg
+ self.level = level
+
+
class Log(object):
def __init__(self, master):
self.master = master
@@ -90,11 +95,16 @@ class Master(object):
mitmproxy_ctx.master = None
mitmproxy_ctx.log = None
+ def tell(self, mtype, m):
+ m.reply = DummyReply()
+ self.event_queue.put((mtype, m))
+
def add_log(self, e, level):
"""
level: debug, info, warn, error
"""
- pass
+ with self.handlecontext():
+ self.addons("log", LogEntry(e, level))
def add_server(self, server):
# We give a Channel to the server which can be used to communicate with the master
diff --git a/mitmproxy/dump.py b/mitmproxy/dump.py
index 6bed8fcc..0e942eac 100644
--- a/mitmproxy/dump.py
+++ b/mitmproxy/dump.py
@@ -3,15 +3,12 @@ from __future__ import absolute_import, print_function, division
from typing import Optional # noqa
import typing # noqa
-import click
-
from mitmproxy import controller
from mitmproxy import exceptions
from mitmproxy import flow
from mitmproxy import builtins
-from mitmproxy import utils
from mitmproxy import options
-from mitmproxy.builtins import dumper
+from mitmproxy.builtins import dumper, termlog
from netlib import tcp
@@ -42,6 +39,7 @@ class DumpMaster(flow.FlowMaster):
self.has_errored = False
self.addons.add(*builtins.default_addons())
self.addons.add(dumper.Dumper())
+ self.addons.add(termlog.TermLog())
# This line is just for type hinting
self.options = self.options # type: Options
self.set_stream_large_bodies(options.stream_large_bodies)
@@ -79,17 +77,10 @@ class DumpMaster(flow.FlowMaster):
except exceptions.FlowReadException as e:
raise DumpError(str(e))
- def add_log(self, e, level="info"):
- if level == "error":
+ @controller.handler
+ def log(self, e):
+ if e.level == "error":
self.has_errored = True
- if self.options.verbosity >= utils.log_tier(level):
- click.secho(
- e,
- file=self.options.tfile,
- fg=dict(error="red", warn="yellow").get(level),
- dim=(level == "debug"),
- err=(level == "error")
- )
@controller.handler
def request(self, f):
diff --git a/mitmproxy/flow/master.py b/mitmproxy/flow/master.py
index 7149fec9..a2b225b8 100644
--- a/mitmproxy/flow/master.py
+++ b/mitmproxy/flow/master.py
@@ -190,7 +190,7 @@ class FlowMaster(controller.Master):
@controller.handler
def log(self, l):
- self.add_log(l.msg, l.level)
+ pass
@controller.handler
def clientconnect(self, root_layer):
diff --git a/mitmproxy/proxy/__init__.py b/mitmproxy/proxy/__init__.py
index ada9fa12..e3d249fa 100644
--- a/mitmproxy/proxy/__init__.py
+++ b/mitmproxy/proxy/__init__.py
@@ -1,11 +1,11 @@
from __future__ import absolute_import, print_function, division
from .config import ProxyConfig
-from .root_context import RootContext, Log
+from .root_context import RootContext
from .server import ProxyServer, DummyServer
__all__ = [
"ProxyServer", "DummyServer",
"ProxyConfig",
- "RootContext", "Log",
+ "RootContext"
]
diff --git a/mitmproxy/proxy/root_context.py b/mitmproxy/proxy/root_context.py
index 9827ef74..cfa04bdf 100644
--- a/mitmproxy/proxy/root_context.py
+++ b/mitmproxy/proxy/root_context.py
@@ -5,6 +5,7 @@ import sys
import six
import netlib.exceptions
+from mitmproxy import controller
from mitmproxy import exceptions
from mitmproxy import protocol
from mitmproxy.proxy import modes
@@ -118,7 +119,7 @@ class RootContext(object):
for i in subs:
full_msg.append(" -> " + i)
full_msg = "\n".join(full_msg)
- self.channel.tell("log", Log(full_msg, level))
+ self.channel.tell("log", controller.LogEntry(full_msg, level))
@property
def layers(self):
@@ -126,9 +127,3 @@ class RootContext(object):
def __repr__(self):
return "RootContext"
-
-
-class Log(object):
- def __init__(self, msg, level="info"):
- self.msg = msg
- self.level = level
diff --git a/mitmproxy/proxy/server.py b/mitmproxy/proxy/server.py
index c5fd5f9e..182f4602 100644
--- a/mitmproxy/proxy/server.py
+++ b/mitmproxy/proxy/server.py
@@ -9,6 +9,7 @@ import six
import netlib.exceptions
from mitmproxy import exceptions
from mitmproxy import models
+from mitmproxy import controller
from mitmproxy.proxy import modes
from mitmproxy.proxy import root_context
from netlib import tcp
@@ -155,4 +156,4 @@ class ConnectionHandler(object):
def log(self, msg, level):
msg = "{}: {}".format(repr(self.client_conn.address), msg)
- self.channel.tell("log", root_context.Log(msg, level))
+ self.channel.tell("log", controller.LogEntry(msg, level))
diff --git a/test/mitmproxy/builtins/test_termlog.py b/test/mitmproxy/builtins/test_termlog.py
new file mode 100644
index 00000000..a1510442
--- /dev/null
+++ b/test/mitmproxy/builtins/test_termlog.py
@@ -0,0 +1,17 @@
+from .. import mastertest
+from six.moves import cStringIO as StringIO
+
+from mitmproxy.builtins import termlog
+from mitmproxy import controller
+from mitmproxy import dump
+
+
+class TestTermLog(mastertest.MasterTest):
+ def test_simple(self):
+ t = termlog.TermLog()
+ sio = StringIO()
+ t.configure(dump.Options(tfile = sio, verbosity = 2), set([]))
+ t.log(controller.LogEntry("one", "info"))
+ assert "one" in sio.getvalue()
+ t.log(controller.LogEntry("two", "debug"))
+ assert "two" not in sio.getvalue()
diff --git a/test/mitmproxy/data/addonscripts/recorder.py b/test/mitmproxy/data/addonscripts/recorder.py
index 890e6f4e..3d7a51bf 100644
--- a/test/mitmproxy/data/addonscripts/recorder.py
+++ b/test/mitmproxy/data/addonscripts/recorder.py
@@ -15,8 +15,8 @@ class CallLogger:
lg = (self.name, attr, args, kwargs)
if attr != "log":
ctx.log.info(str(lg))
- self.call_log.append(lg)
- ctx.log.debug("%s %s" % (self.name, attr))
+ self.call_log.append(lg)
+ ctx.log.debug("%s %s" % (self.name, attr))
return prox
raise AttributeError
diff --git a/test/mitmproxy/data/scripts/all.py b/test/mitmproxy/data/scripts/all.py
index bf8e93ec..95edfe97 100644
--- a/test/mitmproxy/data/scripts/all.py
+++ b/test/mitmproxy/data/scripts/all.py
@@ -1,37 +1,37 @@
import mitmproxy
-log = []
+record = []
def clientconnect(cc):
mitmproxy.ctx.log("XCLIENTCONNECT")
- log.append("clientconnect")
+ record.append("clientconnect")
def serverconnect(cc):
mitmproxy.ctx.log("XSERVERCONNECT")
- log.append("serverconnect")
+ record.append("serverconnect")
def request(f):
mitmproxy.ctx.log("XREQUEST")
- log.append("request")
+ record.append("request")
def response(f):
mitmproxy.ctx.log("XRESPONSE")
- log.append("response")
+ record.append("response")
def responseheaders(f):
mitmproxy.ctx.log("XRESPONSEHEADERS")
- log.append("responseheaders")
+ record.append("responseheaders")
def clientdisconnect(cc):
mitmproxy.ctx.log("XCLIENTDISCONNECT")
- log.append("clientdisconnect")
+ record.append("clientdisconnect")
def error(cc):
mitmproxy.ctx.log("XERROR")
- log.append("error")
+ record.append("error")
diff --git a/test/mitmproxy/mastertest.py b/test/mitmproxy/mastertest.py
index a14fe02a..5605b1a6 100644
--- a/test/mitmproxy/mastertest.py
+++ b/test/mitmproxy/mastertest.py
@@ -4,7 +4,7 @@ from . import tutils
import netlib.tutils
from mitmproxy.flow import master
-from mitmproxy import flow, proxy, models, controller, options
+from mitmproxy import flow, proxy, models, options
class TestMaster:
@@ -15,9 +15,6 @@ class MasterTest:
def cycle(self, master, content):
f = tutils.tflow(req=netlib.tutils.treq(content=content))
- l = proxy.Log("connect")
- l.reply = controller.DummyReply()
- master.log(l)
master.clientconnect(f.client_conn)
master.serverconnect(f.server_conn)
master.request(f)
diff --git a/test/mitmproxy/tservers.py b/test/mitmproxy/tservers.py
index 119c2cae..d3806a99 100644
--- a/test/mitmproxy/tservers.py
+++ b/test/mitmproxy/tservers.py
@@ -44,8 +44,9 @@ class TestMaster(flow.FlowMaster):
def clear_log(self):
self.tlog = []
- def add_log(self, message, level=None):
- self.tlog.append(message)
+ @controller.handler
+ def log(self, e):
+ self.tlog.append(e.msg)
class ProxyThread(threading.Thread):