private byte[] GetReplyMultipartFormData(ThreadReplyData data) { Stream dataStream = new MemoryStream(); StringBuilder sb = new StringBuilder(); AddFormDataString(sb, "action", REPLY_ACTION_REQUEST, REPLY_HEADER); AddFormDataString(sb, "threadid", data.THREADID, REPLY_HEADER); AddFormDataString(sb, "formkey", data.FORMKEY, REPLY_HEADER); AddFormDataString(sb, "form_cookie", data.FORMCOOKIE, REPLY_HEADER); AddFormDataString(sb, "message", data.TEXT, REPLY_HEADER); AddFormDataString(sb, "parseurl", PARSEURL_REQUEST, REPLY_HEADER); AddFormDataString(sb, "submit", SUBMIT_REQUEST, REPLY_HEADER); sb.AppendLine(REPLY_FOOTER); string content = sb.ToString(); AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Begin form data..."); AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, content); AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "..End form data."); dataStream.Write(encoding.GetBytes(content), 0, content.Length); dataStream.Position = 0; byte[] formData = new byte[dataStream.Length]; dataStream.Read(formData, 0, formData.Length); dataStream.Close(); return(formData); }
private ThreadReplyData GetReplyFormInfo(string threadID, HtmlDocument doc) { ThreadReplyData data = new ThreadReplyData(); data.THREADID = threadID; var formNodes = doc.DocumentNode.Descendants("input").ToArray(); var formKeyNode = formNodes .Where(node => node.GetAttributeValue("name", "").Equals("formkey")) .FirstOrDefault(); var formCookieNode = formNodes .Where(node => node.GetAttributeValue("name", "").Equals("form_cookie")) .FirstOrDefault(); try { data.FORMKEY = formKeyNode.GetAttributeValue("value", ""); data.FORMCOOKIE = formCookieNode.GetAttributeValue("value", ""); } catch (Exception) { throw new InvalidOperationException("Could not parse newReply form data."); } return(data); }
private Uri InitiateReply(ThreadReplyData data, int timeout = DEFAULT_TIMEOUT) { // create request AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Creating Reply Request..."); string url = "http://forums.somethingawful.com/newreply.php"; var request = AwfulWebRequest.CreateFormDataPostRequest(url, REPLY_CONTENT_TYPE); if (request == null) { throw new NullReferenceException("request is not an http request."); } request.AllowAutoRedirect = true; // begin request stream AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Beginning Request Stream..."); var signal = new AutoResetEvent(false); var result = request.BeginGetRequestStream(callback => { signal.Set(); }, request); signal.WaitOne(); // process request AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Creating Form Data..."); FormDataDelegate replyFormData = () => { return(GetReplyMultipartFormData(data)); }; var success = ProcessReplyRequest(result, replyFormData); // begin response AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Waiting for response..."); request = result.AsyncState as HttpWebRequest; result = request.BeginGetResponse(callback => { signal.Set(); }, request); signal.WaitOne(timeout); if (!result.IsCompleted) { throw new TimeoutException("Thread Reply: timeout reached"); } // process response and return status value AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Processing response..."); Uri redirect = HandleGetResponse(result); return(redirect); }
private void InitiateReply(ThreadReplyData data, Action<ActionResult> result) { var dispatch = Deployment.Current.Dispatcher; Logger.AddEntry("ThreadReplyService - Initiating Reply..."); try { string url = "http://forums.somethingawful.com/newreply.php"; request = AwfulWebRequest.CreateFormDataPostRequest(url, REPLY_CONTENT_TYPE); if (request == null) throw new NullReferenceException("request is not an http request."); request.AllowAutoRedirect = true; request.BeginGetRequestStream((asyncResult) => { byte[] formData = GetReplyMultipartFormData(data); var requestSuccessful = HandleGetRequest(asyncResult, formData); if (!requestSuccessful) { Logger.AddEntry("ThreadReplyService - Reply failed @ GetRequest."); dispatch.BeginInvoke(() => { result(ActionResult.Failure); }); return; } HttpWebRequest webRequest = asyncResult.AsyncState as HttpWebRequest; webRequest.BeginGetResponse(getResponseResult => { var responseSuccessful = HandleGetResponse(getResponseResult); if (!responseSuccessful) { Logger.AddEntry("ThreadReplyService - Reply failed @ GetResponse."); dispatch.BeginInvoke(() => { result(ActionResult.Failure); }); } else { Logger.AddEntry("ThreadReplyService - Reply successful."); dispatch.BeginInvoke(() => { result(ActionResult.Success); }); } }, webRequest); }, request); } catch (Exception) { Logger.AddEntry("ThreadReplyService - Reply failed."); dispatch.BeginInvoke(() => { result(ActionResult.Failure); }); } }
private byte[] GetReplyMultipartFormData(ThreadReplyData data) { Stream dataStream = new MemoryStream(); StringBuilder sb = new StringBuilder(); AddFormDataString(sb, "action", REPLY_ACTION_REQUEST, REPLY_HEADER); AddFormDataString(sb, "threadid", data.THREADID, REPLY_HEADER); AddFormDataString(sb, "formkey", data.FORMKEY, REPLY_HEADER); AddFormDataString(sb, "form_cookie", data.FORMCOOKIE, REPLY_HEADER); AddFormDataString(sb, "message", data.TEXT, REPLY_HEADER); AddFormDataString(sb, "parseurl", PARSEURL_REQUEST, REPLY_HEADER); AddFormDataString(sb, "submit", SUBMIT_REQUEST, REPLY_HEADER); sb.AppendLine(REPLY_FOOTER); string content = sb.ToString(); dataStream.Write(encoding.GetBytes(content), 0, content.Length); dataStream.Position = 0; byte[] formData = new byte[dataStream.Length]; dataStream.Read(formData, 0, formData.Length); dataStream.Close(); return formData; }
private ThreadReplyData GetReplyFormInfo(string threadID, HtmlDocument doc) { ThreadReplyData data = new ThreadReplyData(); data.THREADID = threadID; var formNodes = doc.DocumentNode.Descendants("input").ToArray(); var formKeyNode = formNodes .Where(node => node.GetAttributeValue("name", "").Equals("formkey")) .FirstOrDefault(); var formCookieNode = formNodes .Where(node => node.GetAttributeValue("name", "").Equals("form_cookie")) .FirstOrDefault(); try { data.FORMKEY = formKeyNode.GetAttributeValue("value", ""); data.FORMCOOKIE = formCookieNode.GetAttributeValue("value", ""); } catch (Exception) { throw new InvalidOperationException("Could not parse newReply form data."); } return data; }
private Uri InitiateReply(ThreadReplyData data, int timeout = DEFAULT_TIMEOUT) { // create request AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Creating Reply Request..."); string url = "http://forums.somethingawful.com/newreply.php"; var request = AwfulWebRequest.CreateFormDataPostRequest(url, REPLY_CONTENT_TYPE); if (request == null) throw new NullReferenceException("request is not an http request."); request.AllowAutoRedirect = true; // begin request stream AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Beginning Request Stream..."); var signal = new AutoResetEvent(false); var result = request.BeginGetRequestStream(callback => { signal.Set(); }, request); signal.WaitOne(); // process request AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Creating Form Data..."); FormDataDelegate replyFormData = () => { return GetReplyMultipartFormData(data); }; var success = ProcessReplyRequest(result, replyFormData); // begin response AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Waiting for response..."); request = result.AsyncState as HttpWebRequest; result = request.BeginGetResponse(callback => { signal.Set(); }, request); signal.WaitOne(timeout); if (!result.IsCompleted) throw new TimeoutException("Thread Reply: timeout reached"); // process response and return status value AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Processing response..."); Uri redirect = HandleGetResponse(result); return redirect; }