diff options
author | Maximilian Hils <git@maximilianhils.com> | 2016-12-19 19:04:45 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-12-19 19:04:45 +0100 |
commit | 77cd9224f943c8d08a7b80595e194a60b8e64d3e (patch) | |
tree | 1ae09ccb748775d6121fec70670dffb0ca8928e3 | |
parent | fc5783c20e86122ca687aa41b00ca29bc852cc0c (diff) | |
parent | fbce37054fa289eb5d7a9c791db9d4a71b96ecea (diff) | |
download | mitmproxy-77cd9224f943c8d08a7b80595e194a60b8e64d3e.tar.gz mitmproxy-77cd9224f943c8d08a7b80595e194a60b8e64d3e.tar.bz2 mitmproxy-77cd9224f943c8d08a7b80595e194a60b8e64d3e.zip |
Merge pull request #1880 from mhils/1877
Fix #1877
-rw-r--r-- | mitmproxy/net/http/message.py | 6 | ||||
-rw-r--r-- | test/mitmproxy/net/http/test_message.py | 9 |
2 files changed, 14 insertions, 1 deletions
diff --git a/mitmproxy/net/http/message.py b/mitmproxy/net/http/message.py index d3d6898d..166f919a 100644 --- a/mitmproxy/net/http/message.py +++ b/mitmproxy/net/http/message.py @@ -103,7 +103,11 @@ class Message(serializable.Serializable): ce = self.headers.get("content-encoding") if ce: try: - return encoding.decode(self.raw_content, ce) + content = encoding.decode(self.raw_content, ce) + # A client may illegally specify a byte -> str encoding here (e.g. utf8) + if isinstance(content, str): + raise ValueError("Invalid Content-Encoding: {}".format(ce)) + return content except ValueError: if strict: raise diff --git a/test/mitmproxy/net/http/test_message.py b/test/mitmproxy/net/http/test_message.py index 69d029d9..a001e734 100644 --- a/test/mitmproxy/net/http/test_message.py +++ b/test/mitmproxy/net/http/test_message.py @@ -141,6 +141,15 @@ class TestMessageContentEncoding: assert r.headers["content-encoding"] assert r.get_content(strict=False) == b"foo" + def test_utf8_as_ce(self): + r = tutils.tresp() + r.headers["content-encoding"] = "utf8" + r.raw_content = b"foo" + with tutils.raises(ValueError): + assert r.content + assert r.headers["content-encoding"] + assert r.get_content(strict=False) == b"foo" + def test_cannot_decode(self): r = tutils.tresp() r.encode("gzip") |