67 lines
1.9 KiB
C#

using Foundation;
namespace Blahblah.Library.Network;
class NSMultipartFormData
{
public const string DefaultMimeType = "application/octet-stream";
public NSMutableData Data => boundaryData;
readonly string boundary;
readonly NSMutableData boundaryData;
public string ContentType => $"{NetworkHelper.ContentFormData}; boundary={boundary}";
public NSMultipartFormData()
{
var data = new byte[12];
for (var i = 0; i < 12; i++)
{
data[i] = (byte)(Random.Shared.Next(0x30, 0x3a));
}
var id = Convert.ToBase64String(data);
boundary = $"----WebKitFormBoundary{id}";
boundaryData = new NSMutableData();
}
public void AddTextField(string name, string value)
{
// Content-Type: text/plain; charset=ISO-8859-1
// Content-Transfer-Encoding: 8bit
var field = $"--{boundary}\r\n" +
$"Content-Disposition: form-data; name=\"{name}\"\r\n\r\n" +
$"{value}\r\n";
boundaryData.AppendData(NSData.FromString(field, NSStringEncoding.UTF8));
}
public void AddDataField(string name, Stream data, string? fileName = null, string mimeType = DefaultMimeType)
{
if (fileName == null)
{
fileName = "";
}
else if (!string.IsNullOrEmpty(fileName))
{
fileName = $"; filename=\"{fileName}\"";
}
var field = $"--{boundary}\r\n" +
$"Content-Disposition: form-data; name=\"{name}\"{fileName}\r\n" +
$"Content-Type: {mimeType}\r\n\r\n";
boundaryData.AppendData(NSData.FromString(field, NSStringEncoding.UTF8));
var stream = NSData.FromStream(data);
if (stream != null)
{
boundaryData.AppendData(stream);
}
boundaryData.AppendData(NSData.FromString("\r\n"));
}
public void AddEnd()
{
boundaryData.AppendData(NSData.FromString($"--{boundary}--"));
}
}