diff --git a/mitmproxy/filt.py b/mitmproxy/filt.py index e0e5606b8..11765dcd3 100644 --- a/mitmproxy/filt.py +++ b/mitmproxy/filt.py @@ -81,6 +81,24 @@ class FErr(_Action): return True if f.error else False +class FHTTP(_Action): + code = "http" + help = "Match HTTP flows" + + @only(HTTPFlow) + def __call__(self, f): + return True + + +class FTCP(_Action): + code = "tcp" + help = "Match TCP flows" + + @only(TCPFlow) + def __call__(self, f): + return True + + class FReq(_Action): code = "q" help = "Match request with no response" @@ -384,7 +402,9 @@ filt_unary = [ FReq, FResp, FAsset, - FErr + FErr, + FHTTP, + FTCP, ] filt_rex = [ FHeadRequest, diff --git a/test/mitmproxy/test_filt.py b/test/mitmproxy/test_filt.py index 8330b68c5..46e86b579 100644 --- a/test/mitmproxy/test_filt.py +++ b/test/mitmproxy/test_filt.py @@ -87,6 +87,11 @@ class TestMatchingHTTPFlow: def q(self, q, o): return filt.parse(q)(o) + def test_http(self): + s = self.req() + assert self.q("~http", s) + assert not self.q("~tcp", s) + def test_asset(self): s = self.resp() assert not self.q("~a", s) @@ -258,6 +263,11 @@ class TestMatchingTCPFlow: def q(self, q, o): return filt.parse(q)(o) + def test_tcp(self): + f = self.flow() + assert self.q("~tcp", f) + assert not self.q("~http", f) + def test_ferr(self): e = self.err() assert self.q("~e", e)