示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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); }); }
        }
示例#5
0
        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;
        }
示例#6
0
        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;
        }
示例#7
0
        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;
        }