Exemple #1
0
        public void TestLineSearchInRequestNoRegex()
        {
            TrafficViewer.Instance.NewTvf();
            ITrafficDataAccessor tvf = TrafficViewer.Instance.TrafficViewerFile;
            string firstRequest      = "GET /a1 HTTP/1.1\r\nHeader1: a1";
            string secondRequest     = "GET /a2 HTTP/1.1\r\nHeader1: a2";

            tvf.AddRequestResponse(firstRequest, "HTTP 200 OK");
            tvf.AddRequestResponse(secondRequest, "HTTP 200 OK");

            Assert.AreEqual(2, tvf.RequestCount);

            LineSearcher searcher = new LineSearcher();
            LineMatches  result   = new LineMatches();

            SearchCriteriaSet criteriaSet = new SearchCriteriaSet();

            criteriaSet.Add(new SearchCriteria(SearchContext.Request, false, "a1"));

            searcher.Search(tvf, criteriaSet, result);

            Assert.AreEqual(2, result.Count);
            Assert.AreEqual(0, result[0].RequestId);
            Assert.AreEqual(0, result[1].RequestId);

            Assert.AreEqual(1, result[0].MatchCoordinatesList.Count);
            Assert.AreEqual(1, result[1].MatchCoordinatesList.Count);

            Assert.AreEqual("a1", firstRequest.Substring(result[0].MatchCoordinatesList[0].MatchPosition, result[0].MatchCoordinatesList[0].MatchLength));
            Assert.AreEqual("a1", firstRequest.Substring(result[1].MatchCoordinatesList[0].MatchPosition, result[1].MatchCoordinatesList[0].MatchLength));
        }
Exemple #2
0
        public void TestRequestLineAfterReplace()
        {
            TrafficViewer.Instance.NewTvf();
            ITrafficDataAccessor tvf = TrafficViewer.Instance.TrafficViewerFile;
            string firstRequest      = "GET http://site.com/a1 HTTP/1.1\r\nHeader1: a1";

            tvf.AddRequestResponse(firstRequest, String.Empty);

            TVRequestInfo reqInfo = tvf.GetRequestInfo(0);

            Assert.AreEqual("GET http://site.com/a1 HTTP/1.1", reqInfo.RequestLine);
            Assert.AreEqual(1, tvf.RequestCount);

            LineSearcher searcher = new LineSearcher();
            LineMatches  result   = new LineMatches();

            SearchCriteriaSet criteriaSet = new SearchCriteriaSet();

            criteriaSet.Add(new SearchCriteria(SearchContext.RequestLine, true, "a1|a=2|<r>2</r>"));

            searcher.Search(tvf, criteriaSet, result);

            tvf.Replace(result, "replacement");

            firstRequest = Constants.DefaultEncoding.GetString(tvf.LoadRequestData(0));

            Assert.AreEqual("GET http://site.com/replacement HTTP/1.1\r\nHeader1: a1", firstRequest);



            Assert.AreEqual("GET http://site.com/replacement HTTP/1.1", reqInfo.RequestLine);
        }
Exemple #3
0
        public void TestReplaceInvalidCoords()
        {
            TrafficViewer.Instance.NewTvf();
            ITrafficDataAccessor tvf = TrafficViewer.Instance.TrafficViewerFile;
            string firstRequest      = "GET /a1 HTTP/1.1\r\nHeader1: a1";
            string firstResponse     = "HTTP 200 OK\r\n<r>2</r><tag><r>3</r>";


            tvf.AddRequestResponse(firstRequest, firstResponse);

            LineSearcher searcher = new LineSearcher();
            LineMatches  result   = new LineMatches();

            SearchCriteriaSet criteriaSet = new SearchCriteriaSet();

            criteriaSet.Add(new SearchCriteria(SearchContext.Full, true, @"a1|a=2|<r>\d</r>"));
            searcher.Search(tvf, criteriaSet, result);

            (tvf as TrafficViewerFile).Clear(false);

            Assert.AreEqual(0, tvf.RequestCount);

            string secondRequest  = "GET /a2 HTTP/1.1\r\nHeader1: a2";
            string secondResponse = "HTTP 200 OK\r\n<r>1</r>";

            tvf.AddRequestResponse(secondRequest, secondResponse);

            Assert.AreEqual(1, tvf.RequestCount);

            //this should not cause an exception
            tvf.Replace(result, "");
        }
