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));