diff --git a/TBF/Rig/RegisterReaders/GenesisRegReader/communication/Genesis/SoftwareAccessHelper/LocalWebRequest.cs b/TBF/Rig/RegisterReaders/GenesisRegReader/communication/Genesis/SoftwareAccessHelper/LocalWebRequest.cs new file mode 100644 index 000000000..41f75b928 --- /dev/null +++ b/TBF/Rig/RegisterReaders/GenesisRegReader/communication/Genesis/SoftwareAccessHelper/LocalWebRequest.cs @@ -0,0 +1,650 @@ +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using Newtonsoft.Json; + +namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication.Genesis.SoftwareAccessHelper +{ + /// + /// Web request + /// + public static class LocalWebRequest + { + /// + /// Web request with asynchronous operation and response code or exception response, json object input and/or dictionary + /// + /// + /// + /// + /// + /// + /// + /// + public static Boolean PostRequestAsync(String url, ref Int32 responseCode, ref Exception ex, Int32? timeoutMs = null, Object json = null, Dictionary header = null) + { + try + { + var r = PostRequestAndGetResponseAsync(url, timeoutMs, json, header); + responseCode = r.StatusCode.GetHashCode(); + if (r.StatusCode == HttpStatusCode.OK) + { + return true; + } + if (r.StatusCode == HttpStatusCode.InternalServerError) + { + ex = new Exception(r.Content); + } + + } + catch (Exception error) + { + ex = error; + } + return false; + + } + + /// + /// Web request with asynchronous operation and true/false return, json object input and/or dictionary + /// + /// + /// + /// + /// + /// + public static Boolean PostRequestAsync(String url, Int32? timeoutMs = null, Object json = null, Dictionary header = null) + { + try + { + var r = PostRequestAndGetResponseAsync(url, timeoutMs, json, header); + if (r.StatusCode == HttpStatusCode.OK) + { + return true; + } + + } + catch (Exception) + { + // Log + } + return false; + + } + /// + /// Web request with asynchronous operation with string return, json object input and/or dictionary + /// + /// + /// + /// + /// + /// + public static String PostRequestAsyncAndGetContent(String url, Int32? timeoutMs = null, Object json = null, Dictionary header = null) + { + try + { + var r = PostRequestAndGetResponseAsync(url, timeoutMs, json, header); + if (r.StatusCode == HttpStatusCode.OK) + { + return r.Content; + } + + } + catch (Exception) + { + // Log + } + return string.Empty; + + } + + /// + /// Web request with asynchronous operation, binary file byte array input, response string output + /// + /// + /// + /// + /// + /// + /// + public static Boolean PostBinaryFileRequestAsync(String url, String fileName, Byte[] content, out String response, Int32? timeoutMs = null) + { + response = null; + return false; + // try + // { + // + // var client = new RestClient(url); + // //WebRequest.DefaultWebProxy = null; + // var request = new RestRequest(Method.POST); + // + // ServicePointManager.Expect100Continue = false; + // + // + // request.AddHeader("Content-Type", "multipart/form-data"); + // + // + // request.Files.Add(new FileParameter + // { + // Name = "file", + // Writer = (s) => + // { + // var stream = new MemoryStream(content); + // stream.CopyTo(s); + // stream.Dispose(); + // }, + // FileName = fileName, + // ContentType = "multipart/form-data", + // ContentLength = content.Length + // }); + // + // + // var r = client.ExecuteAsPost(request, Method.POST.ToString()); + // response = r.Content; + // return r.StatusCode == HttpStatusCode.OK; + // + // + // } + // catch (Exception) + // { + // response = string.Empty; + // return false; + // + // } + } + + /// + /// Web request with asynchronous operation, binary file input + /// + /// + /// + /// + /// + /// + public static Boolean PostBinaryFileRequestAsync(String url, String fileName, Byte[] content, Int32? timeoutMs = null) + { + return false; + // try + // { + // + // var client = new RestClient(url); + // // WebRequest.DefaultWebProxy = null; + // var request = new RestRequest(Method.POST); + // + // ServicePointManager.Expect100Continue = false; + // + // + // request.AddHeader("Content-Type", "multipart/form-data"); + // + // + // request.Files.Add(new FileParameter + // { + // Name = "file", + // Writer = (s) => + // { + // var stream = new MemoryStream(content); + // stream.CopyTo(s); + // stream.Dispose(); + // }, + // FileName = fileName, + // ContentType = "multipart/form-data", + // ContentLength = content.Length + // }); + // + // + // var r = client.ExecuteAsPost(request, Method.POST.ToString()); + // return r.StatusCode == HttpStatusCode.OK; + // + // + // } + // catch (Exception) + // { + // return false; + // + // } + + } + + + /// + /// Web request with asynchronous operation + /// + /// + /// + /// + /// + /// + public static IRestResponse PostBinaryRequestAndGetResponseAsync(String url, Int32? timeoutMs = null, + Dictionary files = null, Dictionary header = null) + { + // try + // { + // + // var client = new RestClient(url); + // //WebRequest.DefaultWebProxy = null; + // var request = new RestRequest(Method.POST); + // + // ServicePointManager.Expect100Continue = false; + // + // if (header != null) + // { + // foreach (var item in header) + // { + // if (item.Key != "Content-Type" && item.Key != "Accept") + // { + // request.AddHeader(item.Key, item.Value); + // } + // + // } + // + // } + // + // request.AddHeader("Content-Type", "multipart/form-data"); + // + // if (files != null) + // { + // foreach (var item in files) + // { + // request.AddFile(item.Key, item.Value); + // } + // + // } + // + // var r = client.ExecuteAsPost(request, Method.POST.ToString()); + // return r; + // + // + // } + // catch (Exception error) + // { + // return new RestResponse + // { + // StatusCode = HttpStatusCode.InternalServerError, + // Content = error.ToString() + // }; + // + // } + + } + + + /// + /// Post Request Async + /// + /// + /// - Initial. + /// + /// + /// + /// + /// + /// + public static String PostRequestAsync(String url, Double timeoutMs, out HttpStatusCode httpStatus, Object json = null) + { + try + { + var httpClient = new HttpClient(); + + httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + httpClient.Timeout = TimeSpan.FromMilliseconds(timeoutMs); + + var postedJson = JsonConvert.SerializeObject(json, Formatting.Indented); + var postedBody = new StringContent(postedJson); + postedBody.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/json"); + var posted = httpClient + .PostAsync(url, postedBody) + .Result; + + httpStatus = posted.StatusCode; + return posted.Content.ReadAsStringAsync().Result; + } + catch (Exception error) + { + httpStatus = HttpStatusCode.ServiceUnavailable; + return error.Message; + } + } + + + /// + /// Web request + /// + /// + /// + /// + /// + public static String GetRequest(String url, Double timeoutMs, out HttpStatusCode httpStatus) + { + + try + { + var httpClient = new HttpClient(); + httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + + httpClient.Timeout = TimeSpan.FromMilliseconds(timeoutMs); + var response = httpClient + .GetAsync(url) + .Result; + + httpStatus = response.StatusCode; + return response.Content.ReadAsStringAsync().Result; + } + catch (Exception error) + { + httpStatus = HttpStatusCode.ServiceUnavailable; + return error.Message; + } + } + + /// + /// Web request with asynchronous operation + /// + /// + /// + /// + /// + /// + public static IRestResponse PostRequestAndGetResponseAsync(String url, Int32? timeoutMs = null, Object json = null, + Dictionary header = null) + { + // try + // { + // + // var client = new RestClient(url); + // client.AddDefaultHeader("Accept", "application/json"); + // //WebRequest.DefaultWebProxy = null; + // ServicePointManager.Expect100Continue = false; + // var request = new RestRequest(Method.POST); + // + // + // if (header != null) + // { + // foreach (var item in header) + // { + // if (item.Key != "Content-Type" && item.Key != "Accept") + // { + // request.AddHeader(item.Key, item.Value); + // } + // + // } + // } + // request.AddHeader("Content-Type", "application/json"); + // request.AddHeader("Accept", "application/json"); + // + // if (json != null) + // { + // request.AddJsonBody(json); + // } + // + // var r = client.ExecuteAsPost(request, Method.POST.ToString()); + // return r; + // } + // catch (Exception error) + // { + // return new RestResponse + // { + // StatusCode = HttpStatusCode.InternalServerError, + // Content = error.ToString() + // }; + // } + } + + #region HTTP String extensions + public static HttpResponse DeleteAsJson(this String url, Object json = null, Action headersHandler = null, Int32? timeoutMs = null) + { + return Method.DELETE.AsJson(url, headersHandler, json, timeoutMs); + } + + public static HttpResponse GetAsJson(this String url, Object json = null, Action headersHandler = null, Int32? timeoutMs = null) + { + return Method.GET.AsJson(url, headersHandler, json, timeoutMs); + } + + public static HttpResponse PostAsJson(this String url, Object json = null, Action headersHandler = null, Int32? timeoutMs = null) + { + return Method.POST.AsJson(url, headersHandler, json, timeoutMs); + } + + public static HttpResponse PutAsJson(this String url, Object json = null, Action headersHandler = null, Int32? timeoutMs = null) + { + return Method.PUT.AsJson(url, headersHandler, json, timeoutMs); + } + #endregion HTTP String extensions + + #region HTTP Object extensions + public static HttpResponse DeleteAsJson(this Object json, String url, Action headersHandler = null, Int32? timeoutMs = null) + { + return Method.DELETE.AsJson(url, headersHandler, json, timeoutMs); + } + + public static HttpResponse GetAsJson(this Object json, String url, Action headersHandler = null, Int32? timeoutMs = null) + { + return Method.GET.AsJson(url, headersHandler, json, timeoutMs); + } + + public static HttpResponse GetAsJson(String url, Action headersHandler = null, Int32? timeoutMs = null) + { + return Method.GET.AsJson(url, headersHandler, null, timeoutMs); + } + + public static HttpResponse PostAsJson(this Object json, String url, Action headersHandler = null, Int32? timeoutMs = null) + { + return Method.POST.AsJson(url, headersHandler, json, timeoutMs); + } + + public static HttpResponse PutAsJson(this Object json, String url, Action headersHandler = null, Int32? timeoutMs = null) + { + return Method.PUT.AsJson(url, headersHandler, json, timeoutMs); + } + #endregion HTTP Object extensions + + /// + /// Web request + /// + /// + /// + /// + /// + /// + public static String DeleteRequest(String url, Int32? timeoutMs = null, Dictionary header = null, Boolean isRetry = false) + { + var ret = DeleteRequestWithError(url, out var temp, timeoutMs, header, isRetry); + if (temp != 200) + { + throw new ApplicationException($"WebRequest Status {temp}"); + } + return ret; + } + + /// + /// Web request with asynchronous operation, error code response + /// + /// + /// + /// + /// + /// + /// + public static String DeleteRequestWithError(String url, out Int32 errorCode, Int32? timeoutMs = null, Dictionary header = null, Boolean isRetry = false) + { + var client = new RestClient(url); + var request = new RestRequest(Method.DELETE); + ServicePointManager.Expect100Continue = false; + if (!timeoutMs.HasValue) + { + timeoutMs = 800; + } + + request.Timeout = timeoutMs.Value; + + if (header != null) + { + foreach (var item in header) + { + if (item.Key != "Accept") + { + request.AddHeader(item.Key, item.Value); + } + } + } + request.AddHeader("Accept", "application/json"); + + var r = client.Execute(request); + errorCode = r.StatusCode.GetHashCode(); + if (r.StatusCode == HttpStatusCode.OK) + { + return r.Content; + } + + if (r.StatusCode != 0) + return r.Content; + + return !isRetry ? DeleteRequest(url, timeoutMs, header, true) : r.Content; + } + /// + /// Web request + /// + /// + /// + /// + /// + /// + public static String GetRequest(String url, Int32? timeoutMs = null, Dictionary header = null, Boolean isRetry = false) + { + //if (true && (url.Contains("sla12iis01/MeterProcessState") || url.Contains("sla12iis01.emea.sensus.net/MeterProcessState"))) + //{ + // url = url.Replace("sla12iis01/MeterProcessState", "delaz1web01/MeterProcessState").Replace("sla12iis01.emea.sensus.net/MeterProcessState", "delaz1web01/MeterProcessState") + //} + var ret = GetRequestWithError(url, out var temp, timeoutMs, header, isRetry); + if (temp != 200) + { + throw new ApplicationException($"WebRequest Status {temp}"); + } + return ret; + } + + /// + /// Web request with asynchronous operation, error code response + /// + /// + /// + /// + /// + /// + /// + public static String GetRequestWithError(String url, out Int32 errorCode, Int32? timeoutMs = null, Dictionary header = null, Boolean isRetry = false) + { + + var client = new RestClient(url); + var request = new RestRequest(Method.GET); + ServicePointManager.Expect100Continue = false; + if (!timeoutMs.HasValue) + { + timeoutMs = 800; + } + + request.Timeout = timeoutMs.Value; + + if (header != null) + { + foreach (var item in header) + { + if (item.Key != "Accept") + { + request.AddHeader(item.Key, item.Value); + } + + } + + } + request.AddHeader("Accept", "application/json"); + + var r = client.Get(request); + errorCode = r.StatusCode.GetHashCode(); + if (r.StatusCode == HttpStatusCode.OK) + { + return r.Content; + } + + if (r.StatusCode != 0) + return r.Content; + + return !isRetry ? GetRequest(url, timeoutMs, header, true) : r.Content; + } + + private static HttpResponse AsJson(this Method method, String url, Action headersHandler = null, Object model = null, Int32? timeoutMs = null) + { + var httpResponse = new HttpResponse(); + + try + { + var client = new RestClient(url); + var request = new RestRequest(method); + var headers = new RestRequestHeaders(request) + { + ContentType = "application/json", + Accept = "application/json" + }; + + headersHandler?.Invoke(headers); + + if (model != null) + { + if (method == Method.GET) + { + request.AddObject(model); + } + else + { + request.AddJsonBody(model); + } + } + + ServicePointManager.Expect100Continue = false; + + var response = client.Execute(request); + httpResponse.HttpStatusCode = response.StatusCode; + + if (HttpStatusCode.OK <= response.StatusCode && response.StatusCode < HttpStatusCode.BadRequest) + { + if (!string.IsNullOrWhiteSpace(response.Content)) + { + httpResponse.Value = JsonConvert.DeserializeObject(response.Content); + } + else + { + httpResponse.Errors = new Dictionary() + { + { nameof(response.Content), $"{response.Content}" }, + }; + } + } + else + { + httpResponse.Errors = JsonConvert.DeserializeObject>(response.Content); + + if (httpResponse.Errors is null) + { + httpResponse.Errors = new Dictionary() + { + { nameof(response.ErrorException), $"{response.ErrorException}" }, + { nameof(response.ErrorMessage), $"{response.ErrorMessage}" }, + { nameof(response.Content), $"{response.Content}" }, + }; + } + } + } + catch (Exception error) + { + httpResponse.HttpStatusCode = HttpStatusCode.InternalServerError; + httpResponse.Errors = new Dictionary() + { + { nameof(Exception), $"{error}" } + }; + } + + return httpResponse; + } + } +}