/// <summary> /// Begins a new asynchronous HTTP Post request. This function is not thread safe. /// </summary> /// <param name="uriString"> The URL string.</param> /// <param name="clientSettings"> The client settings.</param> /// <param name="form"> The HTML Form tag.</param> /// <param name="cookies"> The cookies collection.</param> /// <param name="decodeUrl"> Decodes the url in Url and Html decoding.</param> public void StartAsyncHttpPost(string uriString, HttpProperties clientSettings, HtmlFormTag form, CookieCollection cookies, bool decodeUrl) { HtmlParser parser = new HtmlParser(); ArrayList values = parser.GetArrayList(form); httpRequestState = new HttpState(); if ( decodeUrl ) { uriString = EncodeDecode.UrlDecode(uriString); uriString = EncodeDecode.HtmlDecode(uriString); } // create webrequest try { //this.ValidateIPAddress(new Uri(uriString)); httpRequestState.HttpRequest = (HttpWebRequest)WebRequest.Create(uriString); // Set HttpWebRequestProperties SetHttpWebRequestProperties(httpRequestState.HttpRequest, clientSettings); // 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 ( cookies!=null ) { httpRequestState.HttpRequest.CookieContainer.Add(cookies); } byte[] data=null; if (values!=null) { // transform to postdata and encode in bytes string postData = GetPostData(values); data = Encoding.UTF8.GetBytes(postData); // set properties httpRequestState.HttpRequest.Method="POST"; httpRequestState.HttpRequest.ContentType="application/x-www-form-urlencoded"; 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(FastResponseCallback),httpRequestState); // register a timeout ThreadPool.RegisterWaitForSingleObject(ar.AsyncWaitHandle, new WaitOrTimerCallback(BaseHttpForm.RequestTimeoutCallback), httpRequestState, this.GetTimeout(), true); } catch { throw; } finally { 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> /// Generates a MIME multipart/form-data header. /// </summary> /// <param name="boundary"> The boundary.</param> /// <param name="formTag"> The HtmlFormTag value.</param> /// <param name="fileItems"> The UploadFileInfo items.</param> /// <returns> A MIME multipart/form-data header string.</returns> protected string GenerateMimeFormData(string boundary, Ecyware.GreenBlue.Engine.HtmlDom.HtmlFormTag formTag, UploadFileInfo[] fileItems) { // create hashtable for upload file infos. Hashtable files = new Hashtable(); foreach ( UploadFileInfo fileInfo in fileItems ) { files.Add(fileInfo.FormFieldName, fileInfo); } HtmlParser parser = new HtmlParser(); ArrayList values = parser.GetArrayList(formTag); StringBuilder mimeData = new StringBuilder(); // Create form fields foreach ( string nameValuePair in values ) { string name = EncodeDecode.UrlDecode(nameValuePair.Split('=')[0]); string value = EncodeDecode.UrlDecode(nameValuePair.Split('=')[1].Trim().Trim('\0')).Trim('\0'); // skip keys from UploadFileItems. if ( files.ContainsKey(name) ) { UploadFileInfo fileInfo = (UploadFileInfo)files[name]; //-----------------------------7d52903b1507ec //\r\n //Content-Disposition: form-data; name=\"oFile1\"; filename=\"C:\\images\\GB Splash Screen.psd\" //\r\n //Content-Type: application/octet-stream //\r\n //\r\n mimeData.Append("--"); mimeData.Append(boundary); mimeData.Append("\r\n"); mimeData.AppendFormat("Content-Disposition: form-data; name=\"{0}\"",name); mimeData.AppendFormat("; filename=\"{0}\"",fileInfo.FileName); mimeData.Append("\r\n"); mimeData.Append("Content-Type: "); mimeData.Append(fileInfo.ContentType); mimeData.Append("\r\n"); mimeData.Append("\r\n"); } else { // Example //-----------------------------7d52903b1507ec //\r\n //Content-Disposition: form-data;name="Hello23" //\r\n //\r\n //Hello //\r\n mimeData.Append("--"); mimeData.Append(boundary); mimeData.Append("\r\n"); mimeData.AppendFormat("Content-Disposition: form-data; name=\"{0}\"",name); mimeData.Append("\r\n\r\n"); mimeData.Append(value); mimeData.Append("\r\n"); } } //mimeData.Append("\0"); return mimeData.ToString(); }