Пример #1
0
        internal static IHttpObservable Submit <T>(IHttpClient http,
                                                   ParsedHtml html,
                                                   string formSelector, int?formIndex, Uri actionUrl,
                                                   Func <HtmlForm, ISubmissionData <T> > submissions)
        {
            var forms =
                from f in formIndex == null
                          ? html.QueryFormSelectorAll(formSelector)
                          : formIndex < html.Forms.Count
                          ? Enumerable.Repeat(html.Forms[(int)formIndex], 1)
                          : Enumerable.Empty <HtmlForm>()
                select new
            {
                Object = f,
                Action = new Uri(html.TryBaseHref(f.Action), UriKind.Absolute),
                // f.EncType, // TODO validate
                Data = f.GetSubmissionData(),
            };

            var form = forms.FirstOrDefault();

            if (form == null)
            {
                throw new Exception("No HTML form for submit.");
            }

            submissions(form.Object).Run(form.Data);

            return(form.Object.Method == HtmlFormMethod.Post
                 ? http.Post(actionUrl ?? form.Action, form.Data)
                 : http.Get(new UriBuilder(actionUrl ?? form.Action)
            {
                Query = form.Data.ToW3FormEncoded()
            }.Uri));
        }
Пример #2
0
        static IQuery <HttpFetch <HttpContent> > Submit(ParsedHtml html,
                                                        string formSelector, int?formIndex,
                                                        NameValueCollection data)
        {
            var forms =
                from f in formIndex == null
                          ? html.QueryFormSelectorAll(formSelector)
                          : formIndex < html.Forms.Count
                          ? Enumerable.Repeat(html.Forms[(int)formIndex], 1)
                          : Enumerable.Empty <HtmlForm>()
                select new
            {
                Action = new Uri(html.TryBaseHref(f.Action), UriKind.Absolute),
                f.Method,
                f.EncType,     // TODO validate
                Data = f.GetSubmissionData(),
            };

            var form = forms.FirstOrDefault();

            if (form == null)
            {
                throw new Exception("No HTML form for submit.");
            }

            if (data != null)
            {
                foreach (var e in data.AsEnumerable())
                {
                    form.Data.Remove(e.Key);
                    if (e.Value.Length == 1 && e.Value[0] == null)
                    {
                        continue;
                    }
                    foreach (var value in e.Value)
                    {
                        form.Data.Add(e.Key, value);
                    }
                }
            }

            return(form.Method == HtmlFormMethod.Post
                 ? Http.Post(form.Action, form.Data)
                 : Http.Get(new UriBuilder(form.Action)
            {
                Query = form.Data.ToW3FormEncoded()
            }.Uri));
        }
Пример #3
0
        internal static IHttpObservable Submit(IHttpClient http,
                                               ParsedHtml html,
                                               string formSelector, int?formIndex, Uri actionUrl,
                                               NameValueCollection data)
        {
            var submission = SubmissionData.Return(Unit.Default);

            if (data != null)
            {
                foreach (var e in data.AsEnumerable())
                {
                    submission = submission.Do(fsc => fsc.Remove(e.Key));
                    if (e.Value.Length == 1 && e.Value[0] == null)
                    {
                        continue;
                    }
                    submission = e.Value.Aggregate(submission, (current, value) => current.Do(fsc => fsc.Add(e.Key, value)));
                }
            }

            return(Submit(http, html, formSelector, formIndex, actionUrl, _ => submission));
        }
Пример #4
0
 public static IQuery <HttpFetch <HttpContent> > Submit(ParsedHtml html, int formIndex, NameValueCollection data) =>
 Submit(html, null, formIndex, data);
Пример #5
0
 public static IQuery <HttpFetch <HttpContent> > Submit(ParsedHtml html, string formSelector, NameValueCollection data) =>
 Submit(html, formSelector, null, data);
Пример #6
0
 public static IHttpObservable SubmitTo(this IHttpClient http, Uri url, ParsedHtml html, int formIndex, NameValueCollection data) =>
 Submit(http, html, null, formIndex, url, data);
Пример #7
0
 public static IHttpObservable SubmitTo(this IHttpClient http, Uri url, ParsedHtml html, string formSelector, NameValueCollection data) =>
 Submit(http, html, formSelector, null, url, data);
Пример #8
0
 public static IHttpObservable SubmitTo(this IHttpClient http, Uri url, ParsedHtml html, int formIndex, Func <HtmlForm, ISubmissionData <Unit> > data) =>
 Submit(http, html, null, formIndex, url, data);
Пример #9
0
 public static IHttpObservable SubmitTo(this IHttpClient http, Uri url, ParsedHtml html, string formSelector, Func <HtmlForm, ISubmissionData <Unit> > data) =>
 Submit(http, html, formSelector, null, url, data);
Пример #10
0
 public static IHttpObservable Submit(this IHttpClient http, ParsedHtml html, int formIndex, ISubmissionData <Unit> data) =>
 Submit(http, html, null, formIndex, null, _ => data);
Пример #11
0
 public static IHttpObservable Submit(this IHttpClient http, ParsedHtml html, string formSelector, ISubmissionData <Unit> data) =>
 Submit(http, html, formSelector, null, null, _ => data);