/// <summary>
        /// Returns the result from the unit test requests.
        /// </summary>
        /// <param name="sender"> The sender object.</param>
        /// <param name="e"> The ResponseEventArgs.</param>
        private void UnitTestResult_EndHttp(object sender, ResponseEventArgs e)
        {
            if ( IsRunning )
            {
                try
                {
                    // Check test result
                    Test test = e.State.TestItem.Tests.GetByIndex(e.State.TestItem.SelectedTestIndex);
                    UnitTestResult testResult = asdeCommand.CheckTestResult(e.Response, test);

                    // Create SessionCommandProcessEventArgs
                    SessionCommandProcessEventArgs args = new SessionCommandProcessEventArgs("Test Result for '" + test.Name + "'");
                    args.ProcessType = SessionProcessType.TestResultOk;
                    args.Detail = "Severity Level: " + testResult.SeverityLevel.ToString();
                    this.DisplaySessionProcessEvent(this, args);

                    // Add response to report
                    HtmlUnitTestReport report = rptBuilder.BuildReport(e, testResult);
                    reports.Add(report);
                }
                catch (Exception ex)
                {
                    Utils.ExceptionHandler.RegisterException(ex);
                    AbortSessionRun(ex.Message);
                }
            }
            else
            {
                unitTestGetRequest.SafeAbortRequest();
                unitTestPostRequest.SafeAbortRequest();
            }
        }
        /// <summary>
        /// Executes the next safe request in order.
        /// </summary>
        /// <param name="state"> The HTTP state.</param>
        private void ExecuteNextSafeRequest(HttpState state)
        {
            // Get safe session and execute
            Session safeSession = this.SafeSession;
            int k = state.SessionRequestId;

            // http settings
            HttpProperties httpSettings = null;
            if ( safeSession.SessionRequests[k].RequestHttpSettings == null )
            {
                httpSettings = safeSessionPostRequest.ClientSettings;
            }
            else
            {
                httpSettings = safeSession.SessionRequests[k].RequestHttpSettings;
            }

            if ( safeSession.SessionRequests[k].RequestType == HttpRequestType.GET )
            {
                GetSessionRequest sessionRequest = (GetSessionRequest)safeSession.SessionRequests[k];

                SessionCommandProcessEventArgs args = new SessionCommandProcessEventArgs("Requesting " + sessionRequest.Url.ToString());
                args.ProcessType = SessionProcessType.SafeRequest;
                this.DisplaySessionProcessEvent(this, args);

                // Request, we only use url, http settings and cookies, because
                // IE doesn't returns and arraylist of values for GET requests.
                StartGetRequest(safeSessionGetRequest,
                    sessionRequest.Url.ToString(),
                    null,
                    sessionRequest.RequestCookies,
                    httpSettings,
                    state);
            }
        }
        /// <summary>
        /// Executes the next safe request in order. Uses session cookies instead of updating them.
        /// </summary>
        /// <param name="state"> The HTTP state.</param>
        /// <param name="responseBufferData"> The ResponseBuffer.</param>
        private void ExecuteNextSafeRequest(HttpState state, ResponseBuffer responseBufferData)
        {
            CookieCollection cookies = null;

            // Get safe session and execute
            Session safeSession = this.SafeSession;
            int k = state.SessionRequestId;

            // http settings
            HttpProperties httpSettings = null;
            if ( safeSession.SessionRequests[k].RequestHttpSettings == null )
            {
                httpSettings = safeSessionPostRequest.ClientSettings;
            }
            else
            {
                httpSettings = safeSession.SessionRequests[k].RequestHttpSettings;
            }

            if ( safeSession.SessionRequests[k].RequestType == HttpRequestType.GET )
            {

                GetSessionRequest sessionRequest = (GetSessionRequest)safeSession.SessionRequests[k];

                //				// Location is found in Hashtable
                //				if ( responseBufferData.ResponseHeaderCollection.ContainsKey("Location") )
                //				{
                //					#region Redirect
                //					// Location is not empty
                //					if ( ((string)responseBufferData.ResponseHeaderCollection["Location"])!=String.Empty )
                //					{
                //						string location = (string)responseBufferData.ResponseHeaderCollection["Location"];
                //						Uri url = (Uri)responseBufferData.ResponseHeaderCollection["Response Uri"];
                //
                //						// Get redirect uri
                //						string redirectUri = UriResolver.ResolveUrl(url,location);
                //
                //						if ( this.SafeSession.IsCookieUpdatable )
                //						{
                //							// get cookies from cookie manager
                //							cookies = cookieManager.GetCookies(new Uri(redirectUri));
                //						}
                //						else
                //						{
                //							// else use saved cookies
                //							cookies = sessionRequest.RequestCookies;
                //						}
                //
                //						this.ApplyUrlRedirection(state, cookies,httpSettings, redirectUri);
                //					}
                //					#endregion
                //				}
                //				else
                //				{
                #region Get Request
                // get cookies.
                if ( this.SafeSession.IsCookieUpdatable )
                {
                    // get cookies from cookie manager
                    cookies = cookieManager.GetCookies(sessionRequest.Url);
                }
                else
                {
                    // else use saved cookies
                    cookies = sessionRequest.RequestCookies;
                }

                this.DisplaySessionProcessEvent(this, new SessionCommandProcessEventArgs("Requesting " + sessionRequest.Url.ToString()));

                // Request, we only use url, http settings and cookies, because
                // IE doesn't returns and arraylist of values for GET requests.
                this.StartGetRequest(safeSessionGetRequest,
                    sessionRequest.Url.ToString(),
                    null,
                    cookies,
                    httpSettings,
                    state);
                #endregion
                //}
            }
            else
            {
                #region Post Request
                PostSessionRequest sessionRequest = (PostSessionRequest)safeSession.SessionRequests[k];

                // Post url
                string postUrl = String.Empty;

                #region Update post url
                //if ( this.TestSession.SessionRequests[k].UpdateSessionUrl )
                //{
                Uri postUri = null;

                // if response headers null, use from response buffer
                if ( sessionRequest.ResponseHeaders == null )
                {
                    postUri = (Uri)responseBufferData.ResponseHeaderCollection["Response Uri"];
                }
                else
                {
                    // if it has uri
                    if ( sessionRequest.ResponseHeaders.ContainsKey("Response Uri") )
                    {
                        if ( sessionRequest.ResponseHeaders["Response Uri"] != null )
                        {
                            postUri = (Uri)sessionRequest.ResponseHeaders["Response Uri"];
                        }
                    }
                }

                string s = string.Empty;

                if ( postUri.Query.Length > 0 )
                {
                    s = postUri.AbsoluteUri.Replace(postUri.Query,"");
                }
                else
                {
                    s = postUri.AbsoluteUri;
                }

                string action = parser.GetFormActionByAbsoluteUrl(s, responseBufferData.HttpBody);

                if ( action == "" )
                {
                    postUrl = s;
                }
                else
                {
                    // Resolve url
                    postUrl = UriResolver.ResolveUrl(postUri,action);
                }
                //}
                #endregion

                // get cookies.
                if ( this.SafeSession.IsCookieUpdatable )
                {
                    // get cookies from cookie manager
                    cookies = cookieManager.GetCookies(new Uri(postUrl));
                }
                else
                {
                    // else use saved cookies
                    cookies = sessionRequest.RequestCookies;
                }

                SessionCommandProcessEventArgs args = new SessionCommandProcessEventArgs("Requesting " + postUrl);

                // Check form for updates session values
                // Convert form
                ArrayList listValues = parser.ConvertToArrayList(sessionRequest.Form, responseBufferData.HttpBody);

                // Display posted values
                string posted = ConvertToPostDataString(listValues);
                args.Detail = "Posted data: " + posted;
                args.ProcessType = SessionProcessType.SafeRequest;
                this.DisplaySessionProcessEvent(this, args);

                // Request post
                this.StartPostRequest(safeSessionPostRequest,
                    postUrl,
                    listValues,
                    cookies,
                    httpSettings,
                    state);

                #endregion
            }
        }
        /// <summary>
        /// Apply the test requests for a session request.
        /// </summary>
        /// <param name="sessionRequest"> The session request.</param>
        /// <param name="result"> The response buffer result from the safe session.</param>
        private void ApplyRequestTests(SessionRequest sessionRequest, ResponseBuffer result)
        {
            UnitTestItem unitTestItem = sessionRequest.WebUnitTest;
            unitTestItem.Form = sessionRequest.Form;

            CookieCollection cookies = null;

            //int availableTests = this.AvailableTests();
            //bool lastItem = false;
            string requestUrl = sessionRequest.Url.ToString();

            #region Run each test in SessionRequest WebUnitTestItem

            // run each test in Form
            foreach (DictionaryEntry de in unitTestItem.Tests)
            {
                Test test = (Test)de.Value;
                ArrayList values = new ArrayList();

                // get cookies
                cookies = cookieManager.GetCookies(sessionRequest.Url);

                // set current test index
                unitTestItem.SelectedTestIndex = unitTestItem.Tests.IndexOfValue(test);

                // create SessionCommandProcessEventArgs
                SessionCommandProcessEventArgs args = new SessionCommandProcessEventArgs("Applying test '" + test.Name + "' to " + sessionRequest.Url.ToString());
                args.ProcessType = SessionProcessType.TestRequest;

                #region Apply Test
                // --------------------------------------------------------------------------------
                // Process data
                // Html Form Tag
                if ( test.UnitTestDataType == UnitTestDataContainer.HtmlFormTag )
                {
                    // is a form tag
                    // apply test to form
                    HtmlFormTag filledForm = ApplyTestToForm(test, sessionRequest.Form.CloneTag());
                    values = parser.ConvertToArrayList(filledForm, result.HttpBody, updateElementNames);
                }
                // Post Data Hashtable
                if ( test.UnitTestDataType == UnitTestDataContainer.PostDataHashtable )
                {
                    string postdata = ((PostSessionRequest)sessionRequest).PostData;

                    // convert post data to hashtable
                    FormConverter converter = new FormConverter();
                    Hashtable postDataHash = converter.ConvertPostDataString(postdata);

                    // Applies test to post data hashtable
                    Hashtable filledPostData = ApplyTestToPostData(test, (Hashtable)postDataHash.Clone());
                    values = converter.ConvertPostDataArrayList(filledPostData);
                }
                // Cookies
                if ( test.UnitTestDataType == UnitTestDataContainer.Cookies )
                {
                    cookies = ApplyTestToCookies(test, cookies);
                }
                // Url
                if( test.UnitTestDataType == UnitTestDataContainer.NoPostData )
                {
                    // a url test
                    requestUrl = ApplyTestToUrl(test, WebServerUriType.Normal,sessionRequest.Url).ToString();
                }
                // -----------------------------------------------------------------------------------
                #endregion

                if ( (test.UnitTestDataType == UnitTestDataContainer.HtmlFormTag ) || ( test.UnitTestDataType == UnitTestDataContainer.PostDataHashtable ) )
                {
                    // Set post data for report
                    test.Arguments.PostData = ConvertToPostDataString(values);
                    args.Detail = "Posted Data:" + test.Arguments.PostData;
                }
                if ( test.UnitTestDataType == UnitTestDataContainer.NoPostData )
                {
                    args.Detail = "Url query:" + requestUrl;
                }
                if ( test.UnitTestDataType == UnitTestDataContainer.Cookies )
                {
                    StringBuilder cookieQuery = new StringBuilder();

                    foreach ( Cookie cky in cookies )
                    {
                        cookieQuery.Append("Name:" + cky.Name);
                        cookieQuery.Append(", ");
                        cookieQuery.Append("Value:" + cky.Value);
                        cookieQuery.Append(";");
                    }

                    args.Detail = "Cookie:" + cookieQuery.ToString();
                }

                //				// set last item flag
                //				if ( availableTests == 1)
                //				{
                //					lastItem = true;
                //				}

                // display the current processing
                this.DisplaySessionProcessEvent(this,args);

                // clone test item and set last item value
                HttpState httpRequestState = new HttpState();
                httpRequestState.TestItem = unitTestItem.Clone();
                //httpRequestState.IsLastItem = lastItem;

                // http settings
                HttpProperties httpSettings = null;
                if ( sessionRequest.RequestHttpSettings == null )
                {
                    httpSettings = unitTestGetRequest.ClientSettings;
                }
                else
                {
                    httpSettings = sessionRequest.RequestHttpSettings;
                }

                if ( sessionRequest.RequestType == HttpRequestType.GET )
                {
                    // get request
                    this.StartGetRequest(unitTestGetRequest,
                        requestUrl,
                        null,
                        cookies,
                        httpSettings,
                        httpRequestState);
                }
                else
                {
                    // post request
                    this.StartPostRequest(unitTestPostRequest,
                        requestUrl,
                        values,
                        cookies,
                        httpSettings,
                        httpRequestState);
                }

                //availableTests--;
            }
            #endregion
        }