public CreateMultipartRequest ( |
||
request | ||
return | void |
public void CreateMultipartRequest(WebRequest request)
{
string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x", CultureInfo.InvariantCulture);
request.ContentType = "multipart/form-data; boundary=" + boundary;
byte[] byteContent;
using (var memoryStream = new MemoryStream())
{
foreach (var item in _formData)
{
string header = String.Format(CultureInfo.InvariantCulture, FormDataTemplate, boundary, item.Key, item.Value);
byte[] headerBytes = Encoding.UTF8.GetBytes(header);
memoryStream.Write(headerBytes, 0, headerBytes.Length);
}
byte[] newlineBytes = Encoding.UTF8.GetBytes("\r\n");
foreach (var file in _files)
{
string header = String.Format(CultureInfo.InvariantCulture, FileTemplate, boundary, file.FieldName, file.FieldName, file.ContentType);
byte[] headerBytes = Encoding.UTF8.GetBytes(header);
memoryStream.Write(headerBytes, 0, headerBytes.Length);
using (Stream fileStream = file.FileFactory())
{
fileStream.CopyTo(memoryStream);
}
memoryStream.Write(newlineBytes, 0, newlineBytes.Length);
}
string trailer = String.Format(CultureInfo.InvariantCulture, "--{0}--", boundary);
byte[] trailerBytes = Encoding.UTF8.GetBytes(trailer);
memoryStream.Write(trailerBytes, 0, trailerBytes.Length);
byteContent = memoryStream.ToArray();
}
request.ContentLength = byteContent.Length;
using (Stream requestStream = request.GetRequestStream())
{
requestStream.Write(byteContent, 0, (int)byteContent.Length);
}
}
/// <summary> /// Pushes a package to the server that is represented by the stream. /// </summary> /// <param name="apiKey">API key to be used to push the package.</param> /// <param name="packageStreamFactory">A delegate which can be used to open a stream for the package file.</param> /// <param name="timeout">Time in milliseconds to timeout the server request.</param> public void PushPackage(string apiKey, Func <Stream> packageStreamFactory, int timeout) { HttpClient client = GetClient("", "PUT", "application/octet-stream"); client.SendingRequest += (sender, e) => { var request = (HttpWebRequest)e.Request; // Set the timeout if (timeout <= 0) { timeout = request.ReadWriteTimeout; // Default to 5 minutes if the value is invalid. } request.Timeout = timeout; request.ReadWriteTimeout = timeout; if (!String.IsNullOrEmpty(apiKey)) { request.Headers.Add(ApiKeyHeader, apiKey); } var multiPartRequest = new MultipartWebRequest(); multiPartRequest.AddFile(packageStreamFactory, "package"); multiPartRequest.CreateMultipartRequest(request); }; EnsureSuccessfulResponse(client, HttpStatusCode.Created); }