diff options
author | Maximilian Hils <git@maximilianhils.com> | 2015-09-11 15:31:25 +0200 |
---|---|---|
committer | Maximilian Hils <git@maximilianhils.com> | 2015-09-11 15:31:25 +0200 |
commit | 02d80631dc1efcc1ef7d25b21c40c2327a32f49b (patch) | |
tree | fb04081aedb8e1cbd6529b95e46a659222f4f587 /test/test_contentview.py | |
parent | dd414e485212e3cab612a66d5d858c1a766ace04 (diff) | |
parent | 47602dc1a5949a41535bc562adb83279f33f0b73 (diff) | |
download | mitmproxy-02d80631dc1efcc1ef7d25b21c40c2327a32f49b.tar.gz mitmproxy-02d80631dc1efcc1ef7d25b21c40c2327a32f49b.tar.bz2 mitmproxy-02d80631dc1efcc1ef7d25b21c40c2327a32f49b.zip |
Merge pull request #764 from mitmproxy/contentviews
Extract Content Views from Console
Diffstat (limited to 'test/test_contentview.py')
-rw-r--r-- | test/test_contentview.py | 266 |
1 files changed, 266 insertions, 0 deletions
diff --git a/test/test_contentview.py b/test/test_contentview.py new file mode 100644 index 00000000..ec1b4930 --- /dev/null +++ b/test/test_contentview.py @@ -0,0 +1,266 @@ +from libmproxy.exceptions import ContentViewException +from netlib.http import Headers + +import sys + +import netlib.utils +from netlib import encoding + +import libmproxy.contentview as cv +import tutils + +try: + import pyamf +except ImportError: + pyamf = None + +try: + import cssutils +except: + cssutils = None + + +class TestContentView: + def test_trailer(self): + txt = "X"*10 + lines = cv.trailer(txt, 1000) + assert not list(lines) + lines = cv.trailer(txt, 5) + assert list(lines) + + def test_view_auto(self): + v = cv.ViewAuto() + f = v( + Headers(), + "foo", + 1000 + ) + assert f[0] == "Raw" + + f = v( + Headers(content_type="text/html"), + "<html></html>", + 1000 + ) + assert f[0] == "HTML" + + f = v( + Headers(content_type="text/flibble"), + "foo", + 1000 + ) + assert f[0] == "Raw" + + f = v( + Headers(content_type="text/flibble"), + "<xml></xml>", + 1000 + ) + assert f[0].startswith("XML") + + def test_view_urlencoded(self): + d = netlib.utils.urlencode([("one", "two"), ("three", "four")]) + v = cv.ViewURLEncoded() + assert v([], d, 100) + d = netlib.utils.urlencode([("adsfa", "")]) + v = cv.ViewURLEncoded() + assert v([], d, 100) + + def test_view_html(self): + v = cv.ViewHTML() + s = "<html><br><br></br><p>one</p></html>" + assert v([], s, 1000) + + s = "gobbledygook" + assert not v([], s, 1000) + + def test_view_html_outline(self): + v = cv.ViewHTMLOutline() + s = "<html><br><br></br><p>one</p></html>" + assert v([], s, 1000) + + def test_view_json(self): + cv.VIEW_CUTOFF = 100 + v = cv.ViewJSON() + assert v([], "{}", 1000) + assert not v([], "{", 1000) + assert v([], "[" + ",".join(["0"] * cv.VIEW_CUTOFF) + "]", 1000) + assert v([], "[1, 2, 3, 4, 5]", 5) + + def test_view_xml(self): + v = cv.ViewXML() + assert v([], "<foo></foo>", 1000) + assert not v([], "<foo>", 1000) + s = """<?xml version="1.0" encoding="UTF-8"?> + <?xml-stylesheet title="XSL_formatting"?> + <rss + xmlns:media="http://search.yahoo.com/mrss/" + xmlns:atom="http://www.w3.org/2005/Atom" + version="2.0"> + </rss> + """ + assert v([], s, 1000) + + def test_view_raw(self): + v = cv.ViewRaw() + assert v([], "foo", 1000) + + def test_view_javascript(self): + v = cv.ViewJavaScript() + assert v([], "[1, 2, 3]", 100) + assert v([], "[1, 2, 3", 100) + assert v([], "function(a){[1, 2, 3]}", 100) + + def test_view_css(self): + v = cv.ViewCSS() + + with open(tutils.test_data.path('data/1.css'), 'r') as fp: + fixture_1 = fp.read() + + result = v([], 'a', 100) + + if cssutils: + assert len(list(result[1])) == 0 + else: + assert len(list(result[1])) == 1 + + result = v([], fixture_1, 100) + + if cssutils: + assert len(list(result[1])) > 1 + else: + assert len(list(result[1])) == 1 + + def test_view_hex(self): + v = cv.ViewHex() + assert v([], "foo", 1000) + + def test_view_image(self): + v = cv.ViewImage() + p = tutils.test_data.path("data/image.png") + assert v([], file(p, "rb").read(), sys.maxsize) + + p = tutils.test_data.path("data/image.gif") + assert v([], file(p, "rb").read(), sys.maxsize) + + p = tutils.test_data.path("data/image-err1.jpg") + assert v([], file(p, "rb").read(), sys.maxsize) + + p = tutils.test_data.path("data/image.ico") + assert v([], file(p, "rb").read(), sys.maxsize) + + assert not v([], "flibble", sys.maxsize) + + def test_view_multipart(self): + view = cv.ViewMultipart() + v = """ +--AaB03x +Content-Disposition: form-data; name="submit-name" + +Larry +--AaB03x + """.strip() + h = Headers(content_type="multipart/form-data; boundary=AaB03x") + assert view(h, v, 1000) + + h = Headers() + assert not view(h, v, 1000) + + h = Headers(content_type="multipart/form-data") + assert not view(h, v, 1000) + + h = Headers(content_type="unparseable") + assert not view(h, v, 1000) + + def test_get_content_view(self): + r = cv.get_content_view( + cv.get("Raw"), + Headers(content_type="application/json"), + "[1, 2, 3]", + 1000, + False + ) + assert "Raw" in r[0] + + r = cv.get_content_view( + cv.get("Auto"), + Headers(content_type="application/json"), + "[1, 2, 3]", + 1000, + False + ) + assert r[0] == "JSON" + + r = cv.get_content_view( + cv.get("Auto"), + Headers(content_type="application/json"), + "[1, 2", + 1000, + False + ) + assert "Raw" in r[0] + + tutils.raises( + ContentViewException, + cv.get_content_view, + cv.get("AMF"), + Headers(), + "[1, 2", + 1000, + False + ) + + r = cv.get_content_view( + cv.get("Auto"), + Headers( + content_type="application/json", + content_encoding="gzip" + ), + encoding.encode('gzip', "[1, 2, 3]"), + 1000, + False + ) + assert "decoded gzip" in r[0] + assert "JSON" in r[0] + + r = cv.get_content_view( + cv.get("XML"), + Headers( + content_type="application/json", + content_encoding="gzip" + ), + encoding.encode('gzip', "[1, 2, 3]"), + 1000, + False + ) + assert "decoded gzip" in r[0] + assert "Raw" in r[0] + + +if pyamf: + def test_view_amf_request(): + v = cv.ViewAMF() + + p = tutils.test_data.path("data/amf01") + assert v([], file(p, "rb").read(), sys.maxsize) + + p = tutils.test_data.path("data/amf02") + assert v([], file(p, "rb").read(), sys.maxsize) + + def test_view_amf_response(): + v = cv.ViewAMF() + p = tutils.test_data.path("data/amf03") + assert v([], file(p, "rb").read(), sys.maxsize) + +if cv.ViewProtobuf.is_available(): + def test_view_protobuf_request(): + v = cv.ViewProtobuf() + + p = tutils.test_data.path("data/protobuf01") + content_type, output = v([], file(p, "rb").read(), sys.maxsize) + assert content_type == "Protobuf" + assert output[0].text == '1: "3bbc333c-e61c-433b-819a-0b9a8cc103b8"' + + +def test_get_by_shortcut(): + assert cv.get_by_shortcut("h") |