public void PostTestCleanup()
        {
            if (IsLoadTestingEnabled)
            {
                try
                {
                    string requestFileDirectory = Path.GetDirectoryName(_requestsFilePath);
                    if (!Directory.Exists(requestFileDirectory))
                    {
                        Directory.CreateDirectory(requestFileDirectory);
                    }

                    ConcurrentBag <HttpRequestDto> httpRequestDto = HttpRequestsPerTest[CurrentTestName];

                    var jsonContent  = _jsonSerializer.Serialize(httpRequestDto);
                    var testFilePath = Path.Combine(_requestsFilePath, $"{CurrentTestName}.json");
                    File.WriteAllText(testFilePath, jsonContent);
                }
                catch (UnauthorizedAccessException ex)
                {
                    throw new UnauthorizedAccessException("Cannot save load test requests.", ex);
                }
                catch (PathTooLongException ex)
                {
                    throw new PathTooLongException("Cannot save load test requests.", ex);
                }
                catch (IOException ex)
                {
                    throw new IOException("Cannot save load test requests.", ex);
                }
            }

            _previousHttpRequestDto = null;
            CurrentTestName         = null;
        }
        public HttpRequestDto Create(Request request, HttpRequestDto previousHttpRequestDto)
        {
            var httpRequestDto = new HttpRequestDto
            {
                Url          = request.Url,
                Method       = request.Method,
                ContentType  = request.ContentType,
                CreationTime = DateTime.Now,
            };

            if (previousHttpRequestDto != null)
            {
                httpRequestDto.MillisecondsPauseAfterPreviousRequest =
                    (httpRequestDto.CreationTime - previousHttpRequestDto.CreationTime).Milliseconds;
            }

            foreach (var item in request.Headers)
            {
                httpRequestDto.Headers.Add(item.ToString());
            }

            return(httpRequestDto);
        }
        public async Task OnRequestCaptureTrafficEventHandler(object sender, SessionEventArgs e) => await Task.Run(
            () =>
        {
            if (IsLoadTestingEnabled && CurrentTestName != null)
            {
                if (HttpRequestsPerTest.ContainsKey(CurrentTestName) && e.HttpClient != null &&
                    e.HttpClient.Request != null)
                {
                    var htpRequestDto =
                        _httpRequestDtoFactory.Create(e.HttpClient.Request, _previousHttpRequestDto);
                    if (e.HttpClient.Request.Method == "POST" || e.HttpClient.Request.Method == "PUT" ||
                        e.HttpClient.Request.Method == "PATCH")
                    {
                        try
                        {
                            htpRequestDto.Body = e.GetRequestBodyAsString().Result;
                        }
                        catch
                        {
                            // Ignore if doesn't have body
                        }
                    }

                    if (((ShouldFilterByHost &&
                          htpRequestDto.Headers.Any(x => x.Contains($"Host: {FilterHost}"))) ||
                         !ShouldFilterByHost) && !ShouldFilterRequest(htpRequestDto.Url))
                    {
                        if (_previousHttpRequestDto == null || !_previousHttpRequestDto.Equals(htpRequestDto))
                        {
                            HttpRequestsPerTest[CurrentTestName].Add(htpRequestDto);
                            _previousHttpRequestDto = htpRequestDto;
                        }
                    }
                }
            }
        });
        private RestRequest CreateRestRequest(HttpRequestDto httpRequestDto)
        {
            var    method   = (Method)Enum.Parse(typeof(Method), httpRequestDto.Method);
            string resource = HttpUtility.UrlDecode(httpRequestDto.Url);
            var    request  = new RestRequest(resource, method);

            request.RequestFormat  = DataFormat.Json;
            request.JsonSerializer = NewtonsoftJsonSerializer.Default;
            ////var request = new RestRequest(new Uri(HttpUtility.UrlDecode(httpRequestDto.Url)), method);

            foreach (var currentHeader in httpRequestDto.Headers)
            {
                if (currentHeader.Contains("Cookie"))
                {
                    string cookiesHeader = currentHeader.Replace("Cookie:", string.Empty).TrimStart();
                    var    cookiesPairs  = cookiesHeader.Split(';');
                    foreach (string cookiePair in cookiesPairs)
                    {
                        var splitHeader = cookiePair.Split('=');
                        var cookieName  = splitHeader[0].Trim();
                        if (_scenarioCookies.ContainsKey(cookieName))
                        {
                            request.AddCookie(cookieName, _scenarioCookies[cookieName]);
                        }
                    }
                }
                else
                {
                    var headerPairs = currentHeader.Split(':');
                    if (headerPairs.Count() >= 2)
                    {
                        string headerName  = headerPairs[0].Trim();
                        string headerValue = currentHeader.Replace($"{headerName}:", string.Empty).Trim();
                        if (!string.IsNullOrEmpty(headerName) && !string.IsNullOrEmpty(headerValue))
                        {
                            try
                            {
                                request.AddHeader(headerName, headerValue);
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine(ex);
                            }
                        }
                    }
                }
            }

            if (httpRequestDto.Body != null)
            {
                var parametersPairs = httpRequestDto.Body.Split('&');
                var urlEncodedPairs = new List <KeyValuePair <string, string> >();
                foreach (var parameterPair in parametersPairs)
                {
                    string parameterName  = parameterPair.Split('=').FirstOrDefault();
                    string parameterValue = parameterPair.Split('=').LastOrDefault() ?? string.Empty;
                    urlEncodedPairs.Add(new KeyValuePair <string, string>(HttpUtility.UrlDecode(parameterName),
                                                                          HttpUtility.UrlDecode(parameterValue)));
                }

                var    formUrlEncodedContent = new FormUrlEncodedContent(urlEncodedPairs.ToArray());
                string rawBody        = formUrlEncodedContent.ReadAsStringAsync().Result;
                string decodedRawBody = rawBody;
                if (httpRequestDto.Headers.Any(x => x.Contains("text/html")))
                {
                    decodedRawBody = HttpUtility.HtmlDecode(rawBody);
                }
                else
                {
                    decodedRawBody = HttpUtility.UrlDecode(rawBody);
                }

                request.AddParameter(httpRequestDto.ContentType, decodedRawBody, ParameterType.RequestBody);
            }

            return(request);
        }