MultipartFormDataRequestContent
using Azure.Core.Pipeline;
using System;
using System.Globalization;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
namespace Azure.Storage.Common
{
internal class MultipartFormDataRequestContent
{
private readonly MultipartFormDataContent _multipartContent;
private static readonly Random _random = new Random();
private static readonly char[] _boundaryValues = "0123456789=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz".ToCharArray();
public string ContentType => _multipartContent.Headers.ContentType.ToString();
internal HttpContent HttpContent => _multipartContent;
public MultipartFormDataRequestContent()
: this()
{
_multipartContent = new MultipartFormDataContent(CreateBoundary());
}
private static string CreateBoundary()
{
Span<char> span = new char[70];
byte[] array = new byte[70];
_random.NextBytes(array);
int num = 63;
for (int i = 0; i < 70; i++) {
span[i] = _boundaryValues[array[i] & num];
}
return span.ToString();
}
public void Add(string content, string name, string filename = null, string contentType = null)
{
Argument.AssertNotNull(content, "content");
Argument.AssertNotNullOrEmpty(name, "name");
Add((HttpContent)new StringContent(content), name, filename, contentType);
}
public void Add(int content, string name, string filename = null, string contentType = null)
{
Argument.AssertNotNull(content, "content");
Argument.AssertNotNullOrEmpty(name, "name");
string content2 = content.ToString("G", CultureInfo.InvariantCulture);
Add((HttpContent)new StringContent(content2), name, filename, contentType);
}
public void Add(long content, string name, string filename = null, string contentType = null)
{
Argument.AssertNotNull(content, "content");
Argument.AssertNotNullOrEmpty(name, "name");
string content2 = content.ToString("G", CultureInfo.InvariantCulture);
Add((HttpContent)new StringContent(content2), name, filename, contentType);
}
public void Add(float content, string name, string filename = null, string contentType = null)
{
Argument.AssertNotNull(content, "content");
Argument.AssertNotNullOrEmpty(name, "name");
string content2 = content.ToString("G", CultureInfo.InvariantCulture);
Add((HttpContent)new StringContent(content2), name, filename, contentType);
}
public void Add(double content, string name, string filename = null, string contentType = null)
{
Argument.AssertNotNull(content, "content");
Argument.AssertNotNullOrEmpty(name, "name");
string content2 = content.ToString("G", CultureInfo.InvariantCulture);
Add((HttpContent)new StringContent(content2), name, filename, contentType);
}
public void Add(decimal content, string name, string filename = null, string contentType = null)
{
Argument.AssertNotNull(content, "content");
Argument.AssertNotNullOrEmpty(name, "name");
string content2 = content.ToString("G", CultureInfo.InvariantCulture);
Add((HttpContent)new StringContent(content2), name, filename, contentType);
}
public void Add(bool content, string name, string filename = null, string contentType = null)
{
Argument.AssertNotNull(content, "content");
Argument.AssertNotNullOrEmpty(name, "name");
string content2 = content ? "true" : "false";
Add((HttpContent)new StringContent(content2), name, filename, contentType);
}
public void Add(Stream content, string name, string filename = null, string contentType = null)
{
Argument.AssertNotNull(content, "content");
Argument.AssertNotNullOrEmpty(name, "name");
Add((HttpContent)new StreamContent(content), name, filename, contentType);
}
public void Add(byte[] content, string name, string filename = null, string contentType = null)
{
Argument.AssertNotNull(content, "content");
Argument.AssertNotNullOrEmpty(name, "name");
Add((HttpContent)new ByteArrayContent(content), name, filename, contentType);
}
public void Add(BinaryData content, string name, string filename = null, string contentType = null)
{
Argument.AssertNotNull<BinaryData>(content, "content");
Argument.AssertNotNullOrEmpty(name, "name");
Add((HttpContent)new ByteArrayContent(content.ToArray()), name, filename, contentType);
}
private void Add(HttpContent content, string name, string filename, string contentType)
{
if (filename != null) {
Argument.AssertNotNullOrEmpty(filename, "filename");
AddFilenameHeader(content, name, filename);
}
if (contentType != null) {
Argument.AssertNotNullOrEmpty(contentType, "contentType");
AddContentTypeHeader(content, contentType);
}
_multipartContent.Add(content, name);
}
public static void AddFilenameHeader(HttpContent content, string name, string filename)
{
ContentDispositionHeaderValue contentDisposition = new ContentDispositionHeaderValue("form-data") {
Name = name,
FileName = filename
};
content.Headers.ContentDisposition = contentDisposition;
}
public static void AddContentTypeHeader(HttpContent content, string contentType)
{
MediaTypeHeaderValue contentType2 = new MediaTypeHeaderValue(contentType);
content.Headers.ContentType = contentType2;
}
public override bool TryComputeLength(out long length)
{
long? contentLength = _multipartContent.Headers.ContentLength;
if (contentLength.HasValue) {
long num = length = contentLength.GetValueOrDefault();
return true;
}
length = 0;
return false;
}
public override void WriteTo(Stream stream, CancellationToken cancellationToken = default(CancellationToken))
{
_multipartContent.CopyToAsync(stream).EnsureCompleted();
}
[AsyncStateMachine(typeof(<WriteToAsync>d__24))]
public override Task WriteToAsync(Stream stream, CancellationToken cancellationToken = default(CancellationToken))
{
<WriteToAsync>d__24 stateMachine = default(<WriteToAsync>d__24);
stateMachine.<>t__builder = AsyncTaskMethodBuilder.Create();
stateMachine.<>4__this = this;
stateMachine.stream = stream;
stateMachine.<>1__state = -1;
stateMachine.<>t__builder.Start(ref stateMachine);
return stateMachine.<>t__builder.Task;
}
public override void Dispose()
{
_multipartContent.Dispose();
}
}
}