/// <summary> /// Builds a string containing multipart content. /// </summary> /// <returns>One content per line, with type, name and value separated by a colon</returns> public string GetMultipartContents() { StringBuilder sb = new StringBuilder(); foreach (var c in MultipartContents) { sb.Append($"{c.Type.ToString().ToUpper()}: {c.Name}: {c.Value}"); if (!c.Equals(MultipartContents.Last())) { sb.Append(Environment.NewLine); } } return(sb.ToString()); }
/// <summary> /// Sets multipart contents from an array of lines. /// </summary> /// <param name="lines">The lines containing the colon-separated type, name and value of the multipart contents</param> public void SetMultipartContents(string[] lines) { MultipartContents.Clear(); foreach (var line in lines) { try { var split = line.Split(new[] { ':' }, 3); MultipartContents.Add(new MultipartContent() { Type = (MultipartContentType)Enum.Parse(typeof(MultipartContentType), split[0].Trim(), true), Name = split[1].Trim(), Value = split[2].Trim() }); } catch { } } }
/// <inheritdoc /> public override void Process(BotData data) { base.Process(data); // Setup var request = new Request(); request.Setup(data.GlobalSettings, securityProtocol, AutoRedirect, data.ConfigSettings.MaxRedirects, AcceptEncoding); var localUrl = ReplaceValues(Url, data); data.Log(new LogEntry($"Calling URL: {localUrl}", Colors.MediumTurquoise)); // Set content switch (RequestType) { case RequestType.Standard: request.SetStandardContent(ReplaceValues(PostData, data), ReplaceValues(ContentType, data), Method, EncodeContent, GetLogBuffer(data)); break; case RequestType.BasicAuth: request.SetBasicAuth(ReplaceValues(AuthUser, data), ReplaceValues(AuthPass, data)); break; case RequestType.Multipart: var contents = MultipartContents.Select(m => new MultipartContent() { Name = ReplaceValues(m.Name, data), Value = ReplaceValues(m.Value, data), ContentType = ReplaceValues(m.Value, data), Type = m.Type }); request.SetMultipartContent(contents, ReplaceValues(MultipartBoundary, data), GetLogBuffer(data)); break; case RequestType.Raw: request.SetRawContent(ReplaceValues(RawData, data), ReplaceValues(ContentType, data), Method, GetLogBuffer(data)); break; } // Set proxy if (data.UseProxies) { request.SetProxy(data.Proxy); } // Set headers data.Log(new LogEntry("Sent Headers:", Colors.DarkTurquoise)); var headers = CustomHeaders.Select(h => new KeyValuePair <string, string>(ReplaceValues(h.Key, data), ReplaceValues(h.Value, data)) ).ToDictionary(h => h.Key, h => h.Value); request.SetHeaders(headers, AcceptEncoding, GetLogBuffer(data)); // Set cookies data.Log(new LogEntry("Sent Cookies:", Colors.MediumTurquoise)); foreach (var cookie in CustomCookies) // Add new user-defined custom cookies to the bot's cookie jar { data.Cookies[ReplaceValues(cookie.Key, data)] = ReplaceValues(cookie.Value, data); } request.SetCookies(data.Cookies, GetLogBuffer(data)); // End the request part data.LogNewLine(); // Perform the request try { (data.Address, data.ResponseCode, data.ResponseHeaders, data.Cookies) = request.Perform(localUrl, Method, GetLogBuffer(data)); } catch (Exception ex) { if (data.ConfigSettings.IgnoreResponseErrors) { data.Log(new LogEntry(ex.Message, Colors.Tomato)); data.ResponseSource = ex.Message; return; } throw; } // Save the response content switch (ResponseType) { case ResponseType.String: data.ResponseSource = request.SaveString(ReadResponseSource, data.ResponseHeaders, GetLogBuffer(data)); break; case ResponseType.File: if (SaveAsScreenshot) { Files.SaveScreenshot(request.GetResponseStream(), data); // Read the stream data.Log(new LogEntry("File saved as screenshot", Colors.Green)); } else { request.SaveFile(ReplaceValues(DownloadPath, data), GetLogBuffer(data)); } break; case ResponseType.Base64String: var base64 = Convert.ToBase64String(request.GetResponseStream().ToArray()); InsertVariable(data, false, base64, OutputVariable); break; default: break; } }
/// <inheritdoc /> public override BlockBase FromLS(string line) { // Trim the line var input = line.Trim(); // Parse the label if (input.StartsWith("#")) { Label = LineParser.ParseLabel(ref input); } Method = (HttpMethod)LineParser.ParseEnum(ref input, "METHOD", typeof(HttpMethod)); Url = LineParser.ParseLiteral(ref input, "URL"); while (LineParser.Lookahead(ref input) == TokenType.Boolean) { LineParser.SetBool(ref input, this); } CustomHeaders.Clear(); // Remove the default headers while (input != "" && !input.StartsWith("->")) { var parsed = LineParser.ParseToken(ref input, TokenType.Parameter, true).ToUpper(); switch (parsed) { case "MULTIPART": RequestType = RequestType.Multipart; break; case "BASICAUTH": RequestType = RequestType.BasicAuth; break; case "STANDARD": RequestType = RequestType.Standard; break; case "CONTENT": PostData = LineParser.ParseLiteral(ref input, "POST DATA"); break; case "STRINGCONTENT": var sCont = LineParser.ParseLiteral(ref input, "STRING CONTENT"); var sSplit = sCont.Split(new char[] { ':' }, 2); MultipartContents.Add(new MultipartContent() { Type = MultipartContentType.String, Name = sSplit[0].Trim(), Value = sSplit[1].Trim() }); break; case "FILECONTENT": var fCont = LineParser.ParseLiteral(ref input, "FILE CONTENT"); var fSplit = fCont.Split(new char[] { ':' }, 2); MultipartContents.Add(new MultipartContent() { Type = MultipartContentType.File, Name = fSplit[0].Trim(), Value = fSplit[1].Trim() }); break; case "COOKIE": var cookiePair = ParsePair(LineParser.ParseLiteral(ref input, "COOKIE VALUE")); CustomCookies[cookiePair.Key] = cookiePair.Value; break; case "HEADER": var headerPair = ParsePair(LineParser.ParseLiteral(ref input, "HEADER VALUE")); CustomHeaders[headerPair.Key] = headerPair.Value; break; case "CONTENTTYPE": ContentType = LineParser.ParseLiteral(ref input, "CONTENT TYPE"); break; case "USERNAME": AuthUser = LineParser.ParseLiteral(ref input, "USERNAME"); break; case "PASSWORD": AuthPass = LineParser.ParseLiteral(ref input, "PASSWORD"); break; case "BOUNDARY": MultipartBoundary = LineParser.ParseLiteral(ref input, "BOUNDARY"); break; default: break; } } if (input.StartsWith("->")) { LineParser.EnsureIdentifier(ref input, "->"); var outType = LineParser.ParseToken(ref input, TokenType.Parameter, true); if (outType.ToUpper() == "STRING") { ResponseType = ResponseType.String; } else if (outType.ToUpper() == "FILE") { ResponseType = ResponseType.File; DownloadPath = LineParser.ParseLiteral(ref input, "DOWNLOAD PATH"); } } return(this); }
/// <inheritdoc /> public override BlockBase FromLS(string line) { // Trim the line var input = line.Trim(); // Parse the label if (input.StartsWith("#")) { Label = LineParser.ParseLabel(ref input); } Method = (HttpMethod)LineParser.ParseEnum(ref input, "METHOD", typeof(HttpMethod)); Url = LineParser.ParseLiteral(ref input, "URL"); while (LineParser.Lookahead(ref input) == TokenType.Boolean) { LineParser.SetBool(ref input, this); } CustomHeaders.Clear(); // Remove the default headers while (input != string.Empty && !input.StartsWith("->")) { var parsed = LineParser.ParseToken(ref input, TokenType.Parameter, true).ToUpper(); switch (parsed) { case "MULTIPART": RequestType = RequestType.Multipart; break; case "BASICAUTH": RequestType = RequestType.BasicAuth; break; case "STANDARD": RequestType = RequestType.Standard; break; case "RAW": RequestType = RequestType.Raw; break; case "CONTENT": PostData = LineParser.ParseLiteral(ref input, "POST DATA"); break; case "RAWDATA": RawData = LineParser.ParseLiteral(ref input, "RAW DATA"); break; case "STRINGCONTENT": var stringContentPair = ParseString(LineParser.ParseLiteral(ref input, "STRING CONTENT"), ':', 2); MultipartContents.Add(new MultipartContent() { Type = MultipartContentType.String, Name = stringContentPair[0], Value = stringContentPair[1] }); break; case "FILECONTENT": var fileContentTriplet = ParseString(LineParser.ParseLiteral(ref input, "FILE CONTENT"), ':', 3); MultipartContents.Add(new MultipartContent() { Type = MultipartContentType.File, Name = fileContentTriplet[0], Value = fileContentTriplet[1], ContentType = fileContentTriplet[2] }); break; case "COOKIE": var cookiePair = ParseString(LineParser.ParseLiteral(ref input, "COOKIE VALUE"), ':', 2); CustomCookies[cookiePair[0]] = cookiePair[1]; break; case "HEADER": var headerPair = ParseString(LineParser.ParseLiteral(ref input, "HEADER VALUE"), ':', 2); CustomHeaders[headerPair[0]] = headerPair[1]; break; case "CONTENTTYPE": ContentType = LineParser.ParseLiteral(ref input, "CONTENT TYPE"); break; case "USERNAME": AuthUser = LineParser.ParseLiteral(ref input, "USERNAME"); break; case "PASSWORD": AuthPass = LineParser.ParseLiteral(ref input, "PASSWORD"); break; case "BOUNDARY": MultipartBoundary = LineParser.ParseLiteral(ref input, "BOUNDARY"); break; case "SECPROTO": SecurityProtocol = LineParser.ParseEnum(ref input, "Security Protocol", typeof(SecurityProtocol)); break; default: break; } } if (input.StartsWith("->")) { LineParser.EnsureIdentifier(ref input, "->"); var outType = LineParser.ParseToken(ref input, TokenType.Parameter, true); if (outType.ToUpper() == "STRING") { ResponseType = ResponseType.String; } else if (outType.ToUpper() == "FILE") { ResponseType = ResponseType.File; DownloadPath = LineParser.ParseLiteral(ref input, "DOWNLOAD PATH"); while (LineParser.Lookahead(ref input) == TokenType.Boolean) { LineParser.SetBool(ref input, this); } } else if (outType.ToUpper() == "BASE64") { ResponseType = ResponseType.Base64String; OutputVariable = LineParser.ParseLiteral(ref input, "OUTPUT VARIABLE"); } } return(this); }