AngleSharp by AngleSharp

<PackageReference Include="AngleSharp" Version="1.0.0-alpha-231" />

 FormDataSet

public sealed class FormDataSet : IEnumerable<string>, IEnumerable
Bundles information stored in HTML forms.
using AngleSharp.Dom; using AngleSharp.Html.Forms; using AngleSharp.Html.Forms.Submitters; using AngleSharp.Io.Dom; using AngleSharp.Text; using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.CompilerServices; using System.Text; namespace AngleSharp.Html { [System.Runtime.CompilerServices.NullableContext(1)] [System.Runtime.CompilerServices.Nullable(0)] public sealed class FormDataSet : IEnumerable<string>, IEnumerable { private readonly List<FormDataSetEntry> _entries; private string _boundary; public string Boundary => _boundary; public FormDataSet() { _boundary = Guid.NewGuid().ToString(); _entries = new List<FormDataSetEntry>(); } public Stream AsMultipart(IHtmlEncoder htmlEncoder, [System.Runtime.CompilerServices.Nullable(2)] Encoding encoding = null) { return BuildRequestContent(encoding, delegate(StreamWriter stream) { Connect(new MultipartFormDataSetVisitor(htmlEncoder, stream.Encoding, _boundary), stream); }); } public Stream AsUrlEncoded([System.Runtime.CompilerServices.Nullable(2)] Encoding encoding = null) { return BuildRequestContent(encoding, delegate(StreamWriter stream) { Connect(new UrlEncodedFormDataSetVisitor(stream.Encoding), stream); }); } public Stream AsPlaintext([System.Runtime.CompilerServices.Nullable(2)] Encoding encoding = null) { return BuildRequestContent(encoding, delegate(StreamWriter stream) { Connect(new PlaintextFormDataSetVisitor(), stream); }); } public Stream AsJson() { return BuildRequestContent(TextEncoding.Utf8, delegate(StreamWriter stream) { Connect(new JsonFormDataSetVisitor(), stream); }); } public Stream As(IFormSubmitter submitter, [System.Runtime.CompilerServices.Nullable(2)] Encoding encoding = null) { return BuildRequestContent(encoding, delegate(StreamWriter stream) { Connect(submitter, stream); }); } public void Append(string name, string value, string type) { if (type.Isi(InputTypeNames.Radio)) { FormDataSetEntry formDataSetEntry = _entries.FirstOrDefault(delegate(FormDataSetEntry s) { if (s.Name.Is(name)) return s.Type.Isi(InputTypeNames.Radio); return false; }); if (formDataSetEntry != null) _entries.Remove(formDataSetEntry); } if (type.Isi(TagNames.Textarea)) { name = name.NormalizeLineEndings(); value = value.NormalizeLineEndings(); } _entries.Add(new TextDataSetEntry(name, value, type)); } public void Append(string name, IFile value, string type) { if (type.Isi(InputTypeNames.File)) name = name.NormalizeLineEndings(); _entries.Add(new FileDataSetEntry(name, value, type)); } private Stream BuildRequestContent([System.Runtime.CompilerServices.Nullable(2)] Encoding encoding, Action<StreamWriter> process) { if (encoding == null) encoding = TextEncoding.Utf8; MemoryStream memoryStream = new MemoryStream(); FixPotentialBoundaryCollisions(encoding); ReplaceCharset(encoding); StreamWriter streamWriter = new StreamWriter(memoryStream, encoding); process(streamWriter); streamWriter.Flush(); memoryStream.Position = 0; return memoryStream; } private void Connect(IFormSubmitter submitter, StreamWriter stream) { foreach (FormDataSetEntry entry in _entries) { entry.Accept(submitter); } submitter.Serialize(stream); } private void ReplaceCharset(Encoding encoding) { for (int i = 0; i < _entries.Count; i++) { FormDataSetEntry formDataSetEntry = _entries[i]; if (!string.IsNullOrEmpty(formDataSetEntry.Name) && formDataSetEntry.Name == "_charset_" && formDataSetEntry.Type.Isi(InputTypeNames.Hidden)) _entries[i] = new TextDataSetEntry(formDataSetEntry.Name, encoding.WebName, formDataSetEntry.Type); } } private void FixPotentialBoundaryCollisions(Encoding encoding) { bool flag = false; do { for (int i = 0; i < _entries.Count; i++) { if (flag = _entries[i].Contains(_boundary, encoding)) { _boundary = Guid.NewGuid().ToString(); break; } } } while (flag); } public IEnumerator<string> GetEnumerator() { return (from m in _entries select m.Name).GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } }