move script context to mitmproxy.ctx

This commit is contained in:
Maximilian Hils 2016-07-08 19:57:57 -07:00
parent 7c67faa8da
commit 5d2b7c52f9
11 changed files with 40 additions and 41 deletions

View File

@ -219,17 +219,17 @@ def done():
compressed_json_dump = context.HARLog.compress()
if context.dump_file == '-':
mitmproxy.log(pprint.pformat(json.loads(json_dump)))
mitmproxy.ctx.log(pprint.pformat(json.loads(json_dump)))
elif context.dump_file.endswith('.zhar'):
file(context.dump_file, "w").write(compressed_json_dump)
else:
file(context.dump_file, "w").write(json_dump)
mitmproxy.log(
mitmproxy.ctx.log(
"HAR log finished with %s bytes (%s bytes compressed)" % (
len(json_dump), len(compressed_json_dump)
)
)
mitmproxy.log(
mitmproxy.ctx.log(
"Compression rate is %s%%" % str(
100. * len(compressed_json_dump) / len(json_dump)
)

View File

@ -5,6 +5,6 @@ from mitmproxy.script import concurrent
@concurrent # Remove this and see what happens
def request(flow):
mitmproxy.log("handle request: %s%s" % (flow.request.host, flow.request.path))
mitmproxy.ctx.log("handle request: %s%s" % (flow.request.host, flow.request.path))
time.sleep(5)
mitmproxy.log("start request: %s%s" % (flow.request.host, flow.request.path))
mitmproxy.ctx.log("start request: %s%s" % (flow.request.host, flow.request.path))

View File

@ -17,9 +17,9 @@ def hello_world():
# Register the app using the magic domain "proxapp" on port 80. Requests to
# this domain and port combination will now be routed to the WSGI app instance.
def start():
mitmproxy.master.apps.add(app, "proxapp", 80)
mitmproxy.ctx.master.apps.add(app, "proxapp", 80)
# SSL works too, but the magic domain needs to be resolvable from the mitmproxy machine due to mitmproxy's design.
# mitmproxy will connect to said domain and use serve its certificate (unless --no-upstream-cert is set)
# but won't send any data.
mitmproxy.master.apps.add(app, "example.com", 443)
mitmproxy.ctx.master.apps.add(app, "example.com", 443)

View File

@ -8,7 +8,7 @@ def start():
"""
Called once on script startup, before any other events.
"""
mitmproxy.log("start")
mitmproxy.ctx.log("start")
def clientconnect(root_layer):
@ -16,14 +16,14 @@ def clientconnect(root_layer):
Called when a client initiates a connection to the proxy. Note that a
connection can correspond to multiple HTTP requests
"""
mitmproxy.log("clientconnect")
mitmproxy.ctx.log("clientconnect")
def request(flow):
"""
Called when a client request has been received.
"""
mitmproxy.log("request")
mitmproxy.ctx.log("request")
def serverconnect(server_conn):
@ -31,7 +31,7 @@ def serverconnect(server_conn):
Called when the proxy initiates a connection to the target server. Note that a
connection can correspond to multiple HTTP requests
"""
mitmproxy.log("serverconnect")
mitmproxy.ctx.log("serverconnect")
def responseheaders(flow):
@ -40,14 +40,14 @@ def responseheaders(flow):
but the response body has not been processed yet. Can be used to tell mitmproxy
to stream the response.
"""
mitmproxy.log("responseheaders")
mitmproxy.ctx.log("responseheaders")
def response(flow):
"""
Called when a server response has been received.
"""
mitmproxy.log("response")
mitmproxy.ctx.log("response")
def error(flow):
@ -56,25 +56,25 @@ def error(flow):
interrupted connections. This is distinct from a valid server HTTP error
response, which is simply a response with an HTTP error code.
"""
mitmproxy.log("error")
mitmproxy.ctx.log("error")
def serverdisconnect(server_conn):
"""
Called when the proxy closes the connection to the target server.
"""
mitmproxy.log("serverdisconnect")
mitmproxy.ctx.log("serverdisconnect")
def clientdisconnect(root_layer):
"""
Called when a client disconnects from the proxy.
"""
mitmproxy.log("clientdisconnect")
mitmproxy.ctx.log("clientdisconnect")
def done():
"""
Called once on script shutdown, after any other events.
"""
mitmproxy.log("done")
mitmproxy.ctx.log("done")

View File

@ -135,7 +135,7 @@ def next_layer(next_layer):
next_layer.__class__ = TlsFeedback
else:
# We don't intercept - reply with a pass-through layer and add a "skipped" entry.
mitmproxy.log("TLS passthrough for %s" % repr(next_layer.server_conn.address), "info")
mitmproxy.ctx.log("TLS passthrough for %s" % repr(next_layer.server_conn.address), "info")
next_layer_replacement = RawTCPLayer(next_layer.ctx, ignore=True)
next_layer.reply.send(next_layer_replacement)
tls_strategy.record_skipped(server_address)

View File

@ -1,5 +0,0 @@
from typing import Callable # noqa
from mitmproxy import flow # noqa
master = None # type: flow.FlowMaster
log = None # type: Callable[[str], None]

View File

@ -6,7 +6,7 @@ import contextlib
from six.moves import queue
import mitmproxy
from . import ctx as mitmproxy_ctx
from netlib import basethread
from . import exceptions
@ -59,16 +59,16 @@ class Master(object):
@contextlib.contextmanager
def handlecontext(self):
# Handlecontexts also have to nest - leave cleanup to the outermost
if mitmproxy.master:
if mitmproxy_ctx.master:
yield
return
mitmproxy.master = self
mitmproxy.log = Log(self)
mitmproxy_ctx.master = self
mitmproxy_ctx.log = Log(self)
try:
yield
finally:
mitmproxy.master = None
mitmproxy.log = None
mitmproxy_ctx.master = None
mitmproxy_ctx.log = None
def add_server(self, server):
# We give a Channel to the server which can be used to communicate with the master

4
mitmproxy/ctx.py Normal file
View File

@ -0,0 +1,4 @@
from typing import Callable # noqa
master = None # type: "mitmproxy.flow.FlowMaster"
log = None # type: Callable[[str], None]

View File

@ -3,35 +3,35 @@ log = []
def clientconnect(cc):
mitmproxy.log("XCLIENTCONNECT")
mitmproxy.ctx.log("XCLIENTCONNECT")
log.append("clientconnect")
def serverconnect(cc):
mitmproxy.log("XSERVERCONNECT")
mitmproxy.ctx.log("XSERVERCONNECT")
log.append("serverconnect")
def request(f):
mitmproxy.log("XREQUEST")
mitmproxy.ctx.log("XREQUEST")
log.append("request")
def response(f):
mitmproxy.log("XRESPONSE")
mitmproxy.ctx.log("XRESPONSE")
log.append("response")
def responseheaders(f):
mitmproxy.log("XRESPONSEHEADERS")
mitmproxy.ctx.log("XRESPONSEHEADERS")
log.append("responseheaders")
def clientdisconnect(cc):
mitmproxy.log("XCLIENTDISCONNECT")
mitmproxy.ctx.log("XCLIENTDISCONNECT")
log.append("clientdisconnect")
def error(cc):
mitmproxy.log("XERROR")
mitmproxy.ctx.log("XERROR")
log.append("error")

View File

@ -2,5 +2,5 @@ import mitmproxy
def request(f):
f = mitmproxy.master.duplicate_flow(f)
mitmproxy.master.replay_request(f, block=True, run_scripthooks=False)
f = mitmproxy.ctx.master.duplicate_flow(f)
mitmproxy.ctx.master.replay_request(f, block=True, run_scripthooks=False)

View File

@ -21,8 +21,8 @@ def example(command):
yield s
@mock.patch("mitmproxy.master")
@mock.patch("mitmproxy.log")
@mock.patch("mitmproxy.ctx.master")
@mock.patch("mitmproxy.ctx.log")
def test_load_scripts(log, master):
scripts = glob.glob("%s/*.py" % example_dir)
@ -121,7 +121,7 @@ def test_redirect_requests():
assert flow.request.host == "mitmproxy.org"
@mock.patch("mitmproxy.log")
@mock.patch("mitmproxy.ctx.log")
def test_har_extractor(log):
if sys.version_info >= (3, 0):
with tutils.raises("does not work on Python 3"):