def test_roundtrip_server_via(self): s = tflow.tserver_conn() s.via = tflow.tserver_conn() del s.reply s.wfile = None s.rfile = None ps = protobuf._dump_http_server_conn(s) ls = protobuf._load_http_server_conn(ps) assert s.__dict__ == ls.__dict__ del s.via.reply s.via.wfile = None s.via.rfile = None assert s.via.__dict__ == ls.via.__dict__
def test_playback(self): cp = clientplayback.ClientPlayback() with taddons.context() as tctx: assert cp.count() == 0 f = tflow.tflow(resp=True) cp.start_replay([f]) assert cp.count() == 1 RP = "mitmproxy.proxy.protocol.http_replay.RequestReplayThread" with mock.patch(RP) as rp: assert not cp.current_thread cp.tick() assert rp.called assert cp.current_thread cp.flows = [] cp.current_thread.is_alive.return_value = False assert cp.count() == 1 cp.tick() assert cp.count() == 0 assert tctx.master.has_event("update") assert tctx.master.has_event("processing_complete") cp.current_thread = MockThread() cp.tick() assert cp.current_thread is None cp.start_replay([f]) cp.stop_replay() assert not cp.flows df = tflow.DummyFlow(tflow.tclient_conn(), tflow.tserver_conn(), True) with pytest.raises(exceptions.CommandError, match="Can't replay live flow."): cp.start_replay([df])
def test_or(self): f = self.flow() f.server_conn = tflow.tserver_conn() assert self.q("~b hello | ~b me", f) assert self.q("~src :22 | ~b me", f) assert not self.q("~src :99 | ~dst :99", f) assert self.q("(~src :22 | ~dst :22) | ~b me", f)
def test_eq(self): c = tflow.tserver_conn() c2 = c.copy() assert c == c assert c != c2 assert c != 42 assert hash(c) != hash(c2)
async def test_storage_flush_with_specials(self): s = self.start_session(fp=0.5) f = self.tft() s.request(f) await asyncio.sleep(1) assert len(s._hot_store) == 0 f.response = http.HTTPResponse.wrap(tutils.tresp()) s.response(f) assert len(s._hot_store) == 1 assert s.load_storage() == [f] await asyncio.sleep(1) assert all([lflow.__dict__ == flow.__dict__ for lflow, flow in list(zip(s.load_storage(), [f]))]) f.server_conn.via = tflow.tserver_conn() s.request(f) await asyncio.sleep(0.6) assert len(s._hot_store) == 0 assert all([lflow.__dict__ == flow.__dict__ for lflow, flow in list(zip(s.load_storage(), [f]))]) flows = [self.tft() for _ in range(500)] s.update(flows) await asyncio.sleep(0.6) assert s._flush_period == s._FP_DEFAULT * s._FP_DECREMENT await asyncio.sleep(3) assert s._flush_period == s._FP_DEFAULT
async def test_storage_flush_with_specials(self): s = self.start_session(fp=0.5) f = self.tft() s.request(f) await asyncio.sleep(1) assert len(s._hot_store) == 0 f.response = http.HTTPResponse.wrap(tutils.tresp()) s.response(f) assert len(s._hot_store) == 1 assert s.load_storage() == [f] await asyncio.sleep(1) assert all([ lflow.__dict__ == flow.__dict__ for lflow, flow in list(zip(s.load_storage(), [f])) ]) f.server_conn.via = tflow.tserver_conn() s.request(f) await asyncio.sleep(0.6) assert len(s._hot_store) == 0 assert all([ lflow.__dict__ == flow.__dict__ for lflow, flow in list(zip(s.load_storage(), [f])) ]) flows = [self.tft() for _ in range(500)] s.update(flows) await asyncio.sleep(0.6) assert s._flush_period == s._FP_DEFAULT * s._FP_DECREMENT await asyncio.sleep(3) assert s._flush_period == s._FP_DEFAULT
def test_tls_established_property(self): c = tflow.tserver_conn() c.tls_established = True assert c.tls_established assert c.tls_established c.tls_established = False assert not c.tls_established assert not c.tls_established
def test_dst(self): q = self.req() q.server_conn = tflow.tserver_conn() assert self.q("~dst address", q) assert not self.q("~dst foobar", q) assert self.q("~dst :22", q) assert not self.q("~dst :99", q) assert self.q("~dst address:22", q)
def test_repr(self): sc = tflow.tserver_conn() assert "address:22" in repr(sc) assert "ssl" not in repr(sc) sc.ssl_established = True assert "ssl" in repr(sc) sc.sni = "foo" assert "foo" in repr(sc)
def test_dst(self): f = self.flow() f.server_conn = tflow.tserver_conn() assert self.q("~dst address", f) assert not self.q("~dst foobar", f) assert self.q("~dst :22", f) assert not self.q("~dst :99", f) assert self.q("~dst address:22", f)
def test_and(self): f = self.flow() f.server_conn = tflow.tserver_conn() assert self.q("~b hello & ~b me", f) assert not self.q("~src wrongaddress & ~b hello", f) assert self.q("(~src :22 & ~dst :22) & ~b hello", f) assert not self.q("(~src address:22 & ~dst :22) & ~b nonexistent", f) assert not self.q("(~src address:22 & ~dst :99) & ~b hello", f)
def test_send(self): c = tflow.tserver_conn() c.send(b'foobar') c.send([b'foo', b'bar']) with pytest.raises(TypeError): c.send('string') with pytest.raises(TypeError): c.send(['string', 'not']) assert c.wfile.getvalue() == b'foobarfoobar'
def test_roundtrip_server_cert(self, tdata): s = tflow.tserver_conn() del s.reply s.wfile = None s.rfile = None with open(tdata.path("mitmproxy/net/data/text_cert"), "rb") as f: d = f.read() s.cert = certs.Cert.from_pem(d) ps = protobuf._dump_http_server_conn(s) ls = protobuf._load_http_server_conn(ps) assert s.__dict__ == ls.__dict__
def test_self_connect(): server = tserver_conn() client = tclient_conn() server.address = ("localhost", 8080) ps = Proxyserver() with taddons.context(ps) as tctx: # not calling .running() here to avoid unnecessary socket ps.options = tctx.options ps.server_connect(server_hooks.ServerConnectionHookData( server, client)) assert server.error == "Stopped mitmproxy from recursively connecting to itself."
def test_self_connect(): server = tserver_conn() client = tclient_conn() server.address = ("localhost", 8080) ps = Proxyserver() with taddons.context(ps) as tctx: # not calling .running() here to avoid unnecessary socket ps.options = tctx.options ps.server_connect( server_hooks.ServerConnectionHookData(server, client) ) assert "Request destination unknown" in server.error
def test_filters(self): e = self.err() f = self.flow() f.server_conn = tflow.tserver_conn() assert self.q("~all", f) assert not self.q("~a", f) assert not self.q("~b whatever", f) assert not self.q("~bq whatever", f) assert not self.q("~bs whatever", f) assert not self.q("~c 0", f) assert not self.q("~d whatever", f) assert self.q("~dst address", f) assert not self.q("~dst nonexistent", f) assert self.q("~e", e) assert not self.q("~e", f) assert not self.q("~http", f) assert not self.q("~tcp", f) assert not self.q("~websocket", f) assert not self.q("~h whatever", f) assert not self.q("~hq whatever", f) assert not self.q("~hs whatever", f) assert not self.q("~m whatever", f) assert not self.q("~s", f) assert self.q("~src 127.0.0.1", f) assert not self.q("~src nonexistent", f) assert not self.q("~tcp", f) assert not self.q("~t whatever", f) assert not self.q("~tq whatever", f) assert not self.q("~ts whatever", f) assert not self.q("~u whatever", f) assert not self.q("~q", f) assert not self.q("~comment .", f) f.comment = "comment" assert self.q("~comment .", f)
def test_filters(self): e = self.err() f = self.flow() f.server_conn = tflow.tserver_conn() assert not self.q("~a", f) assert not self.q("~b whatever", f) assert not self.q("~bq whatever", f) assert not self.q("~bs whatever", f) assert not self.q("~c 0", f) assert not self.q("~d whatever", f) assert self.q("~dst address", f) assert not self.q("~dst nonexistent", f) assert self.q("~e", e) assert not self.q("~e", f) assert not self.q("~http", f) assert not self.q("~tcp", f) assert not self.q("~websocket", f) assert not self.q("~h whatever", f) assert not self.q("~hq whatever", f) assert not self.q("~hs whatever", f) assert not self.q("~m whatever", f) assert not self.q("~s", f) assert self.q("~src address", f) assert not self.q("~src nonexistent", f) assert not self.q("~tcp", f) assert not self.q("~t whatever", f) assert not self.q("~tq whatever", f) assert not self.q("~ts whatever", f) assert not self.q("~u whatever", f) assert not self.q("~q", f)
def test_repr(self): c = tflow.tserver_conn() c.sni = 'foobar' c.tls_established = True c.alpn_proto_negotiated = b'h2' assert 'address:22' in repr(c) assert 'ALPN' in repr(c) assert 'TLS: foobar' in repr(c) c.sni = None c.tls_established = True c.alpn_proto_negotiated = None assert 'ALPN' not in repr(c) assert 'TLS' in repr(c) c.sni = None c.tls_established = False assert 'TLS' not in repr(c)
def test_filters(self): e = self.err() f = self.flow() f.server_conn = tflow.tserver_conn() assert not self.q("~a", f) assert not self.q("~b whatever", f) assert not self.q("~bq whatever", f) assert not self.q("~bs whatever", f) assert not self.q("~c 0", f) assert not self.q("~d whatever", f) assert self.q("~dst address", f) assert not self.q("~dst nonexistent", f) assert self.q("~e", e) assert not self.q("~e", f) assert not self.q("~http", f) assert not self.q("~h whatever", f) assert not self.q("~hq whatever", f) assert not self.q("~hs whatever", f) assert not self.q("~m whatever", f) assert not self.q("~s", f) assert self.q("~src address", f) assert not self.q("~src nonexistent", f) assert not self.q("~tcp", f) assert not self.q("~t whatever", f) assert not self.q("~tq whatever", f) assert not self.q("~ts whatever", f) assert not self.q("~u whatever", f) assert not self.q("~q", f)
def test_repr(self): c = tflow.tserver_conn() c.sni = 'foobar' c.tls_established = True c.alpn_proto_negotiated = b'h2' assert 'address:22' in repr(c) assert 'ALPN' in repr(c) assert 'TLSv1.2: foobar' in repr(c) c.sni = None c.tls_established = True c.alpn_proto_negotiated = None assert 'ALPN' not in repr(c) assert 'TLS' in repr(c) c.sni = None c.tls_established = False assert 'TLS' not in repr(c)
def test_state(self): c = tflow.tserver_conn() c2 = c.copy() assert c2.get_state() != c.get_state() c.id = c2.id = "foo" assert c2.get_state() == c.get_state()