FormDataSet
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>();
}
[System.Runtime.CompilerServices.NullableContext(2)]
[return: System.Runtime.CompilerServices.Nullable(1)]
public Stream AsMultipart(IHtmlEncoder htmlEncoder, Encoding encoding = null)
{
return BuildRequestContent(encoding, delegate(StreamWriter stream) {
Connect(new MultipartFormDataSetVisitor(htmlEncoder ?? new DefaultHtmlEncoder(), 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();
}
}
}