/// <summary> /// Diffs the request or response headers /// </summary> /// <param name="result"></param> /// <param name="firstText"></param> /// <param name="secondText"></param> /// <param name="firstBasePos">The starting position for the first text relative to the entire request/response text</param> /// <param name="secondBasePos">The starting position for the second text relative to the entire request/response text</param> /// <returns></returns> private RequestsDifferResult DiffHeaders(RequestsDifferResult result, string firstText, string secondText, int firstBasePos, int secondBasePos) { //next diff the headers HeadersDiffCollection firstHeaders = new HeadersDiffCollection(); HeadersDiffCollection secondHeaders = new HeadersDiffCollection(); firstHeaders.BasePosition = firstBasePos; secondHeaders.BasePosition = secondBasePos; firstHeaders.Import(firstText); secondHeaders.Import(secondText); GenericDiffer headersDiffer = new GenericDiffer(); headersDiffer.Properties.Sorted = true; headersDiffer.Properties.CaseInSensitiveSort = true; headersDiffer.AddTask(firstHeaders); headersDiffer.AddTask(secondHeaders); headersDiffer.DoDiff(); //obtain the resulting differences and add them to the result result = AppendDiffs(result, headersDiffer); return(result); }
/// <summary> /// Text diffs the first line /// </summary> /// <param name="result"></param> /// <param name="firstText"></param> /// <param name="secondText"></param> /// <param name="firstBasePos">The starting position for the first text relative to the entire request/response text</param> /// <param name="secondBasePos">The starting position for the second text relative to the entire request/response text</param> private RequestsDifferResult DiffFirstLine(RequestsDifferResult result, string firstText, string secondText, int firstBasePos, int secondBasePos) { //extract the request lines and diff them int nlIndex = firstText.IndexOf('\n'); string firstLine = String.Empty; if (nlIndex > -1) { firstLine = firstText.Substring(0, nlIndex); } nlIndex = secondText.IndexOf('\n'); string secondLine = String.Empty; if (nlIndex > -1) { secondLine = secondText.Substring(0, nlIndex); } //do the diff WordsDiffer lineDiffer = new WordsDiffer(); lineDiffer.AddTask(firstLine, firstBasePos); lineDiffer.AddTask(secondLine, secondBasePos); lineDiffer.DoDiff(); result = AppendDiffs(result, lineDiffer); return(result); }
/// <summary> /// Appends a set of differences from the specified differ to the current differences /// </summary> /// <param name="result"></param> /// <param name="differ"></param> /// <returns></returns> private RequestsDifferResult AppendDiffs(RequestsDifferResult result, GenericDiffer differ) { if (result.DiffsForFirst != null) { result.DiffsForFirst.AddRange(differ.GetResultingDifferences(0)); } else { result.DiffsForFirst = differ.GetResultingDifferences(0); } if (result.DiffsForSecond != null) { result.DiffsForSecond.AddRange(differ.GetResultingDifferences(1)); } else { result.DiffsForSecond = differ.GetResultingDifferences(1); } return(result); }
private void DiffWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { _progress.Visible = false; _timer.Stop(); RequestsDifferResult result = e.Result as RequestsDifferResult; if (result != null) { _labelSimilarity.Text = String.Format(Properties.Resources.SimilarityText, result.BodyAproximateSimilarity * 100); _firstDiffs = result.DiffsForFirst; _secondDiffs = result.DiffsForSecond; _boxFirst.Rtf = GetRtf(result.FirstText, result.DiffsForFirst); _boxSecond.Rtf = GetRtf(result.SecondText, result.DiffsForSecond); } //re-enable the diff buttons DiffButtonsSwitch(true); _diffInProgress = false; }
/// <summary> /// Diffs the response bodies /// </summary> /// <param name="result"></param> /// <param name="firstResponse"></param> /// <param name="secondResponse"></param> /// <param name="firstRespBasePos"></param> /// <param name="secondRespBasePos"></param> /// <returns></returns> private RequestsDifferResult DiffResponseBody(RequestsDifferResult result, string firstResponse, string secondResponse, int firstRespBasePos, int secondRespBasePos) { int firstResponseBodyStart = FindResponseBodyStart(firstResponse); int secondResponseBodyStart = FindResponseBodyStart(secondResponse); string firstResponseBody = firstResponse.Substring(firstResponseBodyStart); string secondResponseBody = secondResponse.Substring(secondResponseBodyStart); LinesDiffer linesDiffer = new LinesDiffer(); //this differ first compares the lines then the words then the letters linesDiffer.Properties.Sorted = false; linesDiffer.AddTask(firstResponseBody, firstRespBasePos + firstResponseBodyStart); linesDiffer.AddTask(secondResponseBody, secondRespBasePos + secondResponseBodyStart); result.BodyDiffSimilarity = linesDiffer.DoDiff(); //calculate aproximate similarity as generated by appscan algorithm result.BodyAproximateSimilarity = ASESimilarityAlgorithm.CalculateSimilarity(firstResponseBody, secondResponseBody); result = AppendDiffs(result, linesDiffer); return(result); }
/// <summary> /// Executes a diff operation /// </summary> /// <param name="firstRequestId"></param> /// <param name="secondRequestId"></param> /// <param name="source"></param> /// <returns></returns> public RequestsDifferResult Diff(int firstRequestId, int secondRequestId, ITrafficDataAccessor source) { RequestsDifferResult result = null; if (source.ContainsId(firstRequestId) && source.ContainsId(secondRequestId)) { //first retrieve the requests byte [] bytes1 = source.LoadRequestData(firstRequestId); byte [] bytes2 = source.LoadRequestData(secondRequestId); string firstRequest = String.Empty; string secondRequest = String.Empty; if (bytes1 != null) { firstRequest = GetString(bytes1); } if (bytes2 != null) { secondRequest = GetString(bytes2); } result = new RequestsDifferResult(); try //try to diff the request components { //diff the request line result = DiffFirstLine(result, firstRequest, secondRequest, 0, 0); //diff the request headers result = DiffHeaders(result, firstRequest, secondRequest, 0, 0); //next compare POST data if available result = DiffPostData(result, firstRequest, secondRequest); } catch (DiffException) //if the request are malformed use a regular letters differ { LettersDiffer lettersDiffer = new LettersDiffer(); DiffResult lettersResult = lettersDiffer.DoDiff(firstRequest, secondRequest); result.DiffsForFirst = lettersResult.DifferencesForFirst; result.DiffsForSecond = lettersResult.DifferencesForSecond; } //done with the requests calculate the base position for the response result.FirstText = firstRequest + "\n\n"; result.SecondText = secondRequest + "\n\n"; int firstRespBasePos = result.FirstText.Length; int secondRespBasePos = result.SecondText.Length; //load the responses bytes1 = source.LoadResponseData(firstRequestId); bytes2 = source.LoadResponseData(secondRequestId); string firstResponse = String.Empty; string secondResponse = String.Empty; if (bytes1 != null) { firstResponse = GetString(bytes1); } if (bytes2 != null) { secondResponse = GetString(bytes2); } try { //diff the status line result = DiffFirstLine(result, firstResponse, secondResponse, firstRespBasePos, secondRespBasePos); //diff the request headers result = DiffHeaders(result, firstResponse, secondResponse, firstRespBasePos, secondRespBasePos); //diff the response body result = DiffResponseBody(result, firstResponse, secondResponse, firstRespBasePos, secondRespBasePos); } catch (DiffException) { //if the responses are missing the headers use a regular lines differ LinesDiffer linesDiffer = new LinesDiffer(); linesDiffer.AddTask(firstResponse, firstRespBasePos); linesDiffer.AddTask(secondResponse, secondRespBasePos); linesDiffer.DoDiff(); result.DiffsForFirst = linesDiffer.GetResultingDifferences(0); result.DiffsForSecond = linesDiffer.GetResultingDifferences(1); } //append the responses to the result text result.FirstText += firstResponse; result.SecondText += secondResponse; //sort and merge the resulting differences result.DiffsForFirst.MergeAll(); result.DiffsForSecond.MergeAll(); } return(result); }
/// <summary> /// Diffs the POST data /// </summary> /// <param name="firstRequest"></param> /// <param name="secondRequest"></param> /// <returns></returns> private RequestsDifferResult DiffPostData(RequestsDifferResult result, string firstRequest, string secondRequest) { int firstPostStart = firstRequest.IndexOf("\r\n\r\n"); if (firstPostStart == -1) { //try without \r firstPostStart = firstRequest.IndexOf("\n\n"); if (firstPostStart != -1) { firstPostStart += 2; } } else { firstPostStart += 4; } int secondPostStart = secondRequest.IndexOf("\r\n\r\n"); if (secondPostStart == -1) { //try without \r secondPostStart = secondRequest.IndexOf("\n\n"); if (secondPostStart != -1) { secondPostStart += 2; } } else { secondPostStart += 4; } string firstPost = String.Empty; string secondPost = String.Empty; //construct the post data if (firstPostStart > -1) { firstPost = firstRequest.Substring(firstPostStart, firstRequest.Length - firstPostStart); } if (secondPostStart > -1) { secondPost = secondRequest.Substring(secondPostStart, secondRequest.Length - secondPostStart); } //create a word differ WordsDiffer wordsDiffer = new WordsDiffer(); wordsDiffer.Properties.Sorted = true; wordsDiffer.Properties.CaseInSensitiveSort = true; wordsDiffer.AddTask(firstPost, firstPostStart); wordsDiffer.AddTask(secondPost, secondPostStart); wordsDiffer.DoDiff(); result = AppendDiffs(result, wordsDiffer); return(result); }