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)); }
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); }
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, ""); }
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); }
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); }
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)); }
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); }
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)); } } }
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); }
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;; } }
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)); }
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; }
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 } } }