/// <summary>
        /// Begins a new asynchronous SOAP HTTP request. This function is not thread safe.
        /// </summary>
        /// <param name="context"> The HttpRequestResponseContext type.</param>
        public void ExecuteSoapHttpWebRequest(HttpRequestResponseContext context)
        {
            HtmlParser parser = new HtmlParser();
            ScriptingHttpState httpRequestState = new ScriptingHttpState();
            httpRequestState.HttpRequestResponseContext = context;

            string uriString = context.Request.Url;

            if ( context.DecodeUrl )
            {
                uriString = EncodeDecode.UrlDecode(uriString);
            }

            bool isException = false;
            // create webrequest
            try
            {
                //this.ValidateIPAddress(new Uri(uriString));
                httpRequestState.HttpRequest = (HttpWebRequest)System.Net.WebRequest.Create(uriString);

                // Set HttpWebRequestProperties
                SetHttpWebRequestProperties(httpRequestState.HttpRequest, context.Request.RequestHttpSettings);

                // Apply proxy settings
                if ( this.ProxySettings != null )
                {
                    SetProxy(httpRequestState.HttpRequest,this.ProxySettings);
                }

                // Save cookies
                httpRequestState.HttpRequest.CookieContainer = new CookieContainer();
                if ( context.Request.Cookies != null )
                {
                    httpRequestState.HttpRequest.CookieContainer.Add(context.Request.GetCookieCollection());
                }

                byte[] data=null;
                SoapHttpWebRequest soapWebRequest = (SoapHttpWebRequest)context.Request;
                if ( soapWebRequest.XmlEnvelope != null )
                {
                    data = Encoding.UTF8.GetBytes(soapWebRequest.XmlEnvelope.OuterXml);

                    // set properties
                    //httpRequestState.HttpRequest.KeepAlive = true;
                    //httpRequestState.HttpRequest.Timeout = 10000;
                    httpRequestState.HttpRequest.Method = "POST";
                    httpRequestState.HttpRequest.ContentType = context.Request.RequestHttpSettings.ContentType;
                    httpRequestState.HttpRequest.ContentLength = data.Length;

                    // get request stream
                    Stream stm = httpRequestState.HttpRequest.GetRequestStream();
                    stm.Write(data,0,data.Length);
                    stm.Flush();
                    stm.Close();
                }

                // Get Response
                IAsyncResult ar = httpRequestState.HttpRequest.BeginGetResponse(new AsyncCallback(SessionScriptingCallback),httpRequestState);

                // register a timeout
                ThreadPool.RegisterWaitForSingleObject(ar.AsyncWaitHandle, new WaitOrTimerCallback(BaseHttpForm.RequestTimeoutCallback), httpRequestState, this.GetTimeout(), true);

            }
            catch
            {
                isException = true;
                throw;
            }
            finally
            {
                if (isException)
                {
                    if (httpRequestState.HttpResponse != null)
                    {
                        httpRequestState.HttpResponse.Close();
                    }
                }
            }
        }
        /// <summary>
        /// Begins a new asynchronous HTTP Delete request. This function is not thread safe.
        /// </summary>
        /// <param name="context"> The HttpRequestResponseContext context.</param>
        public void ExecuteDeleteWebRequest(HttpRequestResponseContext context)
        {
            // string uri = context.Request.Url;

            ScriptingHttpState httpRequestState = new ScriptingHttpState();

            // Update Url if form exists
            context.Request.Url = UpdateUrl(context.Request.Form.WriteHtmlFormTag(), context.Request.Url, false);

            string uri = context.Request.Url;
            httpRequestState.HttpRequestResponseContext = context;

            if ( context.DecodeUrl )
            {
                uri = EncodeDecode.UrlDecode(uri);
            }

            bool isException = false;
            try
            {
                //this.ValidateIPAddress(new Uri(uri));

                httpRequestState.HttpRequest = (HttpWebRequest)System.Net.WebRequest.Create(uri);

                // Set HttpWebRequestProperties
                SetHttpWebRequestProperties(httpRequestState.HttpRequest, context.Request.RequestHttpSettings);

                // Apply proxy settings
                if ( ProxySettings != null )
                {
                    SetProxy(httpRequestState.HttpRequest, ProxySettings);
                }

                // Continue headers
                //hwr.ContinueDelegate=getRedirectHeaders;

                // Save cookies
                httpRequestState.HttpRequest.CookieContainer = new CookieContainer();
                if ( context.Request.Cookies != null )
                {
                    httpRequestState.HttpRequest.CookieContainer.Add(context.Request.GetCookieCollection());
                }

                // Begin requesting...
                IAsyncResult ar = httpRequestState.HttpRequest.BeginGetResponse(new AsyncCallback(SessionScriptingCallback),httpRequestState);

                // register a timeout
                ThreadPool.RegisterWaitForSingleObject(ar.AsyncWaitHandle, new WaitOrTimerCallback(BaseHttpForm.RequestTimeoutCallback), httpRequestState, this.GetTimeout(), true);
            }
            catch
            {
                isException = true;
                throw;
            }
            finally
            {
                if (isException)
                {
                    if (httpRequestState.HttpResponse != null)
                    {
                        httpRequestState.HttpResponse.Close();
                    }
                }
            }
        }
        /// <summary>
        /// Begins a new asynchronous HTTP Post request. This function is not thread safe.
        /// </summary>
        /// <param name="context"> The HttpRequestResponseContext type.</param>
        public void ExecutePostWebRequestFileUpload(HttpRequestResponseContext context)
        {
            PostWebRequest postWebRequest = (PostWebRequest)context.Request;

            HtmlFormTag formTag = postWebRequest.Form.WriteHtmlFormTag();
            UploadFileInfo[] fileInfoItems = UploadFileInfo.GetUploadFiles(formTag);

            HtmlParser parser = new HtmlParser();
            ScriptingHttpState httpRequestState = new ScriptingHttpState();
            httpRequestState.HttpRequestResponseContext = context;

            string uriString = context.Request.Url;

            if ( context.DecodeUrl )
            {
                uriString = EncodeDecode.UrlDecode(uriString);
            }

            bool isException = false;
            // create webrequest
            try
            {
                httpRequestState.HttpRequest = (HttpWebRequest)System.Net.WebRequest.Create(uriString);

                // Set HttpWebRequestProperties
                SetHttpWebRequestProperties(httpRequestState.HttpRequest, context.Request.RequestHttpSettings);

                // Apply proxy settings
                if ( this.ProxySettings != null )
                {
                    SetProxy(httpRequestState.HttpRequest,this.ProxySettings);
                }

                // Save cookies
                httpRequestState.HttpRequest.CookieContainer = new CookieContainer();
                if ( context.Request.Cookies != null )
                {
                    httpRequestState.HttpRequest.CookieContainer.Add(context.Request.GetCookieCollection());
                }

                #region Post Data
                string boundary  = "--------------" + DateTime.Now.Ticks.ToString("x");

                byte[] data = null;
                // Build the trailing boundary string as a byte array
                // ensuring the boundary appears on a line by itself
                byte[] boundaryBytes = null;

                long sumFileLength = 0;
                foreach ( UploadFileInfo uploadFile in fileInfoItems )
                {
                    FileInfo fileInformation = new FileInfo(uploadFile.FileName);
                    sumFileLength += fileInformation.Length;
                }

                string postdata = GenerateMimeFormData(boundary, formTag, fileInfoItems);
                data = Encoding.UTF8.GetBytes(postdata);

                long length;

                if ( fileInfoItems.Length == 0 )
                {
                    boundaryBytes = Encoding.ASCII.GetBytes("--" + boundary + "--\r\n\0");
                    length = data.Length + sumFileLength +
                        boundaryBytes.Length;
                }
                else
                {
                    boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
                    length = data.Length + sumFileLength +
                        boundaryBytes.Length;
                }

                // set properties
                //httpRequestState.HttpRequest.AllowWriteStreamBuffering = false;
                httpRequestState.HttpRequest.ServicePoint.Expect100Continue = false;
                httpRequestState.HttpRequest.KeepAlive = true;
                httpRequestState.HttpRequest.Timeout = 120000;
                httpRequestState.HttpRequest.Method = "POST";
                httpRequestState.HttpRequest.ContentType = "multipart/form-data; boundary=" + boundary;
                httpRequestState.HttpRequest.ContentLength = length;
                httpRequestState.HttpRequest.Headers.Add("Cache-Control","no-cache");

                // get request stream and write header
                Stream stm = httpRequestState.HttpRequest.GetRequestStream();
                stm.Write(data,0,data.Length);

                if ( fileInfoItems.Length > 0 )
                {
                    foreach ( UploadFileInfo uploadFile in fileInfoItems )
                    {
                        UploadFile(uploadFile, boundaryBytes, stm);
                    }
                }
                stm.Write(boundaryBytes, 0, boundaryBytes.Length);
                stm.Flush();
                stm.Close();
                #endregion

                // Get Response
                IAsyncResult ar = httpRequestState.HttpRequest.BeginGetResponse(new AsyncCallback(SessionScriptingCallback),httpRequestState);

                // register a timeout
                ThreadPool.RegisterWaitForSingleObject(ar.AsyncWaitHandle, new WaitOrTimerCallback(BaseHttpForm.RequestTimeoutCallback), httpRequestState, this.GetTimeout(), true);

            }
            catch
            {
                isException = true;
                throw;
            }
            finally
            {
                if (isException)
                {
                    if (httpRequestState.HttpResponse != null)
                    {
                        httpRequestState.HttpResponse.Close();
                    }
                }
            }
        }
        /// <summary>
        /// Begins a new  HTTP Post request. This function is not thread safe.
        /// </summary>
        /// <param name="context"> The HttpRequestResponseContext type.</param>
        public ResponseBuffer ExecutePostWebRequestSync(HttpRequestResponseContext context)
        {
            ResponseBuffer result = null;
            HtmlParser parser = new HtmlParser();
            ArrayList values = parser.GetArrayList(context.Request.Form.WriteHtmlFormTag());

            ScriptingHttpState httpRequestState = new ScriptingHttpState();
            httpRequestState.HttpRequestResponseContext = context;

            string uriString = context.Request.Url;

            if (context.DecodeUrl)
            {
                uriString = EncodeDecode.UrlDecode(uriString);
            }

            bool isException = false;

            // create webrequest
            try
            {
                //this.ValidateIPAddress(new Uri(uriString));

                httpRequestState.HttpRequest = (HttpWebRequest)System.Net.WebRequest.Create(uriString);

                // Set HttpWebRequestProperties
                SetHttpWebRequestProperties(httpRequestState.HttpRequest, context.Request.RequestHttpSettings);

                // Apply proxy settings
                if (this.ProxySettings != null)
                {
                    SetProxy(httpRequestState.HttpRequest, this.ProxySettings);
                }

                //httpRequestState.httpRequest.Referer = postUri;

                // Continue headers
                //hwr.ContinueDelegate = getRedirectHeaders;

                // Save cookies
                httpRequestState.HttpRequest.CookieContainer = new CookieContainer();
                if (context.Request.Cookies != null)
                {
                    httpRequestState.HttpRequest.CookieContainer.Add(context.Request.GetCookieCollection());
                }

                byte[] data = null;
                if (values != null)
                {
                    PostWebRequest postWebRequest = (PostWebRequest)context.Request;
                    string postData = string.Empty;

                    if (postWebRequest.UsePostData)
                    {
                        postData = postWebRequest.PostData;
                        httpRequestState.HttpRequest.ContentType = context.Request.RequestHttpSettings.ContentType;
                    }
                    else
                    {
                        // transform to postdata and encode in bytes
                        postData = GetPostData(values);
                        httpRequestState.HttpRequest.ContentType = "application/x-www-form-urlencoded";
                    }

                    data = Encoding.UTF8.GetBytes(postData);

                    // set properties
                    //httpRequestState.HttpRequest.AllowWriteStreamBuffering = false;
                    httpRequestState.HttpRequest.KeepAlive = true;
                    //httpRequestState.HttpRequest.Timeout = 120000;
                    httpRequestState.HttpRequest.Method = "POST";
                    httpRequestState.HttpRequest.ContentLength = data.Length;

                    // get request stream
                    Stream stm = httpRequestState.HttpRequest.GetRequestStream();
                    stm.Write(data, 0, data.Length);
                    stm.Flush();
                    stm.Close();
                }

                result = CreateSyncResponse(httpRequestState);

                // Get Response
                // IAsyncResult ar = httpRequestState.HttpRequest.BeginGetResponse(new AsyncCallback(SessionScriptingCallback), httpRequestState);

                // register a timeout
                // ThreadPool.RegisterWaitForSingleObject(ar.AsyncWaitHandle, new WaitOrTimerCallback(BaseHttpForm.RequestTimeoutCallback), httpRequestState, this.GetTimeout(), true);

            }
            catch
            {
                isException = true;
                throw;
            }
            finally
            {
                if (isException)
                {
                    if (httpRequestState.HttpResponse != null)
                    {
                        httpRequestState.HttpResponse.Close();
                    }
                }
            }

            return result;
        }
        /// <summary>
        /// Sends POST Requests.
        /// </summary>
        /// <param name="postUri"> Post uri.</param>
        /// <param name="values"> Values to post.</param>
        /// <param name="stateData"> ResponseBuffer from site.</param>
        /// <param name="cookies"> Cookies from site.</param>
        /// <param name="formTag"> The HtmlFormTag value.</param>
        private void GetPostRequest(string postUri,ArrayList values,ResponseBuffer stateData, CookieCollection cookies, HtmlFormTag formTag)
        {
            // disable
            DisableFormView();

            // add Messaging
            ShowPostRequestMessage(postUri);

            if ( values != null )
                ShowPostedData(values);

            try
            {
                InitializeHttpCommands();
                postForm.ProxySettings = this.ProxySettings;

                if ( formTag.Enctype.ToLower(System.Globalization.CultureInfo.InvariantCulture) == "multipart/form-data" )
                {
                    HttpRequestResponseContext context = new HttpRequestResponseContext();
                    PostWebRequest postReq = new PostWebRequest();
                    postReq.Form.ReadHtmlFormTag(formTag);
                    Ecyware.GreenBlue.Engine.Scripting.Cookies c = new Cookies(cookies);
                    postReq.Cookies =  c.GetCookies();
                    postReq.RequestType = HttpRequestType.POST;
                    postReq.Url = postUri;
                    postReq.RequestHttpSettings = this.GetHttpPropertiesFromPanel();
                    context.Request = postReq;

                    postForm.StartAsyncHttpPostFileUpload(context);
                }
                else
                {
                    postForm.StartAsyncHttpPost(postUri,this.GetHttpPropertiesFromPanel(),values,cookies);
                }
            }
            catch ( Exception ex )
            {
                this.txtMessaging.SelectionColor = Color.Red;
                this.txtMessaging.SelectedText = "Html Browser Error: " + ex.Message + "\r\n";

                textViewerForm.EditorText = ex.Message;
                // enable
                EnableFormView();
                this.navForm.StopNavigation();
                this.StopProgressBarEvent(this,new ProgressBarControlEventArgs("Ready"));
            }
        }