aboutsummaryrefslogtreecommitdiffstats
path: root/libmproxy
diff options
context:
space:
mode:
authorChris Czub <chris.czub@gmail.com>2015-11-09 15:07:58 -0500
committerChris Czub <chris.czub@gmail.com>2015-11-13 15:09:05 -0500
commitd3feaa3bc6e2d9c2c7ee8286038c69c0b9601869 (patch)
tree065950ff60f9cf92c3e205f852fa3faed0ba6444 /libmproxy
parentd7239d665e6781d7b84ecfde3fd5d7d1831de284 (diff)
downloadmitmproxy-d3feaa3bc6e2d9c2c7ee8286038c69c0b9601869.tar.gz
mitmproxy-d3feaa3bc6e2d9c2c7ee8286038c69c0b9601869.tar.bz2
mitmproxy-d3feaa3bc6e2d9c2c7ee8286038c69c0b9601869.zip
Add custom content view plugin support for mitmproxy/mitmdump
Diffstat (limited to 'libmproxy')
-rw-r--r--libmproxy/flow.py46
-rw-r--r--libmproxy/script.py7
2 files changed, 52 insertions, 1 deletions
diff --git a/libmproxy/flow.py b/libmproxy/flow.py
index 55a4dbcf..5acbebf2 100644
--- a/libmproxy/flow.py
+++ b/libmproxy/flow.py
@@ -9,7 +9,7 @@ import cookielib
import os
import re
import urlparse
-
+import inspect
from netlib import wsgi
from netlib.exceptions import HttpException
@@ -21,6 +21,11 @@ from .proxy.config import HostMatcher
from .protocol.http_replay import RequestReplayThread
from .protocol import Kill
from .models import ClientConnection, ServerConnection, HTTPResponse, HTTPFlow, HTTPRequest
+from . import contentviews as cv
+
+
+class PluginError(Exception):
+ pass
class AppRegistry:
@@ -614,6 +619,43 @@ class State(object):
self.flows.kill_all(master)
+class Plugins(object):
+ def __init__(self):
+ self._view_plugins = {}
+
+ def __iter__(self):
+ for plugin_type in ('view_plugins',):
+ yield (plugin_type, getattr(self, '_' + plugin_type))
+
+ def __getitem__(self, key):
+ if key in ('view_plugins',):
+ return getattr(self, '_' + key)
+ else:
+ return None
+
+ def register_view(self, id, **kwargs):
+ if self._view_plugins.get(id):
+ raise PluginError("Duplicate view registration for %s" % (id, ))
+
+ if not kwargs.get('class_ref') or not \
+ callable(kwargs['class_ref']) or not \
+ isinstance(kwargs['class_ref'], type):
+ raise PluginError("No custom content view class passed for view %s" % (id, ))
+
+ script_path = inspect.stack()[1][1]
+
+ view_plugin = {
+ 'title': kwargs.get('title') or id,
+ 'class_ref': kwargs['class_ref'],
+ 'script_path': script_path,
+ }
+ self._view_plugins[id] = view_plugin
+
+ cv.add(kwargs['class_ref']())
+
+ print("Registered view plugin %s from script %s" % (kwargs['title'], script_path))
+
+
class FlowMaster(controller.Master):
def __init__(self, server, state):
controller.Master.__init__(self, server)
@@ -643,6 +685,8 @@ class FlowMaster(controller.Master):
self.stream = None
self.apps = AppRegistry()
+ self.plugins = Plugins()
+
def start_app(self, host, port):
self.apps.add(
app.mapp,
diff --git a/libmproxy/script.py b/libmproxy/script.py
index 9d051c12..f11c5cd8 100644
--- a/libmproxy/script.py
+++ b/libmproxy/script.py
@@ -56,6 +56,13 @@ class ScriptContext:
def app_registry(self):
return self._master.apps
+ @property
+ def plugins(self):
+ if hasattr(self._master, 'plugins'):
+ return self._master.plugins
+
+ return None
+
class Script:
"""