2018-05-22 10:11:50 +02:00
using System ;
using System.Collections.Generic ;
using System.IO ;
using System.Net ;
using System.Net.Security ;
using System.Text ;
using Core.Main ;
using Core.Helper ;
2018-12-15 22:07:29 +01:00
namespace Core.ProfitTrailer
{
public static class SettingsAPI
{
2019-10-13 17:45:32 +02:00
// Save config back to Profit Trailer
2018-12-16 15:22:38 +01:00
public static void SendPropertyLinesToAPI ( List < string > pairsLines , List < string > dcaLines , List < string > indicatorsLines , PTMagicConfiguration systemConfiguration , LogHelper log )
2018-12-15 22:07:29 +01:00
{
2018-05-22 10:11:50 +02:00
int retryCount = 0 ;
int maxRetries = 3 ;
bool transferCompleted = false ;
bool transferCanceled = false ;
2018-12-15 22:07:29 +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 ) ;
2018-12-16 15:22:38 +01:00
HttpWebRequest httpWebRequest = ( HttpWebRequest ) WebRequest . Create ( systemConfiguration . GeneralSettings . Application . ProfitTrailerMonitorURL + "settingsapi/settings/saveAll" ) ;
2018-05-22 10:11:50 +02:00
httpWebRequest . ContentType = "application/x-www-form-urlencoded" ;
httpWebRequest . Method = "POST" ;
httpWebRequest . Proxy = null ;
httpWebRequest . Timeout = 30000 ;
// PT is using ordinary POST data, not JSON
2018-12-16 15:22:38 +01:00
string query = "configName=" + systemConfiguration . GeneralSettings . Application . ProfitTrailerDefaultSettingName + "&license=" + systemConfiguration . GeneralSettings . Application . ProfitTrailerLicense ;
string pairsPropertiesString = SystemHelper . ConvertListToTokenString ( pairsLines , Environment . NewLine , false ) ;
string dcaPropertiesString = SystemHelper . ConvertListToTokenString ( dcaLines , Environment . NewLine , false ) ;
string indicatorsPropertiesString = SystemHelper . ConvertListToTokenString ( indicatorsLines , Environment . NewLine , false ) ;
query + = "&pairsData=" + WebUtility . UrlEncode ( pairsPropertiesString ) + "&dcaData=" + WebUtility . UrlEncode ( dcaPropertiesString ) + "&indicatorsData=" + WebUtility . UrlEncode ( indicatorsPropertiesString ) ;
2018-05-22 10:11:50 +02:00
byte [ ] formData = Encoding . ASCII . GetBytes ( query ) ;
httpWebRequest . ContentLength = formData . Length ;
2018-12-15 22:07:29 +01:00
using ( Stream stream = httpWebRequest . GetRequestStream ( ) )
{
2018-05-22 10:11:50 +02:00
stream . Write ( formData , 0 , formData . Length ) ;
}
2018-12-16 15:22:38 +01:00
log . DoLogDebug ( "Built POST request for Properties" ) ;
2018-05-22 10:11:50 +02:00
2018-12-16 15:22:38 +01:00
log . DoLogInfo ( "Sending Properties..." ) ;
2018-05-22 10:11:50 +02:00
HttpWebResponse httpResponse = ( HttpWebResponse ) httpWebRequest . GetResponse ( ) ;
2018-12-16 15:22:38 +01:00
log . DoLogInfo ( "Properties sent!" ) ;
2018-05-22 10:11:50 +02:00
httpResponse . Close ( ) ;
2018-12-16 15:22:38 +01:00
log . DoLogDebug ( "Properties response object closed." ) ;
2018-05-22 10:11:50 +02:00
transferCompleted = true ;
2018-12-15 22:07:29 +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-15 22:07:29 +01:00
if ( ex . Message . IndexOf ( "401" ) > - 1 )
{
2018-12-16 15:22:38 +01:00
log . DoLogError ( "Saving Properties failed for setting '" + systemConfiguration . GeneralSettings . Application . ProfitTrailerDefaultSettingName + "': Unauthorized! The specified Profit Trailer license key '" + systemConfiguration . GetProfitTrailerLicenseKeyMasked ( ) + "' is invalid!" ) ;
2018-05-22 10:11:50 +02:00
transferCanceled = true ;
2018-12-15 22:07:29 +01:00
}
else if ( ex . Message . IndexOf ( "timed out" ) > - 1 )
{
2018-05-22 10:11:50 +02:00
// Handle timeout seperately
retryCount + + ;
2018-12-15 22:07:29 +01:00
if ( retryCount < = maxRetries )
{
2018-12-16 15:22:38 +01:00
log . DoLogError ( "Saving Properties failed for setting '" + systemConfiguration . GeneralSettings . Application . ProfitTrailerDefaultSettingName + "': Timeout! Starting retry number " + retryCount + "/" + maxRetries . ToString ( ) + "!" ) ;
2018-12-15 22:07:29 +01:00
}
else
{
2018-05-22 10:11:50 +02:00
transferCanceled = true ;
2018-12-16 15:22:38 +01:00
log . DoLogError ( "Saving Properties failed for setting '" + systemConfiguration . GeneralSettings . Application . ProfitTrailerDefaultSettingName + "': Timeout! Canceling transfer after " + maxRetries . ToString ( ) + " failed retries." ) ;
2018-05-22 10:11:50 +02:00
}
2018-12-15 22:07:29 +01:00
}
else
{
2018-12-16 15:22:38 +01:00
log . DoLogCritical ( "Saving Properties failed for setting '" + systemConfiguration . GeneralSettings . Application . ProfitTrailerDefaultSettingName + "': " + ex . Message , ex ) ;
2018-05-22 10:11:50 +02:00
transferCanceled = true ;
}
2018-12-15 22:07:29 +01:00
}
catch ( TimeoutException ex )
{
2018-05-22 10:11:50 +02:00
retryCount + + ;
2018-12-15 22:07:29 +01:00
if ( retryCount < = maxRetries )
{
2018-12-16 15:22:38 +01:00
log . DoLogError ( "Saving Properties failed for setting '" + systemConfiguration . GeneralSettings . Application . ProfitTrailerDefaultSettingName + "': Timeout (" + ex . Message + ")! Starting retry number " + retryCount + "/" + maxRetries . ToString ( ) + "!" ) ;
2018-12-15 22:07:29 +01:00
}
else
{
2018-05-22 10:11:50 +02:00
transferCanceled = true ;
2018-12-16 15:22:38 +01:00
log . DoLogError ( "Saving Properties failed for setting '" + systemConfiguration . GeneralSettings . Application . ProfitTrailerDefaultSettingName + "': Timeout (" + ex . Message + ")! Canceling transfer after " + maxRetries . ToString ( ) + " failed retries." ) ;
2018-05-22 10:11:50 +02:00
}
2018-12-15 22:07:29 +01:00
}
catch ( Exception ex )
{
2018-12-16 15:22:38 +01:00
log . DoLogCritical ( "Saving Properties failed for setting '" + systemConfiguration . GeneralSettings . Application . ProfitTrailerDefaultSettingName + "': " + ex . Message , ex ) ;
2018-05-22 10:11:50 +02:00
transferCanceled = true ;
}
}
}
}
}