From d7cabaad8bea4c601042977d7d0e0c6d841896d4 Mon Sep 17 00:00:00 2001 From: Paul Schneider Date: Sun, 16 May 2021 01:31:12 +0100 Subject: [PATCH] using web request --- src/nuget-cli/Constants.cs | 7 + src/nuget-cli/Helpers.cs | 18 --- src/nuget-cli/Program.Commands.cs | 4 +- src/nuget-cli/Program.cs | 1 - src/nuget-cli/PushCommand.cs | 12 +- src/nuget-cli/PushReport.cs | 9 +- .../UploadFilesToServerUsingHttpClient.cs | 7 +- .../UploadFilesToServerUsingWebRequest.cs | 138 ++++++++++++++++++ 8 files changed, 163 insertions(+), 33 deletions(-) create mode 100644 src/nuget-cli/Constants.cs delete mode 100644 src/nuget-cli/Helpers.cs create mode 100644 src/nuget-cli/UploadFilesToServerUsingWebRequest.cs diff --git a/src/nuget-cli/Constants.cs b/src/nuget-cli/Constants.cs new file mode 100644 index 0000000..8fc6902 --- /dev/null +++ b/src/nuget-cli/Constants.cs @@ -0,0 +1,7 @@ +namespace nuget_cli +{ + internal static class Constants + { + internal const string ClientVersion = "nuget-cli v1.0"; + } +} diff --git a/src/nuget-cli/Helpers.cs b/src/nuget-cli/Helpers.cs deleted file mode 100644 index 54b5eb6..0000000 --- a/src/nuget-cli/Helpers.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Net; -using System.Net.Http; -using System.Net.Http.Headers; -using System.Text; -using System.Threading.Tasks; - -namespace nuget_cli -{ - public static class Constants - { - public const string ClientVersion = "nuget_cli v1.0"; - } - -} - diff --git a/src/nuget-cli/Program.Commands.cs b/src/nuget-cli/Program.Commands.cs index bf44a1f..2d4575d 100644 --- a/src/nuget-cli/Program.Commands.cs +++ b/src/nuget-cli/Program.Commands.cs @@ -7,8 +7,6 @@ namespace nuget_cli partial class Program { - static readonly ServerQueryHandler serverQueryHandler; - private static void SourceList(IEnumerable sargs) { throw new NotImplementedException(); @@ -30,7 +28,7 @@ namespace nuget_cli foreach (string pkg in pkgs) { - var report = await PushCommand.RunAsync(serverQueryHandler,pkg,source,apiKey); + var report = await PushCommand.RunAsync(pkg,source,apiKey); pushReports.Add(report); } diff --git a/src/nuget-cli/Program.cs b/src/nuget-cli/Program.cs index e68d8de..cfc0d39 100644 --- a/src/nuget-cli/Program.cs +++ b/src/nuget-cli/Program.cs @@ -15,7 +15,6 @@ namespace nuget_cli static Program() { - serverQueryHandler = new ServerQueryHandler(); } static void Main(string[] args) diff --git a/src/nuget-cli/PushCommand.cs b/src/nuget-cli/PushCommand.cs index f06f3ff..b680bc5 100644 --- a/src/nuget-cli/PushCommand.cs +++ b/src/nuget-cli/PushCommand.cs @@ -9,7 +9,7 @@ namespace nuget_cli { internal class PushCommand { - static internal async Task RunAsync(ServerQueryHandler queryHandler, string pkg, string source, string apikey) + static internal async Task RunAsync(string pkg, string source, string apikey) { FileInfo fi = new FileInfo(pkg); var report = new PushReport @@ -25,7 +25,13 @@ namespace nuget_cli try { - await queryHandler.UploadFilesToServer(report, new Uri(source), fi, apikey); + var wrqueryHandler = new UploadFilesToServerUsingWebRequest(); + await wrqueryHandler.UploadFilesToServerAsync(report, new Uri(source), fi, apikey); +#if FAILS + var hcqueryHandler = new HttpClientServerQueryHandler(); + await hcqueryHandler.UploadFilesToServerAsync(report, new Uri(source), fi, apikey); +#endif + } catch (WebException ex) { @@ -39,6 +45,8 @@ namespace nuget_cli } catch (Exception ex) { + report.Message = ex.Message; + report.StackTrace = ex.StackTrace; await Console.Error.WriteLineAsync(ex.Message); throw; } diff --git a/src/nuget-cli/PushReport.cs b/src/nuget-cli/PushReport.cs index b9f8815..96df93d 100644 --- a/src/nuget-cli/PushReport.cs +++ b/src/nuget-cli/PushReport.cs @@ -3,9 +3,10 @@ namespace nuget_cli public class PushReport { public string PkgName { get; set; } - public bool Executed { get; set; } - public bool AlreadyPresent { get; set; } - public string Message { get; set; } - public string StatusCode { get; set; } + public bool Executed { get; internal set; } + public bool AlreadyPresent { get; internal set; } + public string Message { get; internal set; } + public string StatusCode { get; internal set; } + public string StackTrace { get; internal set; } } } \ No newline at end of file diff --git a/src/nuget-cli/UploadFilesToServerUsingHttpClient.cs b/src/nuget-cli/UploadFilesToServerUsingHttpClient.cs index 5b50501..8ff8c6a 100644 --- a/src/nuget-cli/UploadFilesToServerUsingHttpClient.cs +++ b/src/nuget-cli/UploadFilesToServerUsingHttpClient.cs @@ -9,7 +9,7 @@ namespace nuget_cli { public class HttpClientServerQueryHandler { - internal async Task UploadFilesToServerUsingHttpClient( + internal async Task UploadFilesToServerAsync( PushReport report, Uri uri, FileInfo fi, string apikey) @@ -18,8 +18,6 @@ namespace nuget_cli { ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; - // using (MultipartContent content = new MultipartContent("ascasc")) - using (var formdata = new MultipartFormDataContent("NKdKd9Yk")) { using (HttpClient client = new HttpClient()) @@ -36,9 +34,8 @@ namespace nuget_cli Stream fileStream = fi.OpenRead(); var streamcontent = new StreamContent(fileStream); streamcontent.Headers.ContentDisposition = dispo; - formdata.Add(streamcontent, fi.Name, fi.Name); + formdata.Add(streamcontent, "file", fi.Name); - // content.Add(formdata); client.BaseAddress = uri; HttpRequestMessage put = new HttpRequestMessage(HttpMethod.Put, uri) { diff --git a/src/nuget-cli/UploadFilesToServerUsingWebRequest.cs b/src/nuget-cli/UploadFilesToServerUsingWebRequest.cs new file mode 100644 index 0000000..73a3a62 --- /dev/null +++ b/src/nuget-cli/UploadFilesToServerUsingWebRequest.cs @@ -0,0 +1,138 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Text; +using System.Threading.Tasks; + +namespace nuget_cli +{ + public class UploadFilesToServerUsingWebRequest + { + + /// + /// Creates HTTP POST request & uploads database to server. Author : Farhan Ghumra + /// + 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"); + byte[] boudaryByte = Encoding.ASCII.GetBytes(boundary); + byte[] trailer = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n"); + string fileheader = string.Format(fileheaderTemplate, "file", fi.Name, "application/octet-stream"); + byte[] fileheaderbytes = Encoding.ASCII.GetBytes(fileheader); + + 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); + httpWebRequest.ContentLength = boudaryByte.Length + fileheaderbytes.Length + fi.Length + trailer.Length; + + + httpWebRequest.BeginGetRequestStream((result) => + { + try + { + HttpWebRequest request = (HttpWebRequest)result.AsyncState; + + using (Stream requestStream = request.EndGetRequestStream(result)) + { + WriteToStream(requestStream, boudaryByte, boudaryByte.Length); + WriteToStream(requestStream, fileheaderbytes, fileheaderbytes.Length); + // WriteToStream(s, string.Format(fileheaderlentemplate, fi.Length)); + /// Write the file data to the stream. + 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); + } + } + requestStream.Write(trailer, 0, trailer.Length); + //requestStream.Close(); + } + request.BeginGetResponse(a => + { + try + { + var response = request.EndGetResponse(a); + var responseStream = response.GetResponseStream(); + using (var sr = new StreamReader(responseStream)) + { + using (StreamReader streamReader = new StreamReader(response.GetResponseStream())) + { + string responseString = streamReader.ReadToEnd(); + //responseString is depend upon your web service. + if (responseString == "Success") + { + report.Message = "stored successfully on server."; + } + else + { + report.Message = "Error occurred while uploading packet on server."; + } + } + } + } + catch (Exception ex) + { + report.Message = ex.Message; + Console.Error.WriteLine(ex.Message); +#if DEBUG + Console.Error.WriteLine("Stack trace:"); + Console.Error.WriteLine(ex.StackTrace); +#endif + } + }, null); + } + 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(); + Stream stream = resp.GetResponseStream(); + StreamReader re = new StreamReader(stream); + String json = re.ReadToEnd(); + report.Message = json; + } + + /// + /// Writes string to stream. Author : Farhan Ghumra + /// + private static void WriteToStream(Stream s, string txt) + { + byte[] bytes = Encoding.UTF8.GetBytes(txt); + s.Write(bytes, 0, bytes.Length); + } + + /// + /// Writes byte array to stream. Author : Farhan Ghumra + /// + private static void WriteToStream(Stream s, byte[] bytes, int len) + { + s.Write(bytes, 0, len); + } + } +} \ No newline at end of file