예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
        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;
        }
예제 #5
0
        /// <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);
        }
예제 #6
0
        /// <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);
        }
예제 #7
0
        /// <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);
        }