PTMagic/Core/ProfitTrailer/SettingsAPI.cs

188 lines
9.0 KiB
C#
Raw Normal View History

2018-05-22 10:11:50 +02:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Core.Main;
using Core.Helper;
using Core.Main.DataObjects.PTMagicData;
using Newtonsoft.Json;
2018-12-03 19:45:06 +01:00
namespace Core.ProfitTrailer
{
public static class SettingsAPI
{
public static List<string> GetPropertyLinesFromAPI(string ptFileName, PTMagicConfiguration systemConfiguration, LogHelper log)
{
2018-05-22 10:11:50 +02:00
List<string> result = null;
2018-12-03 19:45:06 +01:00
try
{
2018-05-22 10:11:50 +02:00
ServicePointManager.Expect100Continue = true;
ServicePointManager.DefaultConnectionLimit = 9999;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(CertificateHelper.AllwaysGoodCertificate);
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(systemConfiguration.GeneralSettings.Application.ProfitTrailerMonitorURL + "settingsapi/settings/load");
httpWebRequest.ContentType = "application/x-www-form-urlencoded";
httpWebRequest.Method = "POST";
// PT is using ordinary POST data, not JSON
string query = "fileName=" + ptFileName + "&configName=" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "&license=" + systemConfiguration.GeneralSettings.Application.ProfitTrailerLicense;
byte[] formData = Encoding.ASCII.GetBytes(query);
httpWebRequest.ContentLength = formData.Length;
2018-12-03 19:45:06 +01:00
using (Stream stream = httpWebRequest.GetRequestStream())
{
2018-05-22 10:11:50 +02:00
stream.Write(formData, 0, formData.Length);
}
//using (StreamWriter streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) {
// string json = JsonConvert.SerializeObject(new {
// fileName = ptFileName,
// configName = systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName,
// license = systemConfiguration.GeneralSettings.Application.ProfitTrailerLicense
// });
// streamWriter.Write(json);
//}
HttpWebResponse httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
2018-12-03 19:45:06 +01:00
using (StreamReader streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
2018-05-22 10:11:50 +02:00
string jsonResult = streamReader.ReadToEnd();
result = JsonConvert.DeserializeObject<List<string>>(jsonResult);
}
2018-12-03 19:45:06 +01:00
}
catch (WebException ex)
{
2018-05-22 10:11:50 +02:00
// Manual error handling as PT doesn't seem to provide a proper error response...
2018-12-03 19:45:06 +01:00
if (ex.Message.IndexOf("401") > -1)
{
2018-05-22 10:11:50 +02:00
log.DoLogError("Loading " + ptFileName + ".properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': Unauthorized! The specified Profit Trailer license key '" + systemConfiguration.GetProfitTrailerLicenseKeyMasked() + "' is invalid!");
2018-12-03 19:45:06 +01:00
}
else
{
2018-05-22 10:11:50 +02:00
log.DoLogCritical("Loading " + ptFileName + ".properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': " + ex.Message, ex);
}
2018-12-03 19:45:06 +01:00
}
catch (Exception ex)
{
2018-05-22 10:11:50 +02:00
log.DoLogCritical("Loading " + ptFileName + ".properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': " + ex.Message, ex);
}
return result;
}
2018-12-03 19:45:06 +01:00
public static void SendPropertyLinesToAPI(string ptFileName, List<string> lines, PTMagicConfiguration systemConfiguration, LogHelper log)
{
2018-05-22 10:11:50 +02:00
int retryCount = 0;
int maxRetries = 3;
bool transferCompleted = false;
bool transferCanceled = false;
2018-12-03 19:45:06 +01:00
while (!transferCompleted && !transferCanceled)
{
try
{
2018-05-22 10:11:50 +02:00
ServicePointManager.Expect100Continue = true;
ServicePointManager.DefaultConnectionLimit = 9999;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(CertificateHelper.AllwaysGoodCertificate);
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(systemConfiguration.GeneralSettings.Application.ProfitTrailerMonitorURL + "settingsapi/settings/save");
httpWebRequest.ContentType = "application/x-www-form-urlencoded";
httpWebRequest.Method = "POST";
httpWebRequest.Proxy = null;
httpWebRequest.Timeout = 30000;
// PT is using ordinary POST data, not JSON
string query = "fileName=" + ptFileName + "&configName=" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "&license=" + systemConfiguration.GeneralSettings.Application.ProfitTrailerLicense;
string propertiesString = SystemHelper.ConvertListToTokenString(lines, Environment.NewLine, false);
query += "&saveData=" + WebUtility.UrlEncode(propertiesString);
byte[] formData = Encoding.ASCII.GetBytes(query);
httpWebRequest.ContentLength = formData.Length;
2018-12-03 19:45:06 +01:00
using (Stream stream = httpWebRequest.GetRequestStream())
{
2018-05-22 10:11:50 +02:00
stream.Write(formData, 0, formData.Length);
}
log.DoLogDebug("Built POST request for " + ptFileName + ".properties.");
//using (StreamWriter streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) {
// string json = JsonConvert.SerializeObject(new {
// fileName = ptFileName,
// configName = systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName,
// license = systemConfiguration.GeneralSettings.Application.ProfitTrailerLicense,
// saveData = propertiesString
// });
// streamWriter.Write(json);
//}
log.DoLogInfo("Sending " + ptFileName + ".properties...");
HttpWebResponse httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
log.DoLogInfo(ptFileName + ".properties sent!");
httpResponse.Close();
log.DoLogDebug(ptFileName + ".properties response object closed.");
transferCompleted = true;
2018-12-03 19:45:06 +01:00
}
catch (WebException ex)
{
2018-05-22 10:11:50 +02:00
// Manual error handling as PT doesn't seem to provide a proper error response...
2018-12-03 19:45:06 +01:00
if (ex.Message.IndexOf("401") > -1)
{
2018-05-22 10:11:50 +02:00
log.DoLogError("Saving " + ptFileName + ".properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': Unauthorized! The specified Profit Trailer license key '" + systemConfiguration.GetProfitTrailerLicenseKeyMasked() + "' is invalid!");
transferCanceled = true;
2018-12-03 19:45:06 +01:00
}
else if (ex.Message.IndexOf("timed out") > -1)
{
2018-05-22 10:11:50 +02:00
// Handle timeout seperately
retryCount++;
2018-12-03 19:45:06 +01:00
if (retryCount <= maxRetries)
{
2018-05-22 10:11:50 +02:00
log.DoLogError("Saving " + ptFileName + ".properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': Timeout! Starting retry number " + retryCount + "/" + maxRetries.ToString() + "!");
2018-12-03 19:45:06 +01:00
}
else
{
2018-05-22 10:11:50 +02:00
transferCanceled = true;
log.DoLogError("Saving " + ptFileName + ".properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': Timeout! Canceling transfer after " + maxRetries.ToString() + " failed retries.");
}
2018-12-03 19:45:06 +01:00
}
else
{
2018-05-22 10:11:50 +02:00
log.DoLogCritical("Saving " + ptFileName + ".properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': " + ex.Message, ex);
transferCanceled = true;
}
2018-12-03 19:45:06 +01:00
}
catch (TimeoutException ex)
{
2018-05-22 10:11:50 +02:00
retryCount++;
2018-12-03 19:45:06 +01:00
if (retryCount <= maxRetries)
{
2018-05-22 10:11:50 +02:00
log.DoLogError("Saving " + ptFileName + ".properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': Timeout (" + ex.Message + ")! Starting retry number " + retryCount + "/" + maxRetries.ToString() + "!");
2018-12-03 19:45:06 +01:00
}
else
{
2018-05-22 10:11:50 +02:00
transferCanceled = true;
log.DoLogError("Saving " + ptFileName + ".properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': Timeout (" + ex.Message + ")! Canceling transfer after " + maxRetries.ToString() + " failed retries.");
}
2018-12-03 19:45:06 +01:00
}
catch (Exception ex)
{
2018-05-22 10:11:50 +02:00
log.DoLogCritical("Saving " + ptFileName + ".properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': " + ex.Message, ex);
transferCanceled = true;
}
}
}
}
}