diff --git a/mitmproxy/contentviews/css.py b/mitmproxy/contentviews/css.py index 8fa09ed38..30a583da5 100644 --- a/mitmproxy/contentviews/css.py +++ b/mitmproxy/contentviews/css.py @@ -14,10 +14,10 @@ A custom CSS prettifier. Compared to other prettifiers, its main features are: """ CSS_SPECIAL_AREAS = ( - ("'", strutils.NO_ESCAPE + "'"), - ('"', strutils.NO_ESCAPE + '"'), - (r"/\*", r"\*/"), - ("//", "$") + "'" + strutils.SINGLELINE_CONTENT + strutils.NO_ESCAPE + "'", + '"' + strutils.SINGLELINE_CONTENT + strutils.NO_ESCAPE + '"', + r"/\*" + strutils.MULTILINE_CONTENT + "\*/", + "//" + strutils.SINGLELINE_CONTENT + "$" ) CSS_SPECIAL_CHARS = "{};:" diff --git a/mitmproxy/contentviews/javascript.py b/mitmproxy/contentviews/javascript.py index c2fab8755..1d671fe68 100644 --- a/mitmproxy/contentviews/javascript.py +++ b/mitmproxy/contentviews/javascript.py @@ -1,6 +1,47 @@ -import jsbeautifier +import io +import re -from . import base +from mitmproxy.utils import strutils +from mitmproxy.contentviews import base + +DELIMITERS = '{};\n' +SPECIAL_AREAS = ( + r"(?<=[^\w\s)])\s*/(?:[^\n/]|(? Optional[bytes]: @@ -153,11 +153,14 @@ def _restore_from_private_code_plane(matchobj): NO_ESCAPE = r"(?>> split_special_areas( >>> "test /* don't modify me */ foo", - >>> [(r"/\*", r"\*/")]) # (left delimiter regex, right delimiter regex) + >>> [r"/\*[\s\S]*?\*/"]) # (regex matching comments) ["test ", "/* don't modify me */", " foo"] "".join(split_special_areas(x, ...)) == x always holds true. """ - patterns = "|".join( - r"{lchar}[\s\S]*?{rchar}".format( - lchar=a, - rchar=b, - ) for (a, b) in area_delimiter) return re.split( - "({})".format(patterns), + "({})".format("|".join(area_delimiter)), data, flags=re.MULTILINE ) @@ -185,7 +183,7 @@ def split_special_areas( def escape_special_areas( data: str, - area_delimiter: Iterable[Tuple[str, str]], + area_delimiter: Iterable[str], control_characters, ): """ @@ -200,11 +198,11 @@ def escape_special_areas( >>> print(x) if (true) { console.log('{}'); } - >>> x = escape_special_areas(x, "{", [("'", "'")]) + >>> x = escape_special_areas(x, "{", ["'" + SINGLELINE_CONTENT + "'"]) >>> print(x) if (true) { console.log('�}'); } >>> x = re.sub(r"\s*{\s*", " {\n ", x) - >>> x = unescape_special_areas(x, "{", [("'", "'")]) + >>> x = unescape_special_areas(x) >>> print(x) if (true) { console.log('{}'); } diff --git a/release/hooks/hook-passlib.py b/release/hooks/hook-passlib.py new file mode 100644 index 000000000..4f1efbb83 --- /dev/null +++ b/release/hooks/hook-passlib.py @@ -0,0 +1 @@ +hiddenimports = ["configparser"] diff --git a/setup.cfg b/setup.cfg index 269829920..b8e129ee0 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,7 +1,7 @@ [flake8] max-line-length = 140 max-complexity = 25 -ignore = E251,C901,W503 +ignore = E251,C901,W503,W292 exclude = mitmproxy/contrib/*,test/mitmproxy/data/*,release/build/* addons = file,open,basestring,xrange,unicode,long,cmp diff --git a/setup.py b/setup.py index fefb799e9..52ab18402 100644 --- a/setup.py +++ b/setup.py @@ -68,7 +68,6 @@ setup( "h2>=3.0, <4", "html2text>=2016.1.8, <=2016.9.19", "hyperframe>=5.0, <6", - "jsbeautifier>=1.6.3, <1.7", "kaitaistruct>=0.7, <0.8", "ldap3>=2.2.0, <2.4", "passlib>=1.6.5, <1.8", diff --git a/test/mitmproxy/contentviews/test_javascript.py b/test/mitmproxy/contentviews/test_javascript.py index 43039c933..23dd106ec 100644 --- a/test/mitmproxy/contentviews/test_javascript.py +++ b/test/mitmproxy/contentviews/test_javascript.py @@ -1,10 +1,32 @@ +import pytest + from mitmproxy.contentviews import javascript +from mitmproxy.test import tutils from . import full_eval +data = tutils.test_data.push("mitmproxy/contentviews/test_js_data/") + def test_view_javascript(): v = full_eval(javascript.ViewJavaScript()) assert v(b"[1, 2, 3]") assert v(b"[1, 2, 3") - assert v(b"function(a){[1, 2, 3]}") + assert v(b"function(a){[1, 2, 3]}") == ("JavaScript", [ + [('text', 'function(a) {')], + [('text', ' [1, 2, 3]')], + [('text', '}')] + ]) assert v(b"\xfe") # invalid utf-8 + + +@pytest.mark.parametrize("filename", [ + "simple.js", +]) +def test_format_xml(filename): + path = data.path(filename) + with open(path) as f: + input = f.read() + with open("-formatted.".join(path.rsplit(".", 1))) as f: + expected = f.read() + js = javascript.beautify(input) + assert js == expected diff --git a/test/mitmproxy/contentviews/test_js_data/simple-formatted.js b/test/mitmproxy/contentviews/test_js_data/simple-formatted.js new file mode 100644 index 000000000..2b665f026 --- /dev/null +++ b/test/mitmproxy/contentviews/test_js_data/simple-formatted.js @@ -0,0 +1,68 @@ +/* _GlobalPrefix_ */ +this.gbar_=this.gbar_||{}; +(function(_) { + var window=this; + +/* _Module_:sy25 */ + try { + var Mn=function(){}; + _.y(Mn,Error); + _.Nn=function() { + this.b="pending"; + this.B=[]; + this.w=this.C=void 0 + }; + _.fe(_.Nn); + var On=function() { + _.qa.call(this,"Multiple attempts to set the state of this Result") + }; + _.y(On,_.qa); + _.Nn.prototype.ta=function() { + return this.C + }; + _.Pn=function(a,c,d) { + "pending"==a.b?a.B.push( { + hb:c,scope:d||null + } + ):c.call(d,a) + }; + _.Nn.prototype.A=function(a) { + if("pending"==this.b)this.C=a,this.b="success",Qn(this); + else if(!Rn(this))throw new On; + }; + _.Nn.prototype.o=function(a) { + if("pending"==this.b)this.w=a,this.b="error",Qn(this); + else if(!Rn(this))throw new On; + }; + var Qn=function(a) { + var c=a.B; + a.B=[]; + for(var d=0;d