Exemple #4
0
        public void TestLineSearchMultipleMatchesPerLineRegex()
        {
            TrafficViewer.Instance.NewTvf();
            ITrafficDataAccessor tvf = TrafficViewer.Instance.TrafficViewerFile;

            string firstRequest  = "POST /a1/a1 HTTP/1.1\r\nHeader1: a1\r\n\r\na=1";
            string firstResponse = "HTTP 200 OK\r\n<r>1</r>";

            tvf.AddRequestResponse(firstRequest, firstResponse);


            Assert.AreEqual(1, tvf.RequestCount);

            LineSearcher searcher = new LineSearcher();
            LineMatches  result   = new LineMatches();

            SearchCriteriaSet criteriaSet = new SearchCriteriaSet();

            criteriaSet.Add(new SearchCriteria(SearchContext.RequestLine, true, @"a\d"));

            searcher.Search(tvf, criteriaSet, result);

            Assert.AreEqual(1, result.Count);
            Assert.AreEqual(2, result[0].MatchCoordinatesList.Count);
        }
Exemple #5
0
        private static void ReplaceTest(string replacement)
        {
            TrafficViewer.Instance.NewTvf();
            ITrafficDataAccessor tvf = TrafficViewer.Instance.TrafficViewerFile;
            string firstRequest      = "GET /a1 HTTP/1.1\r\nHeader1: a1";
            string secondRequest     = "GET /a2 HTTP/1.1\r\nHeader1: a2";
            string firstResponse     = "HTTP 200 OK\r\n<r>1</r>";
            string secondResponse    = "HTTP 200 OK\r\n<r>2</r><tag><r>3</r>";

            tvf.AddRequestResponse(firstRequest, firstResponse);
            tvf.AddRequestResponse(secondRequest, secondResponse);

            Assert.AreEqual(2, tvf.RequestCount);

            LineSearcher searcher = new LineSearcher();
            LineMatches  result   = new LineMatches();

            SearchCriteriaSet criteriaSet = new SearchCriteriaSet();

            criteriaSet.Add(new SearchCriteria(SearchContext.Full, true, @"a1|a=2|<r>\d</r>"));

            searcher.Search(tvf, criteriaSet, result);

            tvf.Replace(result, replacement);

            firstRequest   = Constants.DefaultEncoding.GetString(tvf.LoadRequestData(0));
            secondRequest  = Constants.DefaultEncoding.GetString(tvf.LoadRequestData(1));
            firstResponse  = Constants.DefaultEncoding.GetString(tvf.LoadResponseData(0));
            secondResponse = Constants.DefaultEncoding.GetString(tvf.LoadResponseData(1));

            Assert.AreEqual("GET /" + replacement + " HTTP/1.1\r\nHeader1: " + replacement, firstRequest);
            Assert.AreEqual("HTTP 200 OK\r\n" + replacement + "<tag>" + replacement, secondResponse);
        }
Exemple #6
0
        public void TestLineSearchInResponseRegex()
        {
            TrafficViewer.Instance.NewTvf();
            ITrafficDataAccessor tvf = TrafficViewer.Instance.TrafficViewerFile;
            string firstRequest      = "POST /a1 HTTP/1.1\r\nHeader1: a1\r\n\r\na=1";
            string secondRequest     = "POST /a2 HTTP/1.1\r\nHeader1: a2\r\n\r\na=2";
            string firstResponse     = "HTTP 200 OK\r\n<r>1</r>";
            string secondResponse    = "HTTP 200 OK\r\n<r>2</r>";

            tvf.AddRequestResponse(firstRequest, firstResponse);
            tvf.AddRequestResponse(secondRequest, secondResponse);

            Assert.AreEqual(2, tvf.RequestCount);

            LineSearcher searcher = new LineSearcher();
            LineMatches  result   = new LineMatches();

            SearchCriteriaSet criteriaSet = new SearchCriteriaSet();

            criteriaSet.Add(new SearchCriteria(SearchContext.Response, true, @"<r>\d+</r>|a1"));

            searcher.Search(tvf, criteriaSet, result);

            Assert.AreEqual(2, result.Count);
            Assert.AreEqual(0, result[0].RequestId);
            Assert.AreEqual(SearchContext.Response, result[0].Context);
            Assert.AreEqual(1, result[0].MatchCoordinatesList.Count);
            Assert.AreEqual("<r>2</r>", secondResponse.Substring(result[1].MatchCoordinatesList[0].MatchPosition, result[1].MatchCoordinatesList[0].MatchLength));
        }
Exemple #7
0
        public static IEnumerable<LineIndex> GetTail(this LineIndicies source,  ScrollRequest scroll, LineMatches matches)
        {
            var offset = scroll.PageSize > matches.Count ? 0 : matches.Count - scroll.PageSize;

            return matches.Lines
                .Skip(offset)
                .Select((line, index) =>
                {
                    var previous = line == 0 ? 0 : source.Lines[line - 1];
                    var end = source.Lines[line];
                    return new LineIndex(line + 1, index + offset - 1, previous, end);
                }).Take(scroll.PageSize);
        }
