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 ;
}
}
}
}
}