From 1959aebc087db0cb3bb12546ec2671356829b482 Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Sat, 3 Jan 2015 11:46:51 +1300 Subject: Add PEG support to gulpfile - Extract conf - all project specific conf outside gulpfile - Generalize filt.js exports, add required imports --- web/src/js/filt/filt.js | 30 +++--- web/src/js/filt/filt.peg | 249 +++++++++++++++++++++++++++++++++++++++++++++ web/src/js/filt/filt.pegjs | 247 -------------------------------------------- 3 files changed, 263 insertions(+), 263 deletions(-) create mode 100644 web/src/js/filt/filt.peg delete mode 100644 web/src/js/filt/filt.pegjs (limited to 'web/src/js/filt') diff --git a/web/src/js/filt/filt.js b/web/src/js/filt/filt.js index 095081ac..78d6a67c 100644 --- a/web/src/js/filt/filt.js +++ b/web/src/js/filt/filt.js @@ -1,5 +1,4 @@ -/* jshint ignore:start */ -Filt = (function() { +module.exports = (function() { /* * Generated by PEG.js 0.8.0. * @@ -1592,6 +1591,8 @@ Filt = (function() { } + var flowutils = require("../flow/utils.js"); + function or(first, second) { // Add explicit function names to ease debugging. function orFilter() { @@ -1640,7 +1641,7 @@ Filt = (function() { ]; function assetFilter(flow) { if (flow.response) { - var ct = ResponseUtils.getContentType(flow.response); + var ct = flowutils.ResponseUtils.getContentType(flow.response); var i = ASSET_TYPES.length; while (i--) { if (ASSET_TYPES[i].test(ct)) { @@ -1674,9 +1675,9 @@ Filt = (function() { regex = new RegExp(regex, "i"); function headerFilter(flow){ return ( - (flow.request && RequestUtils.match_header(flow.request, regex)) + (flow.request && flowutils.RequestUtils.match_header(flow.request, regex)) || - (flow.response && ResponseUtils.match_header(flow.response, regex)) + (flow.response && flowutils.ResponseUtils.match_header(flow.response, regex)) ); } headerFilter.desc = "header matches " + regex; @@ -1685,7 +1686,7 @@ Filt = (function() { function requestHeader(regex){ regex = new RegExp(regex, "i"); function requestHeaderFilter(flow){ - return (flow.request && RequestUtils.match_header(flow.request, regex)); + return (flow.request && flowutils.RequestUtils.match_header(flow.request, regex)); } requestHeaderFilter.desc = "req. header matches " + regex; return requestHeaderFilter; @@ -1693,7 +1694,7 @@ Filt = (function() { function responseHeader(regex){ regex = new RegExp(regex, "i"); function responseHeaderFilter(flow){ - return (flow.response && ResponseUtils.match_header(flow.response, regex)); + return (flow.response && flowutils.ResponseUtils.match_header(flow.response, regex)); } responseHeaderFilter.desc = "resp. header matches " + regex; return responseHeaderFilter; @@ -1719,9 +1720,9 @@ Filt = (function() { regex = new RegExp(regex, "i"); function contentTypeFilter(flow){ return ( - (flow.request && regex.test(RequestUtils.getContentType(flow.request))) + (flow.request && regex.test(flowutils.RequestUtils.getContentType(flow.request))) || - (flow.response && regex.test(ResponseUtils.getContentType(flow.response))) + (flow.response && regex.test(flowutils.ResponseUtils.getContentType(flow.response))) ); } contentTypeFilter.desc = "content type matches " + regex; @@ -1730,7 +1731,7 @@ Filt = (function() { function requestContentType(regex){ regex = new RegExp(regex, "i"); function requestContentTypeFilter(flow){ - return flow.request && regex.test(RequestUtils.getContentType(flow.request)); + return flow.request && regex.test(flowutils.RequestUtils.getContentType(flow.request)); } requestContentTypeFilter.desc = "req. content type matches " + regex; return requestContentTypeFilter; @@ -1738,7 +1739,7 @@ Filt = (function() { function responseContentType(regex){ regex = new RegExp(regex, "i"); function responseContentTypeFilter(flow){ - return flow.response && regex.test(ResponseUtils.getContentType(flow.response)); + return flow.response && regex.test(flowutils.ResponseUtils.getContentType(flow.response)); } responseContentTypeFilter.desc = "resp. content type matches " + regex; return responseContentTypeFilter; @@ -1746,7 +1747,7 @@ Filt = (function() { function url(regex){ regex = new RegExp(regex, "i"); function urlFilter(flow){ - return flow.request && regex.test(RequestUtils.pretty_url(flow.request)); + return flow.request && regex.test(flowutils.RequestUtils.pretty_url(flow.request)); } urlFilter.desc = "url matches " + regex; return urlFilter; @@ -1770,7 +1771,4 @@ Filt = (function() { SyntaxError: SyntaxError, parse: parse }; -})(); -/* jshint ignore:end */ - -module.exports = Filt; +})(); \ No newline at end of file diff --git a/web/src/js/filt/filt.peg b/web/src/js/filt/filt.peg new file mode 100644 index 00000000..b4763ccf --- /dev/null +++ b/web/src/js/filt/filt.peg @@ -0,0 +1,249 @@ +// PEG.js filter rules - see http://pegjs.majda.cz/online + +{ +var flowutils = require("../flow/utils.js"); + +function or(first, second) { + // Add explicit function names to ease debugging. + function orFilter() { + return first.apply(this, arguments) || second.apply(this, arguments); + } + orFilter.desc = first.desc + " or " + second.desc; + return orFilter; +} +function and(first, second) { + function andFilter() { + return first.apply(this, arguments) && second.apply(this, arguments); + } + andFilter.desc = first.desc + " and " + second.desc; + return andFilter; +} +function not(expr) { + function notFilter() { + return !expr.apply(this, arguments); + } + notFilter.desc = "not " + expr.desc; + return notFilter; +} +function binding(expr) { + function bindingFilter() { + return expr.apply(this, arguments); + } + bindingFilter.desc = "(" + expr.desc + ")"; + return bindingFilter; +} +function trueFilter(flow) { + return true; +} +trueFilter.desc = "true"; +function falseFilter(flow) { + return false; +} +falseFilter.desc = "false"; + +var ASSET_TYPES = [ + new RegExp("text/javascript"), + new RegExp("application/x-javascript"), + new RegExp("application/javascript"), + new RegExp("text/css"), + new RegExp("image/.*"), + new RegExp("application/x-shockwave-flash") +]; +function assetFilter(flow) { + if (flow.response) { + var ct = flowutils.ResponseUtils.getContentType(flow.response); + var i = ASSET_TYPES.length; + while (i--) { + if (ASSET_TYPES[i].test(ct)) { + return true; + } + } + } + return false; +} +assetFilter.desc = "is asset"; +function responseCode(code){ + function responseCodeFilter(flow){ + return flow.response && flow.response.code === code; + } + responseCodeFilter.desc = "resp. code is " + code; + return responseCodeFilter; +} +function domain(regex){ + regex = new RegExp(regex, "i"); + function domainFilter(flow){ + return flow.request && regex.test(flow.request.host); + } + domainFilter.desc = "domain matches " + regex; + return domainFilter; +} +function errorFilter(flow){ + return !!flow.error; +} +errorFilter.desc = "has error"; +function header(regex){ + regex = new RegExp(regex, "i"); + function headerFilter(flow){ + return ( + (flow.request && flowutils.RequestUtils.match_header(flow.request, regex)) + || + (flow.response && flowutils.ResponseUtils.match_header(flow.response, regex)) + ); + } + headerFilter.desc = "header matches " + regex; + return headerFilter; +} +function requestHeader(regex){ + regex = new RegExp(regex, "i"); + function requestHeaderFilter(flow){ + return (flow.request && flowutils.RequestUtils.match_header(flow.request, regex)); + } + requestHeaderFilter.desc = "req. header matches " + regex; + return requestHeaderFilter; +} +function responseHeader(regex){ + regex = new RegExp(regex, "i"); + function responseHeaderFilter(flow){ + return (flow.response && flowutils.ResponseUtils.match_header(flow.response, regex)); + } + responseHeaderFilter.desc = "resp. header matches " + regex; + return responseHeaderFilter; +} +function method(regex){ + regex = new RegExp(regex, "i"); + function methodFilter(flow){ + return flow.request && regex.test(flow.request.method); + } + methodFilter.desc = "method matches " + regex; + return methodFilter; +} +function noResponseFilter(flow){ + return flow.request && !flow.response; +} +noResponseFilter.desc = "has no response"; +function responseFilter(flow){ + return !!flow.response; +} +responseFilter.desc = "has response"; + +function contentType(regex){ + regex = new RegExp(regex, "i"); + function contentTypeFilter(flow){ + return ( + (flow.request && regex.test(flowutils.RequestUtils.getContentType(flow.request))) + || + (flow.response && regex.test(flowutils.ResponseUtils.getContentType(flow.response))) + ); + } + contentTypeFilter.desc = "content type matches " + regex; + return contentTypeFilter; +} +function requestContentType(regex){ + regex = new RegExp(regex, "i"); + function requestContentTypeFilter(flow){ + return flow.request && regex.test(flowutils.RequestUtils.getContentType(flow.request)); + } + requestContentTypeFilter.desc = "req. content type matches " + regex; + return requestContentTypeFilter; +} +function responseContentType(regex){ + regex = new RegExp(regex, "i"); + function responseContentTypeFilter(flow){ + return flow.response && regex.test(flowutils.ResponseUtils.getContentType(flow.response)); + } + responseContentTypeFilter.desc = "resp. content type matches " + regex; + return responseContentTypeFilter; +} +function url(regex){ + regex = new RegExp(regex, "i"); + function urlFilter(flow){ + return flow.request && regex.test(flowutils.RequestUtils.pretty_url(flow.request)); + } + urlFilter.desc = "url matches " + regex; + return urlFilter; +} +} + +start "filter expression" + = __ orExpr:OrExpr __ { return orExpr; } + / {return trueFilter; } + +ws "whitespace" = [ \t\n\r] +cc "control character" = [|&!()~"] +__ "optional whitespace" = ws* + +OrExpr + = first:AndExpr __ "|" __ second:OrExpr + { return or(first, second); } + / AndExpr + +AndExpr + = first:NotExpr __ "&" __ second:AndExpr + { return and(first, second); } + / first:NotExpr ws+ second:AndExpr + { return and(first, second); } + / NotExpr + +NotExpr + = "!" __ expr:NotExpr + { return not(expr); } + / BindingExpr + +BindingExpr + = "(" __ expr:OrExpr __ ")" + { return binding(expr); } + / Expr + +Expr + = NullaryExpr + / UnaryExpr + +NullaryExpr + = BooleanLiteral + / "~a" { return assetFilter; } + / "~e" { return errorFilter; } + / "~q" { return noResponseFilter; } + / "~s" { return responseFilter; } + + +BooleanLiteral + = "true" { return trueFilter; } + / "false" { return falseFilter; } + +UnaryExpr + = "~c" ws+ s:IntegerLiteral { return responseCode(s); } + / "~d" ws+ s:StringLiteral { return domain(s); } + / "~h" ws+ s:StringLiteral { return header(s); } + / "~hq" ws+ s:StringLiteral { return requestHeader(s); } + / "~hs" ws+ s:StringLiteral { return responseHeader(s); } + / "~m" ws+ s:StringLiteral { return method(s); } + / "~t" ws+ s:StringLiteral { return contentType(s); } + / "~tq" ws+ s:StringLiteral { return requestContentType(s); } + / "~ts" ws+ s:StringLiteral { return responseContentType(s); } + / "~u" ws+ s:StringLiteral { return url(s); } + / s:StringLiteral { return url(s); } + +IntegerLiteral "integer" + = ['"]? digits:[0-9]+ ['"]? { return parseInt(digits.join(""), 10); } + +StringLiteral "string" + = '"' chars:DoubleStringChar* '"' { return chars.join(""); } + / "'" chars:SingleStringChar* "'" { return chars.join(""); } + / !cc chars:UnquotedStringChar+ { return chars.join(""); } + +DoubleStringChar + = !["\\] char:. { return char; } + / "\\" char:EscapeSequence { return char; } + +SingleStringChar + = !['\\] char:. { return char; } + / "\\" char:EscapeSequence { return char; } + +UnquotedStringChar + = !ws char:. { return char; } + +EscapeSequence + = ['"\\] + / "n" { return "\n"; } + / "r" { return "\r"; } + / "t" { return "\t"; } \ No newline at end of file diff --git a/web/src/js/filt/filt.pegjs b/web/src/js/filt/filt.pegjs deleted file mode 100644 index 0870e4fe..00000000 --- a/web/src/js/filt/filt.pegjs +++ /dev/null @@ -1,247 +0,0 @@ -// PEG.js filter rules - see http://pegjs.majda.cz/online - -{ -function or(first, second) { - // Add explicit function names to ease debugging. - function orFilter() { - return first.apply(this, arguments) || second.apply(this, arguments); - } - orFilter.desc = first.desc + " or " + second.desc; - return orFilter; -} -function and(first, second) { - function andFilter() { - return first.apply(this, arguments) && second.apply(this, arguments); - } - andFilter.desc = first.desc + " and " + second.desc; - return andFilter; -} -function not(expr) { - function notFilter() { - return !expr.apply(this, arguments); - } - notFilter.desc = "not " + expr.desc; - return notFilter; -} -function binding(expr) { - function bindingFilter() { - return expr.apply(this, arguments); - } - bindingFilter.desc = "(" + expr.desc + ")"; - return bindingFilter; -} -function trueFilter(flow) { - return true; -} -trueFilter.desc = "true"; -function falseFilter(flow) { - return false; -} -falseFilter.desc = "false"; - -var ASSET_TYPES = [ - new RegExp("text/javascript"), - new RegExp("application/x-javascript"), - new RegExp("application/javascript"), - new RegExp("text/css"), - new RegExp("image/.*"), - new RegExp("application/x-shockwave-flash") -]; -function assetFilter(flow) { - if (flow.response) { - var ct = ResponseUtils.getContentType(flow.response); - var i = ASSET_TYPES.length; - while (i--) { - if (ASSET_TYPES[i].test(ct)) { - return true; - } - } - } - return false; -} -assetFilter.desc = "is asset"; -function responseCode(code){ - function responseCodeFilter(flow){ - return flow.response && flow.response.code === code; - } - responseCodeFilter.desc = "resp. code is " + code; - return responseCodeFilter; -} -function domain(regex){ - regex = new RegExp(regex, "i"); - function domainFilter(flow){ - return flow.request && regex.test(flow.request.host); - } - domainFilter.desc = "domain matches " + regex; - return domainFilter; -} -function errorFilter(flow){ - return !!flow.error; -} -errorFilter.desc = "has error"; -function header(regex){ - regex = new RegExp(regex, "i"); - function headerFilter(flow){ - return ( - (flow.request && RequestUtils.match_header(flow.request, regex)) - || - (flow.response && ResponseUtils.match_header(flow.response, regex)) - ); - } - headerFilter.desc = "header matches " + regex; - return headerFilter; -} -function requestHeader(regex){ - regex = new RegExp(regex, "i"); - function requestHeaderFilter(flow){ - return (flow.request && RequestUtils.match_header(flow.request, regex)); - } - requestHeaderFilter.desc = "req. header matches " + regex; - return requestHeaderFilter; -} -function responseHeader(regex){ - regex = new RegExp(regex, "i"); - function responseHeaderFilter(flow){ - return (flow.response && ResponseUtils.match_header(flow.response, regex)); - } - responseHeaderFilter.desc = "resp. header matches " + regex; - return responseHeaderFilter; -} -function method(regex){ - regex = new RegExp(regex, "i"); - function methodFilter(flow){ - return flow.request && regex.test(flow.request.method); - } - methodFilter.desc = "method matches " + regex; - return methodFilter; -} -function noResponseFilter(flow){ - return flow.request && !flow.response; -} -noResponseFilter.desc = "has no response"; -function responseFilter(flow){ - return !!flow.response; -} -responseFilter.desc = "has response"; - -function contentType(regex){ - regex = new RegExp(regex, "i"); - function contentTypeFilter(flow){ - return ( - (flow.request && regex.test(RequestUtils.getContentType(flow.request))) - || - (flow.response && regex.test(ResponseUtils.getContentType(flow.response))) - ); - } - contentTypeFilter.desc = "content type matches " + regex; - return contentTypeFilter; -} -function requestContentType(regex){ - regex = new RegExp(regex, "i"); - function requestContentTypeFilter(flow){ - return flow.request && regex.test(RequestUtils.getContentType(flow.request)); - } - requestContentTypeFilter.desc = "req. content type matches " + regex; - return requestContentTypeFilter; -} -function responseContentType(regex){ - regex = new RegExp(regex, "i"); - function responseContentTypeFilter(flow){ - return flow.response && regex.test(ResponseUtils.getContentType(flow.response)); - } - responseContentTypeFilter.desc = "resp. content type matches " + regex; - return responseContentTypeFilter; -} -function url(regex){ - regex = new RegExp(regex, "i"); - function urlFilter(flow){ - return flow.request && regex.test(RequestUtils.pretty_url(flow.request)); - } - urlFilter.desc = "url matches " + regex; - return urlFilter; -} -} - -start "filter expression" - = __ orExpr:OrExpr __ { return orExpr; } - / {return trueFilter; } - -ws "whitespace" = [ \t\n\r] -cc "control character" = [|&!()~"] -__ "optional whitespace" = ws* - -OrExpr - = first:AndExpr __ "|" __ second:OrExpr - { return or(first, second); } - / AndExpr - -AndExpr - = first:NotExpr __ "&" __ second:AndExpr - { return and(first, second); } - / first:NotExpr ws+ second:AndExpr - { return and(first, second); } - / NotExpr - -NotExpr - = "!" __ expr:NotExpr - { return not(expr); } - / BindingExpr - -BindingExpr - = "(" __ expr:OrExpr __ ")" - { return binding(expr); } - / Expr - -Expr - = NullaryExpr - / UnaryExpr - -NullaryExpr - = BooleanLiteral - / "~a" { return assetFilter; } - / "~e" { return errorFilter; } - / "~q" { return noResponseFilter; } - / "~s" { return responseFilter; } - - -BooleanLiteral - = "true" { return trueFilter; } - / "false" { return falseFilter; } - -UnaryExpr - = "~c" ws+ s:IntegerLiteral { return responseCode(s); } - / "~d" ws+ s:StringLiteral { return domain(s); } - / "~h" ws+ s:StringLiteral { return header(s); } - / "~hq" ws+ s:StringLiteral { return requestHeader(s); } - / "~hs" ws+ s:StringLiteral { return responseHeader(s); } - / "~m" ws+ s:StringLiteral { return method(s); } - / "~t" ws+ s:StringLiteral { return contentType(s); } - / "~tq" ws+ s:StringLiteral { return requestContentType(s); } - / "~ts" ws+ s:StringLiteral { return responseContentType(s); } - / "~u" ws+ s:StringLiteral { return url(s); } - / s:StringLiteral { return url(s); } - -IntegerLiteral "integer" - = ['"]? digits:[0-9]+ ['"]? { return parseInt(digits.join(""), 10); } - -StringLiteral "string" - = '"' chars:DoubleStringChar* '"' { return chars.join(""); } - / "'" chars:SingleStringChar* "'" { return chars.join(""); } - / !cc chars:UnquotedStringChar+ { return chars.join(""); } - -DoubleStringChar - = !["\\] char:. { return char; } - / "\\" char:EscapeSequence { return char; } - -SingleStringChar - = !['\\] char:. { return char; } - / "\\" char:EscapeSequence { return char; } - -UnquotedStringChar - = !ws char:. { return char; } - -EscapeSequence - = ['"\\] - / "n" { return "\n"; } - / "r" { return "\r"; } - / "t" { return "\t"; } \ No newline at end of file -- cgit v1.2.3