Exemple #8
0
        private void StartSearch()
        {
            if (_boxSearchText.Text != String.Empty)
            {
                _matches = new LineMatches();

                _buttonSearch.Enabled = false;
                _progressBar.Visible  = true;
                this.Text             = _boxSearchText.Text;

                //configure the search
                SearchContext context = (SearchContext)_dropType.SelectedIndex;
                TrafficViewerOptions.Instance.LastSearchType = _dropType.SelectedIndex;

                _searcher = new LineSearcher();
                //clear the search caches
                SearchResultCache.Instance.Clear();
                SearchSubsetsCache.Instance.Clear();



                _criteriaSet = new SearchCriteriaSet();

                _criteriaSet.DescriptionFilter = _boxDescriptionFilter.Text;

                string[] searchLines = _boxSearchText.Text.Split(new char[2] {
                    '\r', '\n'
                }, StringSplitOptions.RemoveEmptyEntries);

                _criteriaSet.Add(new TrafficViewerSDK.Search.SearchCriteria(context,
                                                                            _checkIsRegex.Checked, searchLines));


                _last = 0;
                _list.Items.Clear();

                //run the background worker
                _searchWorker.RunWorkerAsync();

                //start the load timer
                _requestTimerStop = false;
                _timer.Start();

                //invoke the event
                if (SearchExecuted != null)
                {
                    SearchExecuted.Invoke(new SearchExecutedEventArgs(_boxSearchText.Text, _checkIsRegex.Checked));
                }
            }
        }
Exemple #9
0
        public static IEnumerable<LineIndex> GetFromIndex(this LineIndicies source, ScrollRequest scroll, LineMatches matches)
        {
            if (scroll.FirstIndex + scroll.PageSize > source.Count)
                return source.GetTail(scroll);

            return matches.Lines
                .Skip(scroll.FirstIndex)
                .Select((line, index) =>
                {
                    //TODO: Why is this different from above
                    var previous = line == 0 ? 0 : source.Lines[line - 1];
                    var end = source.Lines[line];
                    return new LineIndex(line + 1, index + scroll.FirstIndex, previous, end);
                }).Take(scroll.PageSize);
        }
Exemple #10
0
        public static IEnumerable<LineIndex> GetTail(this LineIndicies source,  ScrollRequest scroll, LineMatches matches)
        {
            //the indexer and matcher can be out of phase so take most recent matches

            int counter = 0;
            foreach (var line in matches.Lines.Reverse())
            {
                if (line > source.Count -1 )
                    continue;

                counter++;
                var previous = line == 0 ? 0 : source.Lines[line - 1];
                var end = source.Lines[line];

                yield return new LineIndex(line + 1, matches.Count - counter - 1, previous, end);

                if (counter== scroll.PageSize)
                    yield break;;
            }
        }
Exemple #11
0
        public void TestLineSearchFullRegex()
        {
            TrafficViewer.Instance.NewTvf();
            ITrafficDataAccessor tvf = TrafficViewer.Instance.TrafficViewerFile;
            string firstRequest      = "POST /a1 HTTP/1.1\r\nHeader1: a1\r\n\r\na=1";
            string secondRequest     = "POST /a2 HTTP/1.1\r\nHeader1: a2\r\n\r\na=2";
            string firstResponse     = "HTTP 200 OK\r\n<r>1</r>";
            string secondResponse    = "HTTP 200 OK\r\n<r>2</r>";

            tvf.AddRequestResponse(firstRequest, firstResponse);

            string testValue = Constants.DefaultEncoding.GetString(tvf.LoadRequestData(0));

            Assert.AreEqual(firstRequest, testValue, "Incorrect first request");
            testValue = Constants.DefaultEncoding.GetString(tvf.LoadResponseData(0));
            Assert.AreEqual(firstResponse, testValue, "Incorrect first response");

            tvf.AddRequestResponse(secondRequest, secondResponse);

            Assert.AreEqual(2, tvf.RequestCount, "Correct number of requests not added");


            LineSearcher searcher = new LineSearcher();
            LineMatches  result   = new LineMatches();

            SearchCriteriaSet criteriaSet = new SearchCriteriaSet();

            criteriaSet.Add(new SearchCriteria(SearchContext.Full, true, "a=1|<r>2</r>"));

            searcher.Search(tvf, criteriaSet, result);

            Assert.AreEqual(2, result.Count);
            Assert.AreEqual(0, result[0].RequestId);
            Assert.AreEqual(1, result[1].RequestId);
            Assert.AreEqual(SearchContext.Request, result[0].Context);
            Assert.AreEqual(SearchContext.Response, result[1].Context);

            Assert.AreEqual("a=1", firstRequest.Substring(result[0].MatchCoordinatesList[0].MatchPosition, result[0].MatchCoordinatesList[0].MatchLength));
            Assert.AreEqual("<r>2</r>", secondResponse.Substring(result[1].MatchCoordinatesList[0].MatchPosition, result[1].MatchCoordinatesList[0].MatchLength));
        }
