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}--")); } }