aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaximilian Hils <git@maximilianhils.com>2014-08-03 02:34:29 +0200
committerMaximilian Hils <git@maximilianhils.com>2014-08-03 02:34:29 +0200
commit3133136da763107172b1464b777362b7b7f8e54e (patch)
tree4c500fcae39b4922679fe6bc10a4f81ab788eeae
parent10a6d4fbe5a910b75813edc1bf8f22eec3b8bf3c (diff)
downloadmitmproxy-3133136da763107172b1464b777362b7b7f8e54e.tar.gz
mitmproxy-3133136da763107172b1464b777362b7b7f8e54e.tar.bz2
mitmproxy-3133136da763107172b1464b777362b7b7f8e54e.zip
fix #307
-rw-r--r--libmproxy/filt.py25
-rw-r--r--libmproxy/protocol/http.py3
-rw-r--r--test/test_filt.py14
3 files changed, 30 insertions, 12 deletions
diff --git a/libmproxy/filt.py b/libmproxy/filt.py
index bd429fa3..e17ed735 100644
--- a/libmproxy/filt.py
+++ b/libmproxy/filt.py
@@ -34,6 +34,7 @@
from __future__ import absolute_import
import re, sys
from .contrib import pyparsing as pp
+from .protocol.http import decoded
class _Token:
@@ -165,10 +166,14 @@ class FBod(_Rex):
code = "b"
help = "Body"
def __call__(self, f):
- if f.request.content and re.search(self.expr, f.request.content):
- return True
- elif f.response and f.response.content and re.search(self.expr, f.response.content):
- return True
+ if f.request and f.request.content:
+ with decoded(f.request):
+ if re.search(self.expr, f.request.content):
+ return True
+ if f.response and f.response.content:
+ with decoded(f.response):
+ if re.search(self.expr, f.response.content):
+ return True
return False
@@ -176,16 +181,20 @@ class FBodRequest(_Rex):
code = "bq"
help = "Request body"
def __call__(self, f):
- if f.request.content and re.search(self.expr, f.request.content):
- return True
+ if f.request and f.request.content:
+ with decoded(f.request):
+ if re.search(self.expr, f.request.content):
+ return True
class FBodResponse(_Rex):
code = "bs"
help = "Response body"
def __call__(self, f):
- if f.response and f.response.content and re.search(self.expr, f.response.content):
- return True
+ if f.response and f.response.content:
+ with decoded(f.response):
+ if re.search(self.expr, f.response.content):
+ return True
class FMethod(_Rex):
diff --git a/libmproxy/protocol/http.py b/libmproxy/protocol/http.py
index 6837327b..aed538ef 100644
--- a/libmproxy/protocol/http.py
+++ b/libmproxy/protocol/http.py
@@ -6,7 +6,7 @@ import netlib.utils
from netlib.odict import ODict, ODictCaseless
from .primitives import KILL, ProtocolHandler, TemporaryServerChangeMixin, Flow, Error
from ..proxy.connection import ServerConnection
-from .. import encoding, utils, filt, controller, stateobject, proxy
+from .. import encoding, utils, controller, stateobject, proxy
HDR_FORM_URLENCODED = "application/x-www-form-urlencoded"
CONTENT_MISSING = 0
@@ -791,6 +791,7 @@ class HTTPFlow(Flow):
the expression is invalid, ValueError is raised.
"""
if isinstance(f, basestring):
+ from .. import filt
f = filt.parse(f)
if not f:
raise ValueError("Invalid filter expression.")
diff --git a/test/test_filt.py b/test/test_filt.py
index 452a4505..279f550f 100644
--- a/test/test_filt.py
+++ b/test/test_filt.py
@@ -171,9 +171,7 @@ class TestMatching:
assert self.q("~hs 'header_response: svalue'", s)
assert not self.q("~hs 'header: qvalue'", q)
- def test_body(self):
- q = self.req()
- s = self.resp()
+ def match_body(self, q, s):
assert not self.q("~b nonexistent", q)
assert self.q("~b content", q)
assert self.q("~b response", s)
@@ -190,6 +188,16 @@ class TestMatching:
assert not self.q("~bs response", q)
assert self.q("~bs response", s)
+ def test_body(self):
+ q = self.req()
+ s = self.resp()
+ self.match_body(q, s)
+
+ q.request.encode("gzip")
+ s.request.encode("gzip")
+ s.response.encode("gzip")
+ self.match_body(q, s)
+
def test_method(self):
q = self.req()
s = self.resp()