Пример #1
0
        /// <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());
        }
Пример #2
0
 /// <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 { }
     }
 }
Пример #3
0
        /// <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;
            }
        }
Пример #4
0
        /// <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);
        }
Пример #5
0
        /// <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);
        }