AngleSharp by AngleSharp

<PackageReference Include="AngleSharp" Version="0.9.2" />

 FormDataSet

public sealed class FormDataSet : IEnumerable<string>, IEnumerable
Bundles information stored in HTML forms.
using AngleSharp.Dom.Io; using AngleSharp.Extensions; using AngleSharp.Html.Submitters; using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; namespace AngleSharp.Html { public sealed class FormDataSet : IEnumerable<string>, IEnumerable { private readonly List<FormDataSetEntry> _entries; private string _boundary; private static readonly string[] NewLines = new string[3] { "\r\n", "\r", "\n" }; public string Boundary => _boundary; public FormDataSet() { _boundary = Guid.NewGuid().ToString(); _entries = new List<FormDataSetEntry>(); } public Stream AsMultipart(Encoding encoding = null) { return Build(encoding, delegate(StreamWriter stream) { Connect(new MultipartFormDataSetVisitor(stream.Encoding, _boundary), stream); }); } public Stream AsUrlEncoded(Encoding encoding = null) { return Build(encoding, delegate(StreamWriter stream) { Connect(new UrlEncodedFormDataSetVisitor(stream.Encoding), stream); }); } public Stream AsPlaintext(Encoding encoding = null) { return Build(encoding, delegate(StreamWriter stream) { Connect(new PlaintextFormDataSetVisitor(), stream); }); } public Stream AsJson() { return Build(TextEncoding.Utf8, delegate(StreamWriter stream) { Connect(new JsonFormDataSetVisitor(), stream); }); } public Stream As(IFormSubmitter submitter, Encoding encoding = null) { return Build(encoding, delegate(StreamWriter stream) { Connect(submitter, stream); }); } public void Append(string name, string value, string type) { if (type.Isi(Tags.Textarea)) { name = Normalize(name); value = Normalize(value); } _entries.Add(new TextDataSetEntry(name, value, type)); } public void Append(string name, IFile value, string type) { if (type.Isi(InputTypeNames.File)) name = Normalize(name); _entries.Add(new FileDataSetEntry(name, value, type)); } private Stream Build(Encoding encoding, Action<StreamWriter> process) { encoding = (encoding ?? TextEncoding.Utf8); MemoryStream memoryStream = new MemoryStream(); CheckBoundaries(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.Equals("_charset_") && formDataSetEntry.Type.Equals(InputTypeNames.Hidden, StringComparison.OrdinalIgnoreCase)) _entries[i] = new TextDataSetEntry(formDataSetEntry.Name, encoding.WebName, formDataSetEntry.Type); } } private void CheckBoundaries(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); } private static string Normalize(string value) { if (!string.IsNullOrEmpty(value)) { string[] value2 = value.Split(NewLines, StringSplitOptions.None); return string.Join("\r\n", value2); } return value; } public IEnumerator<string> GetEnumerator() { return (from m in _entries select m.Name).GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } }