mitmproxy/test/test_contentview.py

256 lines
6.3 KiB
Python
Raw Normal View History

2015-09-11 11:37:52 +00:00
from libmproxy.exceptions import ContentViewException
2015-09-05 18:45:58 +00:00
from netlib.http import Headers
2015-08-01 08:40:19 +00:00
import netlib.utils
2015-09-05 18:45:58 +00:00
from netlib import encoding
2015-08-01 08:40:19 +00:00
2015-09-12 11:49:16 +00:00
import libmproxy.contentviews as cv
2016-02-02 12:25:31 +00:00
from . import tutils
try:
import pyamf
except ImportError:
pyamf = None
try:
import cssutils
except:
cssutils = None
class TestContentView:
def test_view_auto(self):
v = cv.ViewAuto()
f = v(
2015-05-30 00:03:28 +00:00
"foo",
2015-09-12 15:40:30 +00:00
headers=Headers()
2015-05-30 00:03:28 +00:00
)
assert f[0] == "Raw"
f = v(
2015-05-30 00:03:28 +00:00
"<html></html>",
2015-09-12 15:40:30 +00:00
headers=Headers(content_type="text/html")
2015-05-30 00:03:28 +00:00
)
assert f[0] == "HTML"
f = v(
2015-05-30 00:03:28 +00:00
"foo",
2015-09-12 15:40:30 +00:00
headers=Headers(content_type="text/flibble")
2015-05-30 00:03:28 +00:00
)
assert f[0] == "Raw"
f = v(
2015-05-30 00:03:28 +00:00
"<xml></xml>",
2015-09-12 15:40:30 +00:00
headers=Headers(content_type="text/flibble")
2015-05-30 00:03:28 +00:00
)
assert f[0].startswith("XML")
def test_view_urlencoded(self):
2015-08-01 08:40:19 +00:00
d = netlib.utils.urlencode([("one", "two"), ("three", "four")])
2012-08-18 05:08:17 +00:00
v = cv.ViewURLEncoded()
2015-09-12 15:40:30 +00:00
assert v(d)
2015-08-01 08:40:19 +00:00
d = netlib.utils.urlencode([("adsfa", "")])
v = cv.ViewURLEncoded()
2015-09-12 15:40:30 +00:00
assert v(d)
def test_view_html(self):
2012-08-18 05:08:17 +00:00
v = cv.ViewHTML()
s = "<html><br><br></br><p>one</p></html>"
2015-09-12 15:40:30 +00:00
assert v(s)
s = "gobbledygook"
2015-09-12 15:40:30 +00:00
assert not v(s)
2012-08-18 05:08:17 +00:00
def test_view_html_outline(self):
v = cv.ViewHTMLOutline()
s = "<html><br><br></br><p>one</p></html>"
2015-09-12 15:40:30 +00:00
assert v(s)
def test_view_json(self):
cv.VIEW_CUTOFF = 100
2012-08-18 05:08:17 +00:00
v = cv.ViewJSON()
2015-09-12 15:40:30 +00:00
assert v("{}")
assert not v("{")
assert v("[1, 2, 3, 4, 5]")
def test_view_xml(self):
2012-08-18 05:08:17 +00:00
v = cv.ViewXML()
2015-09-12 15:40:30 +00:00
assert v("<foo></foo>")
assert not v("<foo>")
s = """<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet title="XSL_formatting"?>
2012-04-07 10:15:31 +00:00
<rss
xmlns:media="http://search.yahoo.com/mrss/"
xmlns:atom="http://www.w3.org/2005/Atom"
version="2.0">
</rss>
"""
2015-09-12 15:40:30 +00:00
assert v(s)
def test_view_raw(self):
2012-08-18 05:08:17 +00:00
v = cv.ViewRaw()
2015-09-12 15:40:30 +00:00
assert v("foo")
def test_view_javascript(self):
2012-08-18 05:08:17 +00:00
v = cv.ViewJavaScript()
2015-09-12 15:40:30 +00:00
assert v("[1, 2, 3]")
assert v("[1, 2, 3")
assert v("function(a){[1, 2, 3]}")
def test_view_css(self):
v = cv.ViewCSS()
with open(tutils.test_data.path('data/1.css'), 'r') as fp:
fixture_1 = fp.read()
2015-09-12 15:40:30 +00:00
result = v('a')
if cssutils:
2015-09-11 11:37:52 +00:00
assert len(list(result[1])) == 0
else:
2015-09-11 11:37:52 +00:00
assert len(list(result[1])) == 1
2015-09-12 15:40:30 +00:00
result = v(fixture_1)
if cssutils:
2015-09-11 11:37:52 +00:00
assert len(list(result[1])) > 1
else:
2015-09-11 11:37:52 +00:00
assert len(list(result[1])) == 1
def test_view_hex(self):
2012-08-18 05:08:17 +00:00
v = cv.ViewHex()
2015-09-12 15:40:30 +00:00
assert v("foo")
def test_view_image(self):
2012-08-18 05:08:17 +00:00
v = cv.ViewImage()
p = tutils.test_data.path("data/image.png")
2015-09-12 15:40:30 +00:00
assert v(file(p, "rb").read())
p = tutils.test_data.path("data/image.gif")
2015-09-12 15:40:30 +00:00
assert v(file(p, "rb").read())
p = tutils.test_data.path("data/image-err1.jpg")
2015-09-12 15:40:30 +00:00
assert v(file(p, "rb").read())
p = tutils.test_data.path("data/image.ico")
2015-09-12 15:40:30 +00:00
assert v(file(p, "rb").read())
2015-09-12 15:40:30 +00:00
assert not v("flibble")
def test_view_multipart(self):
2012-08-18 05:08:17 +00:00
view = cv.ViewMultipart()
v = """
--AaB03x
Content-Disposition: form-data; name="submit-name"
Larry
--AaB03x
""".strip()
2015-09-05 18:53:44 +00:00
h = Headers(content_type="multipart/form-data; boundary=AaB03x")
2015-09-12 15:40:30 +00:00
assert view(v, headers=h)
2015-09-05 18:53:44 +00:00
h = Headers()
2015-09-12 15:40:30 +00:00
assert not view(v, headers=h)
2015-09-05 18:53:44 +00:00
h = Headers(content_type="multipart/form-data")
2015-09-12 15:40:30 +00:00
assert not view(v, headers=h)
2015-09-05 18:53:44 +00:00
h = Headers(content_type="unparseable")
2015-09-12 15:40:30 +00:00
assert not view(v, headers=h)
def test_get_content_view(self):
r = cv.get_content_view(
2015-05-30 00:03:28 +00:00
cv.get("Raw"),
"[1, 2, 3]",
2015-09-12 15:40:30 +00:00
headers=Headers(content_type="application/json")
2015-05-30 00:03:28 +00:00
)
assert "Raw" in r[0]
r = cv.get_content_view(
2015-05-30 00:03:28 +00:00
cv.get("Auto"),
"[1, 2, 3]",
2015-09-12 15:40:30 +00:00
headers=Headers(content_type="application/json")
2015-05-30 00:03:28 +00:00
)
assert r[0] == "JSON"
r = cv.get_content_view(
2015-05-30 00:03:28 +00:00
cv.get("Auto"),
"[1, 2",
2015-09-12 15:40:30 +00:00
headers=Headers(content_type="application/json")
2015-05-30 00:03:28 +00:00
)
assert "Raw" in r[0]
2015-09-11 11:37:52 +00:00
tutils.raises(
ContentViewException,
cv.get_content_view,
2015-05-30 00:03:28 +00:00
cv.get("AMF"),
"[1, 2",
2015-09-12 15:40:30 +00:00
headers=Headers()
2015-05-30 00:03:28 +00:00
)
r = cv.get_content_view(
2015-05-30 00:03:28 +00:00
cv.get("Auto"),
2015-09-12 15:40:30 +00:00
encoding.encode('gzip', "[1, 2, 3]"),
headers=Headers(
2015-09-05 18:45:58 +00:00
content_type="application/json",
content_encoding="gzip"
2015-09-12 15:40:30 +00:00
)
2015-05-30 00:03:28 +00:00
)
assert "decoded gzip" in r[0]
assert "JSON" in r[0]
r = cv.get_content_view(
2015-05-30 00:03:28 +00:00
cv.get("XML"),
2015-09-12 15:40:30 +00:00
encoding.encode('gzip', "[1, 2, 3]"),
headers=Headers(
2015-09-05 18:45:58 +00:00
content_type="application/json",
content_encoding="gzip"
2015-09-12 15:40:30 +00:00
)
2015-05-30 00:03:28 +00:00
)
assert "decoded gzip" in r[0]
2012-04-07 10:15:31 +00:00
assert "Raw" in r[0]
2015-11-09 16:06:16 +00:00
def test_add_cv(self):
class TestContentView(cv.View):
name = "test"
2015-11-13 21:55:27 +00:00
prompt = ("t", "test")
2015-11-09 16:06:16 +00:00
tcv = TestContentView()
cv.add(tcv)
# repeated addition causes exception
2015-11-09 16:06:16 +00:00
tutils.raises(
ContentViewException,
cv.add,
tcv
)
if pyamf:
def test_view_amf_request():
v = cv.ViewAMF()
p = tutils.test_data.path("data/amf01")
2015-09-12 15:40:30 +00:00
assert v(file(p, "rb").read())
p = tutils.test_data.path("data/amf02")
2015-09-12 15:40:30 +00:00
assert v(file(p, "rb").read())
def test_view_amf_response():
v = cv.ViewAMF()
p = tutils.test_data.path("data/amf03")
2015-09-12 15:40:30 +00:00
assert v(file(p, "rb").read())
if cv.ViewProtobuf.is_available():
def test_view_protobuf_request():
v = cv.ViewProtobuf()
p = tutils.test_data.path("data/protobuf01")
2015-09-12 15:40:30 +00:00
content_type, output = v(file(p, "rb").read())
assert content_type == "Protobuf"
2015-11-06 16:18:48 +00:00
assert output.next()[0][1] == '1: "3bbc333c-e61c-433b-819a-0b9a8cc103b8"'
2015-05-30 00:03:28 +00:00
def test_get_by_shortcut():
assert cv.get_by_shortcut("h")