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)); }
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)); }
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)); }
public static IQuery <HttpFetch <HttpContent> > Submit(ParsedHtml html, int formIndex, NameValueCollection data) => Submit(html, null, formIndex, data);
public static IQuery <HttpFetch <HttpContent> > Submit(ParsedHtml html, string formSelector, NameValueCollection data) => Submit(html, formSelector, null, data);
public static IHttpObservable SubmitTo(this IHttpClient http, Uri url, ParsedHtml html, int formIndex, NameValueCollection data) => Submit(http, html, null, formIndex, url, data);
public static IHttpObservable SubmitTo(this IHttpClient http, Uri url, ParsedHtml html, string formSelector, NameValueCollection data) => Submit(http, html, formSelector, null, url, data);
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);
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);
public static IHttpObservable Submit(this IHttpClient http, ParsedHtml html, int formIndex, ISubmissionData <Unit> data) => Submit(http, html, null, formIndex, null, _ => data);
public static IHttpObservable Submit(this IHttpClient http, ParsedHtml html, string formSelector, ISubmissionData <Unit> data) => Submit(http, html, formSelector, null, null, _ => data);