diff --git a/docs/index.rst b/docs/index.rst index 9a948678a..cd32a1f68 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -52,7 +52,6 @@ :caption: Scripting scripting/overview - scripting/context scripting/events scripting/api diff --git a/docs/scripting/api.rst b/docs/scripting/api.rst index a864b4423..abc9ff3e3 100644 --- a/docs/scripting/api.rst +++ b/docs/scripting/api.rst @@ -4,12 +4,22 @@ API === +- Errors + - `mitmproxy.models.flow.Error <#mitmproxy.models.flow.Error>`_ - HTTP - `mitmproxy.models.http.HTTPRequest <#mitmproxy.models.http.HTTPRequest>`_ - `mitmproxy.models.http.HTTPResponse <#mitmproxy.models.http.HTTPResponse>`_ - `mitmproxy.models.http.HTTPFlow <#mitmproxy.models.http.HTTPFlow>`_ -- Errors - - `mitmproxy.models.flow.Error <#mitmproxy.models.flow.Error>`_ +- Logging + - `mitmproxy.controller.Log <#mitmproxy.controller.Log>`_ + - `mitmproxy.controller.LogEntry <#mitmproxy.controller.LogEntry>`_ + + +Errors +------ + +.. autoclass:: mitmproxy.models.flow.Error + :inherited-members: HTTP ---- @@ -23,8 +33,8 @@ HTTP .. autoclass:: mitmproxy.models.http.HTTPFlow :inherited-members: -Errors ------- +Logging +-------- -.. autoclass:: mitmproxy.models.flow.Error +.. autoclass:: mitmproxy.controller.Log :inherited-members: diff --git a/docs/scripting/context.rst b/docs/scripting/context.rst deleted file mode 100644 index 7c3515983..000000000 --- a/docs/scripting/context.rst +++ /dev/null @@ -1,4 +0,0 @@ -.. _context: - -Context -======= diff --git a/docs/scripting/overview.rst b/docs/scripting/overview.rst index f8dd9f2e6..a3b83e443 100644 --- a/docs/scripting/overview.rst +++ b/docs/scripting/overview.rst @@ -74,18 +74,24 @@ Whenever a handler is called, mitpmroxy rewrites the script environment so that it sees its own arguments as if it was invoked from the command-line. -Running scripts in parallel ---------------------------- +Logging and the context +----------------------- -We have a single flow primitive, so when a script is blocking, other requests are not processed. -While that's usually a very desirable behaviour, blocking scripts can be run threaded by using the -:py:obj:`mitmproxy.script.concurrent` decorator. -**If your script does not block, you should avoid the overhead of the decorator.** +Scripts should not output straight to stderr or stdout. Instead, the `log +`_ object on the ``ctx`` contexzt module +should be used, so that the mitmproxy host program can handle output +appropriately. So, mitmdump can print colorised sript output to the terminal, +and mitmproxy console can place script output in the event buffer. -.. literalinclude:: ../../examples/nonblocking.py - :caption: examples/nonblocking.py +Here's how this looks: + +.. literalinclude:: ../../examples/logging.py + :caption: :src:`examples/logging.py` :language: python +The ``ctx`` module also exposes the mitmproxy master object at ``ctx.master`` +for advanced usage. + Running scripts on saved flows ------------------------------ @@ -101,11 +107,20 @@ In this case, there are no client connections, and the events are run in the fol If the flow doesn't have a **response** or **error** associated with it, the matching events will be skipped. -Spaces in the script path -------------------------- -By default, spaces are interpreted as a separator between the inline script and its arguments -(e.g. ``-s 'foo.py 42'``). Consequently, the script path needs to be wrapped in a separate pair of -quotes if it contains spaces: ``-s '\'./foo bar/baz.py\' 42'``. +Concurrency +----------- -.. _GitHub: https://github.com/mitmproxy/mitmproxy +We have a single flow primitive, so when a script is blocking, other requests +are not processed. While that's usually a very desirable behaviour, blocking +scripts can be run threaded by using the :py:obj:`mitmproxy.script.concurrent` +decorator. + +.. literalinclude:: ../../examples/nonblocking.py + :caption: :src:`examples/nonblocking.py` + :language: python + + + +Developing scripts +------------------ diff --git a/examples/logging.py b/examples/logging.py new file mode 100644 index 000000000..dccfd8b2f --- /dev/null +++ b/examples/logging.py @@ -0,0 +1,6 @@ +from mitmproxy import ctx + + +def start(): + ctx.log.info("This is some informative text.") + ctx.log.error("This is an error.") diff --git a/mitmproxy/controller.py b/mitmproxy/controller.py index 7b9d460ac..4fd66bfab 100644 --- a/mitmproxy/controller.py +++ b/mitmproxy/controller.py @@ -49,24 +49,39 @@ class LogEntry(object): class Log(object): + """ + The central logger, exposed to scripts as mitmproxy.ctx.log. + """ def __init__(self, master): self.master = master - def __call__(self, text, level="info"): - self.master.add_log(text, level) - def debug(self, txt): + """ + Log with level debug. + """ self(txt, "debug") def info(self, txt): + """ + Log with level info. + """ self(txt, "info") def warn(self, txt): + """ + Log with level warn. + """ self(txt, "warn") def error(self, txt): + """ + Log with level error. + """ self(txt, "error") + def __call__(self, text, level="info"): + self.master.add_log(text, level) + class Master(object): """