diff --git a/OpenBullet/LSDoc.xml b/OpenBullet/LSDoc.xml index 5dea227..d9326f7 100644 --- a/OpenBullet/LSDoc.xml +++ b/OpenBullet/LSDoc.xml @@ -271,7 +271,7 @@ KEYCHECK BanOnToCheck=False This will spawn and execute a Request Block. Syntax (expanded for readability): -REQUEST METHOD "URL" [AutoRedirect?] [ReadResponseSource?] +REQUEST METHOD "URL" [AutoRedirect?] [ReadResponseSource?] [ParseQuery?] [EncodeOutput?] [STANDARD / MULTIPART / BASICAUTH] [CONTENT "postdata"] [CONTENTTYPE "ctype"] diff --git a/OpenBullet/Pages/StackerBlocks/PageBlockParse.xaml b/OpenBullet/Pages/StackerBlocks/PageBlockParse.xaml index 1216305..9746bee 100644 --- a/OpenBullet/Pages/StackerBlocks/PageBlockParse.xaml +++ b/OpenBullet/Pages/StackerBlocks/PageBlockParse.xaml @@ -76,6 +76,7 @@ + Whether the program matches the LEFT and RIGHT strings through a regex pattern or with simple string in string searches @@ -110,7 +111,10 @@ - + + + + @@ -119,7 +123,10 @@ @@ -132,7 +139,10 @@ diff --git a/OpenBullet/Pages/StackerBlocks/PageBlockRequest.xaml b/OpenBullet/Pages/StackerBlocks/PageBlockRequest.xaml index 4e0a8f9..ff12ee9 100644 --- a/OpenBullet/Pages/StackerBlocks/PageBlockRequest.xaml +++ b/OpenBullet/Pages/StackerBlocks/PageBlockRequest.xaml @@ -19,6 +19,7 @@ + @@ -26,14 +27,15 @@ - + - - + + + diff --git a/OpenBullet/SyntaxHelper.xml b/OpenBullet/SyntaxHelper.xml index 6d1ea1e..03e6ed2 100644 --- a/OpenBullet/SyntaxHelper.xml +++ b/OpenBullet/SyntaxHelper.xml @@ -10,7 +10,7 @@ KEYCHECK [BanOn4XX?] [BanOnToCheck?] ]* -REQUEST METHOD "URL" [AutoRedirect?] [ReadResponseSource?] +REQUEST METHOD "URL" [AutoRedirect?] [ReadResponseSource?] [ParseQuery?] [EncodeOutput?] [STANDARD / MULTIPART / BASICAUTH] [CONTENT "postdata"] [CONTENTTYPE "ctype"] @@ -28,10 +28,10 @@ RECAPTCHA "URL" "SITEKEY" -> VAR "NAME" CAPTCHA "URL" [Base64?] [SendScreenshot?] -> VAR "NAME" -PARSE "TARGET" LR "LEFT" "RIGHT" [Recursive?] [UseRegexLR?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"] -PARSE "TARGET" CSS "SELECTOR" "ATTRIBUTE" [INDEX / Recursive?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"] -PARSE "TARGET" JSON "FIELD" [Recursive?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"] -PARSE "TARGET" REGEX "REGEX" "OUTPUT" [Recursive?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"] +PARSE "TARGET" LR "LEFT" "RIGHT" [Recursive?] [EncodeOutput?] [UseRegexLR?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"] +PARSE "TARGET" CSS "SELECTOR" "ATTRIBUTE" [INDEX / Recursive?] [EncodeOutput?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"] +PARSE "TARGET" JSON "FIELD" [Recursive?] [EncodeOutput?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"] +PARSE "TARGET" REGEX "REGEX" "OUTPUT" [Recursive?] [EncodeOutput?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"] UTILITY LIST "List Name" ACTION [PARAMETERS] [-> VAR/CAP "NAME"] diff --git a/RuriLib/Blocks/BlockBase.cs b/RuriLib/Blocks/BlockBase.cs index 6e1f42b..94df919 100644 --- a/RuriLib/Blocks/BlockBase.cs +++ b/RuriLib/Blocks/BlockBase.cs @@ -287,9 +287,10 @@ namespace RuriLib /// The name of the variable to create /// The string to add at the start of the value /// The string to add at the end of the value - public static void InsertVariables(BotData data, bool isCapture, bool recursive, List values, string variableName, string prefix, string suffix) + public static void InsertVariables(BotData data, bool isCapture, bool recursive, List values, string variableName, string prefix, string suffix, bool urlEncode) { var list = values.Select(v => ReplaceValues(prefix, data) + v.Trim() + ReplaceValues(suffix, data)).ToList(); + if (urlEncode) list = list.Select(v => System.Uri.EscapeDataString(v)).ToList(); CVar variable; if (recursive) variable = new CVar(variableName, list, isCapture); else variable = new CVar(variableName, list.Count == 0 ? "" : list.First(), isCapture); diff --git a/RuriLib/Blocks/BlockFunction.cs b/RuriLib/Blocks/BlockFunction.cs index 73017ea..64ab1df 100644 --- a/RuriLib/Blocks/BlockFunction.cs +++ b/RuriLib/Blocks/BlockFunction.cs @@ -690,7 +690,7 @@ namespace RuriLib } var isList = outputs.Count > 1 || InputString.Contains("[*]") || InputString.Contains("(*)") || InputString.Contains("{*}"); - InsertVariables(data, isCapture, isList, outputs, variableName, "", ""); + InsertVariables(data, isCapture, isList, outputs, variableName, "", "", false); } #region Base64 diff --git a/RuriLib/Blocks/BlockParse.cs b/RuriLib/Blocks/BlockParse.cs index 6b9f2e9..d14dd4f 100644 --- a/RuriLib/Blocks/BlockParse.cs +++ b/RuriLib/Blocks/BlockParse.cs @@ -59,6 +59,10 @@ namespace RuriLib /// Whether to parse multiple values that match the criteria or just the first one. public bool Recursive { get { return recursive; } set { recursive = value; OnPropertyChanged(); } } + private bool encodeOutput = false; + /// Whether to URL encode the parsed text. + public bool EncodeOutput { get { return encodeOutput; } set { encodeOutput = value; OnPropertyChanged(); } } + private ParseType type = ParseType.LR; /// The parsing algorithm being used. public ParseType Type { get { return type; } set { type = value; OnPropertyChanged(); } } @@ -147,12 +151,14 @@ namespace RuriLib LineParser.SetBool(ref input, this); else if (LineParser.Lookahead(ref input) == TokenType.Integer) CssElementIndex = LineParser.ParseInt(ref input, "INDEX"); + if (LineParser.Lookahead(ref input) == TokenType.Boolean) + LineParser.SetBool(ref input, this); break; case ParseType.JSON: // PARSE "" JSON "Field" -> JsonField = LineParser.ParseLiteral(ref input, "FIELD"); - if (LineParser.Lookahead(ref input) == TokenType.Boolean) + while (LineParser.Lookahead(ref input) == TokenType.Boolean) LineParser.SetBool(ref input, this); break; @@ -160,7 +166,7 @@ namespace RuriLib // PARSE "" REGEX "Pattern" "Output" RECURSIVE? -> RegexString = LineParser.ParseLiteral(ref input, "PATTERN"); RegexOutput = LineParser.ParseLiteral(ref input, "OUTPUT"); - if (LineParser.Lookahead(ref input) == TokenType.Boolean) + while (LineParser.Lookahead(ref input) == TokenType.Boolean) LineParser.SetBool(ref input, this); break; } @@ -209,6 +215,7 @@ namespace RuriLib .Literal(LeftString) .Literal(RightString) .Boolean(Recursive, "Recursive") + .Boolean(EncodeOutput, "EncodeOutput") .Boolean(UseRegexLR, "UseRegexLR"); break; @@ -218,19 +225,22 @@ namespace RuriLib .Literal(AttributeName); if (Recursive) writer.Boolean(Recursive, "Recursive"); else writer.Integer(CssElementIndex, "CssElementIndex"); + writer.Boolean(EncodeOutput, "EncodeOutput"); break; case ParseType.JSON: writer .Literal(JsonField) - .Boolean(Recursive, "Recursive"); + .Boolean(Recursive, "Recursive") + .Boolean(EncodeOutput, "EncodeOutput"); break; case ParseType.REGEX: writer .Literal(RegexString) .Literal(RegexOutput) - .Boolean(Recursive, "Recursive"); + .Boolean(Recursive, "Recursive") + .Boolean(EncodeOutput, "EncodeOutput"); break; } @@ -250,7 +260,7 @@ namespace RuriLib { base.Process(data); - InsertVariables(data, isCapture, recursive, Parse(data), variableName, prefix, suffix); + InsertVariables(data, isCapture, recursive, Parse(data), variableName, prefix, suffix, encodeOutput); } private List Parse(BotData data) diff --git a/RuriLib/Blocks/BlockRequest.cs b/RuriLib/Blocks/BlockRequest.cs index d69dcb3..e8bc76b 100644 --- a/RuriLib/Blocks/BlockRequest.cs +++ b/RuriLib/Blocks/BlockRequest.cs @@ -107,6 +107,10 @@ namespace RuriLib /// Whether to parse the GET parameters manually (fixes Extreme.NET issues on some websites). public bool ParseQuery { get { return parseQuery; } set { parseQuery = value; OnPropertyChanged(); } } + private bool encodeContent = false; + /// Whether to URL encode the content before sending it. + public bool EncodeContent { get { return encodeContent; } set { encodeContent = value; OnPropertyChanged(); } } + // Multipart private string multipartBoundary = ""; /// The boundary that separates multipart contents. @@ -252,6 +256,7 @@ namespace RuriLib .Boolean(AutoRedirect, "AutoRedirect") .Boolean(ReadResponseSource, "ReadResponseSource") .Boolean(ParseQuery, "ParseQuery") + .Boolean(EncodeContent, "EncodeContent") .Token(RequestType, "RequestType") .Indent(); @@ -387,6 +392,7 @@ namespace RuriLib .Select(p => ReplaceValues(p, data))); if (pData != "") { + if (encodeContent) pData = System.Uri.EscapeDataString(pData); content = new StringContent(pData); content.ContentType = cType; data.Log(new LogEntry(string.Format("Post Data: {0}", pData), Colors.MediumTurquoise));