def test_copy(self): f = tflow.ttcpflow() f.get_state() f2 = f.copy() a = f.get_state() b = f2.get_state() del a["id"] del b["id"] assert a == b assert not f == f2 assert f is not f2 assert f.messages is not f2.messages for m in f.messages: assert m.get_state() m2 = m.copy() assert not m == m2 assert m is not m2 a = m.get_state() b = m2.get_state() assert a == b m = tcp.TCPMessage(False, 'foo') m.set_state(f.messages[0].get_state()) assert m.timestamp == f.messages[0].timestamp f = tflow.ttcpflow(err=True) f2 = f.copy() assert f is not f2 assert f.error.get_state() == f2.error.get_state() assert f.error is not f2.error
def test_copy(self): f = tflow.ttcpflow() f.get_state() f2 = f.copy() a = f.get_state() b = f2.get_state() del a["id"] del b["id"] assert a == b assert not f == f2 assert f is not f2 assert f.messages is not f2.messages for m in f.messages: assert m.get_state() m2 = m.copy() assert not m == m2 assert m is not m2 a = m.get_state() b = m2.get_state() assert a == b m = tcp.TCPMessage(False, 'foo') m.set_state(f.messages[0].get_state()) assert m.timestamp == f.messages[0].timestamp f = tflow.ttcpflow(err=True) f2 = f.copy() assert f is not f2 assert f.error.get_state() == f2.error.get_state() assert f.error is not f2.error
def test_match(self): f = tflow.ttcpflow() assert not flowfilter.match("~b nonexistent", f) assert flowfilter.match(None, f) assert not flowfilter.match("~b nonexistent", f) f = tflow.ttcpflow(err=True) assert flowfilter.match("~e", f) tutils.raises(ValueError, flowfilter.match, "~", f)
def test_match(self): f = tflow.ttcpflow() assert not flowfilter.match("~b nonexistent", f) assert flowfilter.match(None, f) assert not flowfilter.match("~b nonexistent", f) f = tflow.ttcpflow(err=True) assert flowfilter.match("~e", f) tutils.raises(ValueError, flowfilter.match, "~", f)
def test_format_flow(): flows = [ tflow.tflow(resp=True), tflow.tflow(err=True), tflow.ttcpflow(), tflow.ttcpflow(err=True), ] for f in flows: for render_mode in common.RenderMode: assert common.format_flow(f, render_mode=render_mode) assert common.format_flow(f, render_mode=render_mode, hostheader=True, focused=False)
def test_tcp(): r = intercept.Intercept() with taddons.context(r) as tctx: tctx.configure(r, intercept="~tcp") f = tflow.ttcpflow() tctx.cycle(r, f) assert f.intercepted tctx.configure(r, intercept_active=False) f = tflow.ttcpflow() tctx.cycle(r, f) assert not f.intercepted
def test_tcp(): d = dumper.Dumper() sio = io.StringIO() with taddons.context(options=dump.Options()) as ctx: ctx.configure(d, tfile=sio, flow_detail = 3, showhost = True) f = tflow.ttcpflow(client_conn=True, server_conn=True) d.tcp_message(f) assert "it's me" in sio.getvalue() sio.truncate(0) f = tflow.ttcpflow(client_conn=True, err=True) d.tcp_error(f) assert "Error in TCP" in sio.getvalue()
def test_tcp(): sio = io.StringIO() d = dumper.Dumper(sio) with taddons.context(options=dump.Options()) as ctx: ctx.configure(d, flow_detail=3, showhost=True) f = tflow.ttcpflow(client_conn=True, server_conn=True) d.tcp_message(f) assert "it's me" in sio.getvalue() sio.truncate(0) f = tflow.ttcpflow(client_conn=True, err=True) d.tcp_error(f) assert "Error in TCP" in sio.getvalue()
def data(): f = io.BytesIO() w = mitmproxy.io.FlowWriter(f) flows = [ tflow.tflow(resp=True), tflow.tflow(err=True), tflow.ttcpflow(), tflow.ttcpflow(err=True) ] for flow in flows: w.add(flow) f.seek(0) return f
def write_data(path, corrupt=False): with open(path, "wb") as tf: w = io.FlowWriter(tf) for i in range(3): f = tflow.tflow(resp=True) w.add(f) for i in range(3): f = tflow.tflow(err=True) w.add(f) f = tflow.ttcpflow() w.add(f) f = tflow.ttcpflow(err=True) w.add(f) if corrupt: tf.write(b"flibble")
def data(): f = io.BytesIO() w = mitmproxy.io.FlowWriter(f) flows = [ tflow.tflow(resp=True), tflow.tflow(err=True), tflow.ttcpflow(), tflow.ttcpflow(err=True) ] for flow in flows: w.add(flow) f.seek(0) return f
def test_cut(): c = cut.Cut() with taddons.context(): tflows = [tflow.tflow(resp=True)] assert c.cut(tflows, ["request.method"]) == [["GET"]] assert c.cut(tflows, ["request.scheme"]) == [["http"]] assert c.cut(tflows, ["request.host"]) == [["address"]] assert c.cut(tflows, ["request.port"]) == [["22"]] assert c.cut(tflows, ["request.path"]) == [["/path"]] assert c.cut(tflows, ["request.url"]) == [["http://address:22/path"]] assert c.cut(tflows, ["request.content"]) == [[b"content"]] assert c.cut(tflows, ["request.header[header]"]) == [["qvalue"]] assert c.cut(tflows, ["request.header[unknown]"]) == [[""]] assert c.cut(tflows, ["response.status_code"]) == [["200"]] assert c.cut(tflows, ["response.reason"]) == [["OK"]] assert c.cut(tflows, ["response.content"]) == [[b"message"]] assert c.cut(tflows, ["response.header[header-response]"]) == [["svalue"]] assert c.cut(tflows, ["moo"]) == [[""]] with pytest.raises(exceptions.CommandError): assert c.cut(tflows, ["__dict__"]) == [[""]] with taddons.context(): tflows = [tflow.tflow(resp=False)] assert c.cut(tflows, ["response.reason"]) == [[""]] assert c.cut(tflows, ["response.header[key]"]) == [[""]] c = cut.Cut() with taddons.context(): tflows = [tflow.ttcpflow()] assert c.cut(tflows, ["request.method"]) == [[""]] assert c.cut(tflows, ["response.status"]) == [[""]]
def test_cut(): v = view.View() c = cut.Cut() with taddons.context() as tctx: v.add([tflow.tflow(resp=True)]) tctx.master.addons.add(v, c) assert c.cut("q.method|@all") == [["GET"]] assert c.cut("q.scheme|@all") == [["http"]] assert c.cut("q.host|@all") == [["address"]] assert c.cut("q.port|@all") == [["22"]] assert c.cut("q.path|@all") == [["/path"]] assert c.cut("q.url|@all") == [["http://*****:*****@all") == [[b"content"]] assert c.cut("q.header[header]|@all") == [["qvalue"]] assert c.cut("q.header[unknown]|@all") == [[""]] assert c.cut("s.status_code|@all") == [["200"]] assert c.cut("s.reason|@all") == [["OK"]] assert c.cut("s.content|@all") == [[b"message"]] assert c.cut("s.header[header-response]|@all") == [["svalue"]] assert c.cut("moo") == [[""]] with pytest.raises(exceptions.CommandError): assert c.cut("__dict__") == [[""]] v = view.View() c = cut.Cut() with taddons.context() as tctx: tctx.master.addons.add(v, c) v.add([tflow.ttcpflow()]) assert c.cut("q.method|@all") == [[""]] assert c.cut("s.status|@all") == [[""]]
async def test_inject_fail() -> None: ps = Proxyserver() with taddons.context(ps) as tctx: ps.inject_websocket( tflow.tflow(), True, b"test" ) await tctx.master.await_log("Cannot inject WebSocket messages into non-WebSocket flows.", level="warn") ps.inject_tcp( tflow.tflow(), True, b"test" ) await tctx.master.await_log("Cannot inject TCP messages into non-TCP flows.", level="warn") ps.inject_websocket( tflow.twebsocketflow(), True, b"test" ) await tctx.master.await_log("Flow is not from a live connection.", level="warn") ps.inject_websocket( tflow.ttcpflow(), True, b"test" ) await tctx.master.await_log("Flow is not from a live connection.", level="warn")
def test_cut(): v = view.View() c = cut.Cut() with taddons.context() as tctx: v.add([tflow.tflow(resp=True)]) tctx.master.addons.add(v, c) assert c.cut("q.method|@all") == [["GET"]] assert c.cut("q.scheme|@all") == [["http"]] assert c.cut("q.host|@all") == [["address"]] assert c.cut("q.port|@all") == [["22"]] assert c.cut("q.path|@all") == [["/path"]] assert c.cut("q.url|@all") == [["http://*****:*****@all") == [[b"content"]] assert c.cut("q.header[header]|@all") == [["qvalue"]] assert c.cut("q.header[unknown]|@all") == [[""]] assert c.cut("s.status_code|@all") == [["200"]] assert c.cut("s.reason|@all") == [["OK"]] assert c.cut("s.content|@all") == [[b"message"]] assert c.cut("s.header[header-response]|@all") == [["svalue"]] assert c.cut("moo") == [[""]] with pytest.raises(exceptions.CommandError): assert c.cut("__dict__") == [[""]] v = view.View() c = cut.Cut() with taddons.context() as tctx: tctx.master.addons.add(v, c) v.add([tflow.ttcpflow()]) assert c.cut("q.method|@all") == [[""]] assert c.cut("s.status|@all") == [[""]]
def _treader(self): sio = io.BytesIO() w = mitmproxy.io.FlowWriter(sio) for i in range(3): f = tflow.tflow(resp=True) w.add(f) for i in range(3): f = tflow.tflow(err=True) w.add(f) f = tflow.ttcpflow() w.add(f) f = tflow.ttcpflow(err=True) w.add(f) sio.seek(0) return mitmproxy.io.FlowReader(sio)
def test_tcp(tmpdir): sa = save.Save() with taddons.context(sa) as tctx: p = str(tmpdir.join("foo")) tctx.configure(sa, save_stream_file=p) tt = tflow.ttcpflow() sa.tcp_start(tt) sa.tcp_end(tt) tt = tflow.ttcpflow() sa.tcp_start(tt) sa.tcp_error(tt) tctx.configure(sa, save_stream_file=None) assert len(rd(p)) == 2
def _treader(self): sio = io.BytesIO() w = mitmproxy.io.FlowWriter(sio) for i in range(3): f = tflow.tflow(resp=True) w.add(f) for i in range(3): f = tflow.tflow(err=True) w.add(f) f = tflow.ttcpflow() w.add(f) f = tflow.ttcpflow(err=True) w.add(f) sio.seek(0) return mitmproxy.io.FlowReader(sio)
def test_cut(): c = cut.Cut() with taddons.context(): tflows = [tflow.tflow(resp=True)] assert c.cut(tflows, ["request.method"]) == [["GET"]] assert c.cut(tflows, ["request.scheme"]) == [["http"]] assert c.cut(tflows, ["request.host"]) == [["address"]] assert c.cut(tflows, ["request.port"]) == [["22"]] assert c.cut(tflows, ["request.path"]) == [["/path"]] assert c.cut(tflows, ["request.url"]) == [["http://address:22/path"]] assert c.cut(tflows, ["request.content"]) == [[b"content"]] assert c.cut(tflows, ["request.header[header]"]) == [["qvalue"]] assert c.cut(tflows, ["request.header[unknown]"]) == [[""]] assert c.cut(tflows, ["response.status_code"]) == [["200"]] assert c.cut(tflows, ["response.reason"]) == [["OK"]] assert c.cut(tflows, ["response.content"]) == [[b"message"]] assert c.cut(tflows, ["response.header[header-response]"]) == [["svalue"]] assert c.cut(tflows, ["moo"]) == [[""]] with pytest.raises(exceptions.CommandError): assert c.cut(tflows, ["__dict__"]) == [[""]] with taddons.context(): tflows = [tflow.tflow(resp=False)] assert c.cut(tflows, ["response.reason"]) == [[""]] assert c.cut(tflows, ["response.header[key]"]) == [[""]] c = cut.Cut() with taddons.context(): tflows = [tflow.ttcpflow()] assert c.cut(tflows, ["request.method"]) == [[""]] assert c.cut(tflows, ["response.status"]) == [[""]]
def test_simple(): r = intercept.Intercept() with taddons.context(r) as tctx: assert not r.filt tctx.configure(r, intercept="~q") assert r.filt assert tctx.options.intercept_active with pytest.raises(exceptions.OptionsError): tctx.configure(r, intercept="~~") tctx.configure(r, intercept=None) assert not r.filt assert not tctx.options.intercept_active tctx.configure(r, intercept="~s") f = tflow.tflow(resp=True) tctx.cycle(r, f) assert f.intercepted f = tflow.tflow(resp=False) tctx.cycle(r, f) assert not f.intercepted f = tflow.tflow(resp=True) r.response(f) assert f.intercepted tctx.configure(r, intercept_active=False) f = tflow.tflow(resp=True) tctx.cycle(r, f) assert not f.intercepted tctx.configure(r, intercept_active=True) f = tflow.tflow(resp=True) tctx.cycle(r, f) assert f.intercepted tctx.configure(r, intercept_active=False) f = tflow.ttcpflow() tctx.cycle(r, f) assert not f.intercepted tctx.configure(r, intercept_active=True) f = tflow.ttcpflow() tctx.cycle(r, f) assert f.intercepted
def gen_data(corrupt=False): tf = io.BytesIO() w = mitmproxy.io.FlowWriter(tf) for i in range(3): f = tflow.tflow(resp=True) w.add(f) for i in range(3): f = tflow.tflow(err=True) w.add(f) f = tflow.ttcpflow() w.add(f) f = tflow.ttcpflow(err=True) w.add(f) if corrupt: tf.write(b"flibble") tf.seek(0) return tf
def test_tcp(tmpdir): sa = streamfile.StreamFile() with taddons.context() as tctx: p = str(tmpdir.join("foo")) tctx.configure(sa, streamfile=p) tt = tflow.ttcpflow() sa.tcp_start(tt) sa.tcp_end(tt) tctx.configure(sa, streamfile=None) assert rd(p)
def test_tcp(tmpdir): sa = save.Save() with taddons.context() as tctx: p = str(tmpdir.join("foo")) tctx.configure(sa, save_stream_file=p) tt = tflow.ttcpflow() sa.tcp_start(tt) sa.tcp_end(tt) tctx.configure(sa, save_stream_file=None) assert rd(p)
def test_tcp_flow(err): f = tflow.ttcpflow(err=err) i = eventsequence.iterate(f) assert next(i) == ("tcp_start", f) assert len(f.messages) == 0 assert next(i) == ("tcp_message", f) assert len(f.messages) == 1 assert next(i) == ("tcp_message", f) assert len(f.messages) == 2 if err: assert next(i) == ("tcp_error", f) assert next(i) == ("tcp_end", f)
def test_tcp(): sa = streamfile.StreamFile() with taddons.context() as tctx: with tutils.tmpdir() as tdir: p = os.path.join(tdir, "foo") tctx.configure(sa, streamfile=p) tt = tflow.ttcpflow() sa.tcp_start(tt) sa.tcp_end(tt) tctx.configure(sa, streamfile=None) assert rd(p)
def test_tcp_flow(err): f = tflow.ttcpflow(err=err) i = eventsequence.iterate(f) assert next(i) == ("tcp_start", f) assert len(f.messages) == 0 assert next(i) == ("tcp_message", f) assert len(f.messages) == 1 assert next(i) == ("tcp_message", f) assert len(f.messages) == 2 if err: assert next(i) == ("tcp_error", f) assert next(i) == ("tcp_end", f)
def test_tcp(): sa = streamfile.StreamFile() with taddons.context() as tctx: with tutils.tmpdir() as tdir: p = os.path.join(tdir, "foo") tctx.configure(sa, streamfile=p) tt = tflow.ttcpflow() sa.tcp_start(tt) sa.tcp_end(tt) tctx.configure(sa, streamfile=None) assert rd(p)
def test_tcp_flow(err): f = tflow.ttcpflow(err=err) i = eventsequence.iterate(f) assert isinstance(next(i), layers.tcp.TcpStartHook) assert len(f.messages) == 0 assert isinstance(next(i), layers.tcp.TcpMessageHook) assert len(f.messages) == 1 assert isinstance(next(i), layers.tcp.TcpMessageHook) assert len(f.messages) == 2 if err: assert isinstance(next(i), layers.tcp.TcpErrorHook) else: assert isinstance(next(i), layers.tcp.TcpEndHook)
def test_simple_tcp(): v = view.View() f = tflow.ttcpflow() assert v.store_count() == 0 v.tcp_start(f) assert list(v) == [f] # These all just call update v.tcp_start(f) v.tcp_message(f) v.tcp_error(f) v.tcp_end(f) assert list(v) == [f]
def test_order_generators_tcp(): v = view.View() tf = tflow.ttcpflow() rs = view.OrderRequestStart(v) assert rs.generate(tf) == 946681200 rm = view.OrderRequestMethod(v) assert rm.generate(tf) == "TCP" ru = view.OrderRequestURL(v) assert ru.generate(tf) == "address:22" sz = view.OrderKeySize(v) assert sz.generate(tf) == sum(len(m.content) for m in tf.messages)
def test_generate_tflow_js(tdata): tf_http = tflow.tflow(resp=True, err=True, ws=True) tf_http.id = "d91165be-ca1f-4612-88a9-c0f8696f3e29" tf_http.client_conn.id = "4a18d1a0-50a1-48dd-9aa6-d45d74282939" tf_http.server_conn.id = "f087e7b2-6d0a-41a8-a8f0-e1a4761395f8" tf_http.server_conn.certificate_list = [ certs.Cert.from_pem( Path( tdata.path( "mitmproxy/net/data/verificationcerts/self-signed.pem")). read_bytes()) ] tf_http.request.trailers = Headers(trailer="qvalue") tf_http.response.trailers = Headers(trailer="qvalue") tf_http.comment = "I'm a comment!" tf_tcp = tflow.ttcpflow(err=True) tf_tcp.id = "2ea7012b-21b5-4f8f-98cd-d49819954001" tf_tcp.client_conn.id = "8be32b99-a0b3-446e-93bc-b29982fe1322" tf_tcp.server_conn.id = "e33bb2cd-c07e-4214-9a8e-3a8f85f25200" # language=TypeScript content = ( "/** Auto-generated by test_app.py:test_generate_tflow_js */\n" "import {HTTPFlow, TCPFlow} from '../../flow';\n" "export function THTTPFlow(): Required<HTTPFlow> {\n" " return %s\n" "}\n" "export function TTCPFlow(): Required<TCPFlow> {\n" " return %s\n" "}" % ( textwrap.indent( json.dumps(app.flow_to_json(tf_http), indent=4, sort_keys=True), " "), textwrap.indent( json.dumps(app.flow_to_json(tf_tcp), indent=4, sort_keys=True), " "), )) content = content.replace(": null", ": undefined") (Path(__file__).parent / "../../../../web/src/js/__tests__/ducks/_tflow.ts").write_bytes( content.encode())
def test_check(): cp = ClientPlayback() f = tflow.tflow(resp=True) f.live = True assert "live flow" in cp.check(f) f = tflow.tflow(resp=True) f.intercepted = True assert "intercepted flow" in cp.check(f) f = tflow.tflow(resp=True) f.request = None assert "missing request" in cp.check(f) f = tflow.tflow(resp=True) f.request.raw_content = None assert "missing content" in cp.check(f) f = tflow.ttcpflow() assert "Can only replay HTTP" in cp.check(f)
def test_check(self): cp = clientplayback.ClientPlayback() with taddons.context(cp): f = tflow.tflow(resp=True) f.live = True assert "live flow" in cp.check(f) f = tflow.tflow(resp=True) f.intercepted = True assert "intercepted flow" in cp.check(f) f = tflow.tflow(resp=True) f.request = None assert "missing request" in cp.check(f) f = tflow.tflow(resp=True) f.request.raw_content = None assert "missing content" in cp.check(f) f = tflow.ttcpflow() assert "Can only replay HTTP" in cp.check(f)
def tcp(level): f1 = tflow.ttcpflow(client_conn=True, server_conn=True) show(level, [f1])
def err(self): return tflow.ttcpflow(err=True)
def flow(self): return tflow.ttcpflow()
def flow(self): return tflow.ttcpflow()
def test_repr(self): f = tflow.ttcpflow() assert 'TCPFlow' in repr(f) assert '-> ' in repr(f.messages[0])
def tcp_flow(): return tflow.ttcpflow()
def tcp(level): f1 = tflow.ttcpflow(client_conn=True, server_conn=True) show(level, [f1])
def tcp(level): f1 = tflow.ttcpflow() show(level, [f1])
def err(self): return tflow.ttcpflow(err=True)
def test_repr(self): f = tflow.ttcpflow() assert 'TCPFlow' in repr(f) assert '-> ' in repr(f.messages[0])