isn/src/nuget-cli/UploadFilesToServerUsingWebRequest.cs

115 lines
4.8 KiB
C#
Raw Normal View History

2021-05-16 01:31:12 +01:00
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Threading.Tasks;
2021-06-18 21:16:38 +01:00
using Newtonsoft.Json;
2021-05-16 01:31:12 +01:00
namespace nuget_cli
{
2021-06-18 21:16:38 +01:00
public class nugetdresp {
public int ecode {get; set; }
public string message {get; set; }
public string id { get; set; }
}
2021-05-16 01:31:12 +01:00
public class UploadFilesToServerUsingWebRequest
{
/// <summary>
/// Creates HTTP POST request & uploads database to server. Author : Farhan Ghumra
/// </summary>
internal async Task UploadFilesToServerAsync(PushReport report, Uri uri, FileInfo fi,
string apikey)
{
// string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
const int TXLEN = 0x1000;
/// the form-data file upload, properly formatted
string fileheaderTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\";\r\nContent-Type: {2}\r\n\r\n";
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
// "X-NuGet-ApiKey
string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
string fileheader = string.Format(fileheaderTemplate, "file", fi.Name, "application/octet-stream");
byte[] fileheaderbytes = Encoding.ASCII.GetBytes(fileheader);
2021-05-16 02:41:36 +01:00
var boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
var endBoundaryBytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--");
2021-05-16 01:31:12 +01:00
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(uri);
httpWebRequest.Method = "PUT";
httpWebRequest.ContentType = "multipart/form-data; boundary=" + boundary;
httpWebRequest.AllowAutoRedirect = false;
httpWebRequest.Headers.Add("X-NuGet-Client-Version", Constants.ClientVersion);
httpWebRequest.Headers.Add("X-NuGet-ApiKey", apikey);
2021-05-16 02:41:36 +01:00
httpWebRequest.ContentLength = boundarybytes.Length +
fileheaderbytes.Length + fi.Length + endBoundaryBytes.Length;
2021-05-16 01:31:12 +01:00
httpWebRequest.BeginGetRequestStream((result) =>
{
try
{
HttpWebRequest request = (HttpWebRequest)result.AsyncState;
using (Stream requestStream = request.EndGetRequestStream(result))
{
2021-05-16 02:41:36 +01:00
WriteToStream(requestStream, boundarybytes, boundarybytes.Length);
2021-05-16 01:31:12 +01:00
WriteToStream(requestStream, fileheaderbytes, fileheaderbytes.Length);
using (var fss = fi.OpenRead())
{
byte[] buffer = new byte[TXLEN];
var form_bytes_read = fss.Read(buffer, 0, TXLEN);
while (form_bytes_read > 0)
{
WriteToStream(requestStream, buffer, form_bytes_read);
form_bytes_read = fss.Read(buffer, 0, TXLEN);
}
}
2021-05-16 02:41:36 +01:00
requestStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
2021-05-16 02:13:58 +01:00
requestStream.Close();
2021-05-16 01:31:12 +01:00
}
2021-05-16 02:13:58 +01:00
2021-05-16 01:31:12 +01:00
}
catch (Exception rex)
{
report.Message = rex.Message;
Console.Error.WriteLine(rex.Message);
#if DEBUG
Console.Error.WriteLine("Stack trace:");
Console.Error.WriteLine(rex.StackTrace);
#endif
}
}, httpWebRequest);
WebResponse resp = httpWebRequest.GetResponse();
2021-05-16 02:13:58 +01:00
2021-05-16 01:31:12 +01:00
Stream stream = resp.GetResponseStream();
StreamReader re = new StreamReader(stream);
2021-05-16 02:13:58 +01:00
if (resp is HttpWebResponse)
{
String json = re.ReadToEnd();
report.Message = json;
2021-06-18 21:16:38 +01:00
var res = JsonConvert.DeserializeObject<nugetdresp>(json);
report.AlreadyPresent = res.ecode == 1;
2021-05-16 05:33:05 +01:00
var hrep = resp as HttpWebResponse;
report.StatusCode = hrep.StatusCode.ToString();
2021-06-18 21:16:38 +01:00
// ecode == 1 => package already present server side.
2021-05-16 05:33:05 +01:00
report.OK = hrep.StatusCode ==
2021-06-18 21:16:38 +01:00
HttpStatusCode.Accepted
|| hrep.StatusCode == HttpStatusCode.OK
|| res.ecode == 1;
2021-05-16 02:13:58 +01:00
}
else throw new Exception("Invalid server response type");
2021-05-16 01:31:12 +01:00
}
/// <summary>
/// Writes byte array to stream. Author : Farhan Ghumra
/// </summary>
private static void WriteToStream(Stream s, byte[] bytes, int len)
{
s.Write(bytes, 0, len);
}
}
}