2013-06-17 14:48:06 +00:00
|
|
|
import os
|
|
|
|
from nose.plugins.skip import SkipTest
|
2015-09-05 18:45:58 +00:00
|
|
|
from netlib.http import Headers
|
|
|
|
|
2013-06-17 14:48:06 +00:00
|
|
|
if os.name == "nt":
|
|
|
|
raise SkipTest("Skipped on Windows.")
|
2012-04-08 07:23:05 +00:00
|
|
|
import sys
|
2015-04-13 23:58:10 +00:00
|
|
|
|
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-02 18:28:25 +00:00
|
|
|
import libmproxy.contentview as cv
|
2015-08-01 12:53:34 +00:00
|
|
|
from libmproxy import utils, flow
|
2012-06-09 01:42:43 +00:00
|
|
|
import tutils
|
2012-03-24 01:02:41 +00:00
|
|
|
|
2012-11-26 00:25:07 +00:00
|
|
|
try:
|
|
|
|
import pyamf
|
|
|
|
except ImportError:
|
|
|
|
pyamf = None
|
|
|
|
|
2014-01-04 03:06:42 +00:00
|
|
|
try:
|
|
|
|
import cssutils
|
|
|
|
except:
|
|
|
|
cssutils = None
|
|
|
|
|
2012-11-26 00:25:07 +00:00
|
|
|
|
2012-06-09 01:42:43 +00:00
|
|
|
class TestContentView:
|
2012-03-24 01:02:41 +00:00
|
|
|
def test_trailer(self):
|
|
|
|
txt = []
|
2012-04-08 07:23:05 +00:00
|
|
|
cv.trailer(5, txt, 1000)
|
2012-03-24 01:02:41 +00:00
|
|
|
assert not txt
|
2012-04-08 07:23:05 +00:00
|
|
|
cv.trailer(cv.VIEW_CUTOFF + 10, txt, cv.VIEW_CUTOFF)
|
2012-03-24 01:02:41 +00:00
|
|
|
assert txt
|
2012-03-24 21:56:45 +00:00
|
|
|
|
2012-08-18 05:29:29 +00:00
|
|
|
def test_view_auto(self):
|
|
|
|
v = cv.ViewAuto()
|
|
|
|
f = v(
|
2015-09-05 18:45:58 +00:00
|
|
|
Headers(),
|
2015-05-30 00:03:28 +00:00
|
|
|
"foo",
|
|
|
|
1000
|
|
|
|
)
|
2012-08-18 05:29:29 +00:00
|
|
|
assert f[0] == "Raw"
|
2012-03-24 01:02:41 +00:00
|
|
|
|
2012-08-18 05:29:29 +00:00
|
|
|
f = v(
|
2015-09-05 18:45:58 +00:00
|
|
|
Headers(content_type="text/html"),
|
2015-05-30 00:03:28 +00:00
|
|
|
"<html></html>",
|
|
|
|
1000
|
|
|
|
)
|
2012-08-18 05:29:29 +00:00
|
|
|
assert f[0] == "HTML"
|
2012-03-24 01:02:41 +00:00
|
|
|
|
2012-08-18 05:29:29 +00:00
|
|
|
f = v(
|
2015-09-05 18:45:58 +00:00
|
|
|
Headers(content_type="text/flibble"),
|
2015-05-30 00:03:28 +00:00
|
|
|
"foo",
|
|
|
|
1000
|
|
|
|
)
|
2012-08-18 05:29:29 +00:00
|
|
|
assert f[0] == "Raw"
|
2012-03-24 01:02:41 +00:00
|
|
|
|
2012-08-18 05:29:29 +00:00
|
|
|
f = v(
|
2015-09-05 18:45:58 +00:00
|
|
|
Headers(content_type="text/flibble"),
|
2015-05-30 00:03:28 +00:00
|
|
|
"<xml></xml>",
|
|
|
|
1000
|
|
|
|
)
|
2012-08-18 05:29:29 +00:00
|
|
|
assert f[0].startswith("XML")
|
2012-08-17 06:27:47 +00:00
|
|
|
|
2012-03-24 01:02:41 +00:00
|
|
|
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()
|
|
|
|
assert v([], d, 100)
|
2015-08-01 08:40:19 +00:00
|
|
|
d = netlib.utils.urlencode([("adsfa", "")])
|
2013-02-11 02:22:25 +00:00
|
|
|
v = cv.ViewURLEncoded()
|
|
|
|
assert v([], d, 100)
|
2012-03-24 01:02:41 +00:00
|
|
|
|
2012-04-07 01:47:03 +00:00
|
|
|
def test_view_html(self):
|
2012-08-18 05:08:17 +00:00
|
|
|
v = cv.ViewHTML()
|
2012-04-07 01:47:03 +00:00
|
|
|
s = "<html><br><br></br><p>one</p></html>"
|
2012-08-18 05:08:17 +00:00
|
|
|
assert v([], s, 1000)
|
2012-04-07 01:47:03 +00:00
|
|
|
|
|
|
|
s = "gobbledygook"
|
2012-08-18 05:08:17 +00:00
|
|
|
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)
|
2012-04-07 01:47:03 +00:00
|
|
|
|
2012-03-24 01:02:41 +00:00
|
|
|
def test_view_json(self):
|
|
|
|
cv.VIEW_CUTOFF = 100
|
2012-08-18 05:08:17 +00:00
|
|
|
v = cv.ViewJSON()
|
|
|
|
assert v([], "{}", 1000)
|
|
|
|
assert not v([], "{", 1000)
|
2015-05-30 00:03:28 +00:00
|
|
|
assert v([], "[" + ",".join(["0"] * cv.VIEW_CUTOFF) + "]", 1000)
|
2012-08-18 05:08:17 +00:00
|
|
|
assert v([], "[1, 2, 3, 4, 5]", 5)
|
2012-03-24 01:02:41 +00:00
|
|
|
|
2012-04-07 01:47:03 +00:00
|
|
|
def test_view_xml(self):
|
2012-08-18 05:08:17 +00:00
|
|
|
v = cv.ViewXML()
|
|
|
|
assert v([], "<foo></foo>", 1000)
|
|
|
|
assert not v([], "<foo>", 1000)
|
2012-04-07 01:47:03 +00:00
|
|
|
s = """<?xml version="1.0" encoding="UTF-8"?>
|
|
|
|
<?xml-stylesheet title="XSL_formatting"?>
|
2012-04-07 10:15:31 +00:00
|
|
|
<rss
|
2012-04-07 01:47:03 +00:00
|
|
|
xmlns:media="http://search.yahoo.com/mrss/"
|
|
|
|
xmlns:atom="http://www.w3.org/2005/Atom"
|
|
|
|
version="2.0">
|
|
|
|
</rss>
|
|
|
|
"""
|
2012-08-18 05:08:17 +00:00
|
|
|
assert v([], s, 1000)
|
2012-03-24 01:02:41 +00:00
|
|
|
|
|
|
|
def test_view_raw(self):
|
2012-08-18 05:08:17 +00:00
|
|
|
v = cv.ViewRaw()
|
|
|
|
assert v([], "foo", 1000)
|
2012-03-24 01:02:41 +00:00
|
|
|
|
2012-03-24 21:56:45 +00:00
|
|
|
def test_view_javascript(self):
|
2012-08-18 05:08:17 +00:00
|
|
|
v = cv.ViewJavaScript()
|
|
|
|
assert v([], "[1, 2, 3]", 100)
|
|
|
|
assert v([], "[1, 2, 3", 100)
|
|
|
|
assert v([], "function(a){[1, 2, 3]}", 100)
|
2012-03-24 21:56:45 +00:00
|
|
|
|
2014-01-04 03:06:42 +00:00
|
|
|
def test_view_css(self):
|
|
|
|
v = cv.ViewCSS()
|
|
|
|
|
2014-03-05 04:25:12 +00:00
|
|
|
with open(tutils.test_data.path('data/1.css'), 'r') as fp:
|
2014-01-04 03:06:42 +00:00
|
|
|
fixture_1 = fp.read()
|
|
|
|
|
|
|
|
result = v([], 'a', 100)
|
|
|
|
|
|
|
|
if cssutils:
|
|
|
|
assert len(result[1]) == 0
|
|
|
|
else:
|
|
|
|
assert len(result[1]) == 1
|
|
|
|
|
|
|
|
result = v([], fixture_1, 100)
|
|
|
|
|
|
|
|
if cssutils:
|
|
|
|
assert len(result[1]) > 1
|
|
|
|
else:
|
|
|
|
assert len(result[1]) == 1
|
|
|
|
|
2012-04-08 07:23:05 +00:00
|
|
|
def test_view_hex(self):
|
2012-08-18 05:08:17 +00:00
|
|
|
v = cv.ViewHex()
|
|
|
|
assert v([], "foo", 1000)
|
2012-03-24 01:02:41 +00:00
|
|
|
|
2012-03-25 22:26:02 +00:00
|
|
|
def test_view_image(self):
|
2012-08-18 05:08:17 +00:00
|
|
|
v = cv.ViewImage()
|
2012-06-09 01:42:43 +00:00
|
|
|
p = tutils.test_data.path("data/image.png")
|
2015-05-30 00:03:28 +00:00
|
|
|
assert v([], file(p, "rb").read(), sys.maxsize)
|
2012-06-09 01:42:43 +00:00
|
|
|
|
|
|
|
p = tutils.test_data.path("data/image.gif")
|
2015-05-30 00:03:28 +00:00
|
|
|
assert v([], file(p, "rb").read(), sys.maxsize)
|
2012-06-09 01:42:43 +00:00
|
|
|
|
|
|
|
p = tutils.test_data.path("data/image-err1.jpg")
|
2015-05-30 00:03:28 +00:00
|
|
|
assert v([], file(p, "rb").read(), sys.maxsize)
|
2012-06-09 01:42:43 +00:00
|
|
|
|
|
|
|
p = tutils.test_data.path("data/image.ico")
|
2015-05-30 00:03:28 +00:00
|
|
|
assert v([], file(p, "rb").read(), sys.maxsize)
|
2012-06-09 01:42:43 +00:00
|
|
|
|
2015-05-30 00:03:28 +00:00
|
|
|
assert not v([], "flibble", sys.maxsize)
|
2012-03-25 22:26:02 +00:00
|
|
|
|
2012-03-24 21:10:48 +00:00
|
|
|
def test_view_multipart(self):
|
2012-08-18 05:08:17 +00:00
|
|
|
view = cv.ViewMultipart()
|
2012-03-24 21:10:48 +00:00
|
|
|
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")
|
2012-08-18 05:08:17 +00:00
|
|
|
assert view(h, v, 1000)
|
2012-03-24 21:10:48 +00:00
|
|
|
|
2015-09-05 18:53:44 +00:00
|
|
|
h = Headers()
|
2012-08-18 05:08:17 +00:00
|
|
|
assert not view(h, v, 1000)
|
2012-03-24 21:10:48 +00:00
|
|
|
|
2015-09-05 18:53:44 +00:00
|
|
|
h = Headers(content_type="multipart/form-data")
|
2012-08-18 05:08:17 +00:00
|
|
|
assert not view(h, v, 1000)
|
2012-03-24 21:10:48 +00:00
|
|
|
|
2015-09-05 18:53:44 +00:00
|
|
|
h = Headers(content_type="unparseable")
|
2012-08-18 05:08:17 +00:00
|
|
|
assert not view(h, v, 1000)
|
2012-03-24 21:10:48 +00:00
|
|
|
|
2012-03-24 01:02:41 +00:00
|
|
|
def test_get_content_view(self):
|
|
|
|
r = cv.get_content_view(
|
2015-05-30 00:03:28 +00:00
|
|
|
cv.get("Raw"),
|
2015-09-05 18:45:58 +00:00
|
|
|
Headers(content_type="application/json"),
|
2015-05-30 00:03:28 +00:00
|
|
|
"[1, 2, 3]",
|
|
|
|
1000,
|
|
|
|
False
|
|
|
|
)
|
2012-04-01 22:30:35 +00:00
|
|
|
assert "Raw" in r[0]
|
2012-03-24 01:02:41 +00:00
|
|
|
|
|
|
|
r = cv.get_content_view(
|
2015-05-30 00:03:28 +00:00
|
|
|
cv.get("Auto"),
|
2015-09-05 18:45:58 +00:00
|
|
|
Headers(content_type="application/json"),
|
2015-05-30 00:03:28 +00:00
|
|
|
"[1, 2, 3]",
|
|
|
|
1000,
|
|
|
|
False
|
|
|
|
)
|
2012-03-24 01:02:41 +00:00
|
|
|
assert r[0] == "JSON"
|
|
|
|
|
|
|
|
r = cv.get_content_view(
|
2015-05-30 00:03:28 +00:00
|
|
|
cv.get("Auto"),
|
2015-09-05 18:45:58 +00:00
|
|
|
Headers(content_type="application/json"),
|
2015-05-30 00:03:28 +00:00
|
|
|
"[1, 2",
|
|
|
|
1000,
|
|
|
|
False
|
|
|
|
)
|
2012-04-02 01:24:51 +00:00
|
|
|
assert "Raw" in r[0]
|
2012-03-24 01:02:41 +00:00
|
|
|
|
2012-08-18 05:42:40 +00:00
|
|
|
r = cv.get_content_view(
|
2015-05-30 00:03:28 +00:00
|
|
|
cv.get("AMF"),
|
2015-09-05 18:45:58 +00:00
|
|
|
Headers(),
|
2015-05-30 00:03:28 +00:00
|
|
|
"[1, 2",
|
|
|
|
1000,
|
|
|
|
False
|
|
|
|
)
|
2012-08-18 05:42:40 +00:00
|
|
|
assert "Raw" in r[0]
|
|
|
|
|
2012-03-24 01:02:41 +00:00
|
|
|
r = cv.get_content_view(
|
2015-05-30 00:03:28 +00:00
|
|
|
cv.get("Auto"),
|
2015-09-05 18:45:58 +00:00
|
|
|
Headers(
|
|
|
|
content_type="application/json",
|
|
|
|
content_encoding="gzip"
|
|
|
|
),
|
2015-05-30 00:03:28 +00:00
|
|
|
encoding.encode('gzip', "[1, 2, 3]"),
|
|
|
|
1000,
|
|
|
|
False
|
|
|
|
)
|
2012-03-24 01:02:41 +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-05 18:45:58 +00:00
|
|
|
Headers(
|
|
|
|
content_type="application/json",
|
|
|
|
content_encoding="gzip"
|
|
|
|
),
|
2015-05-30 00:03:28 +00:00
|
|
|
encoding.encode('gzip', "[1, 2, 3]"),
|
|
|
|
1000,
|
|
|
|
False
|
|
|
|
)
|
2012-03-24 01:02:41 +00:00
|
|
|
assert "decoded gzip" in r[0]
|
2012-04-07 10:15:31 +00:00
|
|
|
assert "Raw" in r[0]
|
2012-03-24 01:02:41 +00:00
|
|
|
|
2012-08-18 05:29:29 +00:00
|
|
|
|
2012-11-26 00:25:07 +00:00
|
|
|
if pyamf:
|
|
|
|
def test_view_amf_request():
|
|
|
|
v = cv.ViewAMF()
|
|
|
|
|
|
|
|
p = tutils.test_data.path("data/amf01")
|
2015-05-30 00:03:28 +00:00
|
|
|
assert v([], file(p, "rb").read(), sys.maxsize)
|
2012-11-26 00:25:07 +00:00
|
|
|
|
|
|
|
p = tutils.test_data.path("data/amf02")
|
2015-05-30 00:03:28 +00:00
|
|
|
assert v([], file(p, "rb").read(), sys.maxsize)
|
2012-11-26 00:25:07 +00:00
|
|
|
|
|
|
|
def test_view_amf_response():
|
|
|
|
v = cv.ViewAMF()
|
|
|
|
p = tutils.test_data.path("data/amf03")
|
2015-05-30 00:03:28 +00:00
|
|
|
assert v([], file(p, "rb").read(), sys.maxsize)
|
2012-11-26 00:25:07 +00:00
|
|
|
|
2013-04-06 18:18:12 +00:00
|
|
|
if cv.ViewProtobuf.is_available():
|
|
|
|
def test_view_protobuf_request():
|
|
|
|
v = cv.ViewProtobuf()
|
|
|
|
|
|
|
|
p = tutils.test_data.path("data/protobuf01")
|
2015-05-30 00:03:28 +00:00
|
|
|
content_type, output = v([], file(p, "rb").read(), sys.maxsize)
|
2013-04-06 18:18:12 +00:00
|
|
|
assert content_type == "Protobuf"
|
|
|
|
assert output[0].text == '1: "3bbc333c-e61c-433b-819a-0b9a8cc103b8"'
|
2012-11-26 00:25:07 +00:00
|
|
|
|
2015-05-30 00:03:28 +00:00
|
|
|
|
2012-08-18 05:29:29 +00:00
|
|
|
def test_get_by_shortcut():
|
|
|
|
assert cv.get_by_shortcut("h")
|