Exemple #12
0
        private LineMatches SearchParameterValue(string paramValue)
        {
            SearchContext context = SearchContext.Response;

            var searcher = new LineSearcher();

            //clear the search caches
            SearchResultCache.Instance.Clear();
            SearchSubsetsCache.Instance.Clear();

            var criteriaSet = new SearchCriteriaSet();

            criteriaSet.Add(new SearchCriteria(context,
                                               true, "Content-Type: (text|application)"));

            criteriaSet.Add(new SearchCriteria(context,
                                               false, paramValue));


            LineMatches results = new LineMatches();

            searcher.Search(TrafficDataStore, criteriaSet, results);
            return(results);
        }
 public CombinedResult(ScrollRequest scroll, LineMatches matchedLines, LineIndicies incidies)
 {
     Scroll = scroll;
     MatchedLines = matchedLines;
     Incidies = incidies;
 }
Exemple #14
0
        private void TrackRequestContext(HttpRequestInfo requestInfo)
        {
            foreach (TrackingPattern pattern in _autoTrackingPatternList.Values)
            {
                string rawRequest = requestInfo.ToString();

                string needle = Utils.RegexFirstGroupValue(rawRequest, pattern.RequestPattern);

                if (String.IsNullOrWhiteSpace(needle))
                {
                    continue;
                }


                //first search for the path of the current request in responses
                LineMatches results = SearchParameterValue(needle);

                if (results.Count == 0)
                {
                    needle  = Utils.UrlDecode(needle);
                    results = SearchParameterValue(needle);
                }

                //if any of the two searches returned results
                if (results.Count != 0)
                {
                    //get the last match to extract the request context
                    var match = results[results.Count - 1];
                    CurrDataStoreRequestInfo.RefererId = match.RequestId;
                    //replace the path in the match
                    string requestContext = match.Line.Replace(needle, REQ_CONTEXT_ID);

                    if (requestContext.Length > MAX_REQUEST_CONTEXT_SIZE)
                    {
                        requestContext = TrimRequestContext(requestContext);
                    }

                    //also replace hexadecimal values
                    requestContext = Regex.Replace(requestContext, HEX_REGEX, HEX_VAL);

                    //escape the line
                    requestContext = Regex.Escape(requestContext);
                    //insert the group
                    requestContext = requestContext.Replace(REQ_CONTEXT_ID, RX_GROUP);
                    //insert the HEX regex
                    requestContext = requestContext.Replace(HEX_VAL, HEX_REGEX);

                    CurrDataStoreRequestInfo.RequestContext  = requestContext;
                    CurrDataStoreRequestInfo.TrackingPattern = pattern.Name;

                    TrafficDataStore.UpdateRequestInfo(CurrDataStoreRequestInfo);

                    string originalPath = requestInfo.Path;
                    CurrDataStoreRequestInfo.UpdatedPath = originalPath;

                    //change the path of the request
                    HttpRequestInfo newReq = new HttpRequestInfo(requestInfo.ToArray(false), false);

                    //we are only replacing the last portion of the path and the query string to prevent relative path issues and also cookie path issues
                    int lastIndexOfSlash = originalPath.LastIndexOf('/');
                    if (lastIndexOfSlash >= 0)
                    {
                        originalPath = originalPath.Substring(0, lastIndexOfSlash + 1);
                    }


                    newReq.Path = String.Format("{0}{1}{2}", originalPath, REQ_ID_STRING, CurrDataStoreRequestInfo.Id);

                    TrafficDataStore.SaveRequest(CurrDataStoreRequestInfo.Id, newReq.ToArray(false));

                    HttpServerConsole.Instance.WriteLine
                        ("Found request context for request '{0}' id: {1}, referer id:{2}",
                        requestInfo.Path, CurrDataStoreRequestInfo.Id, CurrDataStoreRequestInfo.RefererId);
                    HttpServerConsole.Instance.WriteLine
                        (requestContext);

                    return;                     //we can only have one tracking pattern per request
                }
            }
        }