Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -44,23 +44,14 @@ public static bool EnableCartCommunication(Settings settings, bool orderComplete
{
string enableCartCommunication = settings.CartCommunicationType;

switch (enableCartCommunication)
return enableCartCommunication switch
{
case Constants.CartCommunicationType.None:
return false;

case Constants.CartCommunicationType.Full:
return true;

case Constants.CartCommunicationType.OnlyOnOrderComplete:
return orderComplete;

case Constants.CartCommunicationType.CartOnly:
return !orderComplete;

default:
return false;
}
Constants.CartCommunicationType.None => false,
Constants.CartCommunicationType.Full => true,
Constants.CartCommunicationType.OnlyOnOrderComplete => orderComplete,
Constants.CartCommunicationType.CartOnly => !orderComplete,
_ => false,
};
}

/// <summary>
Expand Down Expand Up @@ -112,7 +103,7 @@ public static string GetShopId(PageView pageView)

public static bool IsLazyLoadingForProductInfoEnabled(Settings settings)
{
return Global.IsIntegrationActive(settings) && settings.EnableLivePrices && Connector.IsWebServiceConnectionAvailable(settings)
return Global.IsIntegrationActive(settings) && settings.EnableLivePrices && Connector.IsWebServiceConnectionAvailable(settings, SubmitType.Live)
&& (settings.LiveProductInfoForAnonymousUsers || Helpers.GetCurrentExtranetUser() != null)
&& (Helpers.GetCurrentExtranetUser() == null || !Helpers.GetCurrentExtranetUser().IsLivePricesDisabled)
&& settings.LazyLoadProductInfo;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
using System;
using System.Collections.Concurrent;
using System.Net;
using System.Net.Http;
using System.Net.Mail;
using System.Runtime.ExceptionServices;
using System.Xml;
using static Dynamicweb.Ecommerce.DynamicwebLiveIntegration.Notifications.Communication;

Expand All @@ -28,7 +31,7 @@ internal static class Connector
/// </summary>
private static readonly int RetryInterval = 500;

private static ConcurrentDictionary<string, DateTime> InstanceIdTooManyRequestsCollection = new ConcurrentDictionary<string, DateTime>();
private static readonly ConcurrentDictionary<string, DateTime> InstanceIdTooManyRequestsCollection = new ConcurrentDictionary<string, DateTime>();
private static int TooManyRequestsTimeoutSeconds = 60;

public static bool EnableThrowExceptions
Expand All @@ -55,31 +58,17 @@ static Connector()
}
}

private static ConnectorBase GetConnector(Settings settings, Logger logger, Order order = null)
private static ConnectorBase GetConnector(Settings settings, Logger logger, SubmitType submitType, Order order = null)
{
if (settings == null || string.IsNullOrEmpty(settings.Endpoint))
{
return new WebServiceConnector(settings, logger, order);
return new WebServiceConnector(settings, logger, submitType, order);
}
else
{
return new EndpointConnector(settings, logger, order);
return new EndpointConnector(settings, logger, submitType, order);
}
}

/// <summary>
/// Calculates the order.
/// </summary>
/// <param name="orderXml">The order XML.</param>
/// <param name="orderId">The order identifier.</param>
/// <param name="createOrder">if set to <c>true</c> [create order].</param>
/// <param name="error">The error.</param>
/// <returns>XmlDocument.</returns>
[Obsolete("Use CalculateOrder(Settings settings, string orderXml, Order order, bool createOrder, out Exception error, Logger logger) instead")]
public static XmlDocument CalculateOrder(Settings settings, string orderXml, string orderId, bool createOrder, out Exception error, Logger logger)
{
return CalculateOrder(settings, orderXml, Services.Orders.GetById(orderId), createOrder, out error, logger);
}
}

/// <summary>
/// Calculates the order.
Expand All @@ -89,7 +78,7 @@ public static XmlDocument CalculateOrder(Settings settings, string orderXml, str
/// <param name="createOrder">if set to <c>true</c> [create order].</param>
/// <param name="error">The error.</param>
/// <returns>XmlDocument.</returns>
public static XmlDocument CalculateOrder(Settings settings, string orderXml, Order order, bool createOrder, out Exception error, Logger logger)
public static XmlDocument CalculateOrder(Settings settings, string orderXml, Order order, bool createOrder, out Exception error, Logger logger, SubmitType submitType)
{
error = null;
XmlDocument document = null;
Expand All @@ -98,7 +87,7 @@ public static XmlDocument CalculateOrder(Settings settings, string orderXml, Ord
{
Diagnostics.ExecutionTable.Current.Add("DynamicwebLiveIntegration.Connector.CalculateOrder START");
// only retry if is not create order, for create order schedule task will send later
document = Communicate(settings, orderXml, $"CalculateOrder (ID: {order.Id}, CreateOrder: {createOrder})", logger, !createOrder, true, order);
document = Communicate(settings, orderXml, $"CalculateOrder (ID: {order.Id}, CreateOrder: {createOrder})", logger, submitType, !createOrder, true, order);
Diagnostics.ExecutionTable.Current.Add("DynamicwebLiveIntegration.Connector.CalculateOrder END");
}
catch (Exception ex)
Expand Down Expand Up @@ -133,31 +122,31 @@ public static void ClearCache()
public static XmlDocument GetProductsInfo(Settings settings, string productsXml, Logger logger, out HttpStatusCode httpStatusCode, bool retry = false)
{
Diagnostics.ExecutionTable.Current.Add("DynamicwebLiveIntegration.Connector.GetProductsInfo START");
var result = Communicate(settings, productsXml, "GetProductsInfo", logger, out httpStatusCode, retry); ;
var result = Communicate(settings, productsXml, "GetProductsInfo", logger, SubmitType.Live, out httpStatusCode, retry);
Diagnostics.ExecutionTable.Current.Add("DynamicwebLiveIntegration.Connector.GetProductsInfo END");
return result;
}

/// <summary>
/// Determines whether the web service connection is available.
/// </summary>
public static bool IsWebServiceConnectionAvailable(Settings settings)
public static bool IsWebServiceConnectionAvailable(Settings settings, SubmitType submitType)
{
return IsWebServiceConnectionAvailable(settings, new Logger(settings));
return IsWebServiceConnectionAvailable(settings, new Logger(settings), submitType);
}

/// <summary>
/// Determines whether the web service connection is available.
/// </summary>
public static bool IsWebServiceConnectionAvailable(Settings settings, Logger logger)
public static bool IsWebServiceConnectionAvailable(Settings settings, Logger logger, SubmitType submitType)
{
if (settings is null)
{
return true;
}
else
{
var connector = GetConnector(settings, logger);
var connector = GetConnector(settings, logger, submitType);
return connector.IsWebServiceConnectionAvailable();
}
}
Expand All @@ -167,10 +156,10 @@ public static bool IsWebServiceConnectionAvailable(Settings settings, Logger log
/// </summary>
/// <param name="request">The request.</param>
/// <returns>XmlDocument.</returns>
public static XmlDocument RetrieveDataFromRequestString(Settings settings, string request, Logger logger)
public static XmlDocument RetrieveDataFromRequestString(Settings settings, string request, Logger logger, SubmitType submitType)
{
Diagnostics.ExecutionTable.Current.Add("DynamicwebLiveIntegration.Connector.RetrieveDataFromRequestString START");
var result = Communicate(settings, request, "RetrieveDataFromRequestString", logger);
var result = Communicate(settings, request, "RetrieveDataFromRequestString", logger, submitType);
Diagnostics.ExecutionTable.Current.Add("DynamicwebLiveIntegration.Connector.RetrieveDataFromRequestString END");
return result;
}
Expand All @@ -183,9 +172,9 @@ public static XmlDocument RetrieveDataFromRequestString(Settings settings, strin
/// <param name="retry">if set to <c>true</c> [retry].</param>
/// <param name="throwException">if set to <c>true</c> [throw exception].</param>
/// <returns>XmlDocument.</returns>
private static XmlDocument Communicate(Settings settings, string request, string referenceName, Logger logger, bool retry = true, bool throwException = false, Order order = null)
private static XmlDocument Communicate(Settings settings, string request, string referenceName, Logger logger, SubmitType submitType, bool retry = true, bool throwException = false, Order order = null)
{
return Communicate(settings, request, referenceName, logger, out _, retry, throwException, order);
return Communicate(settings, request, referenceName, logger, submitType, out _, retry, throwException, order);
}

/// <summary>
Expand All @@ -196,12 +185,12 @@ private static XmlDocument Communicate(Settings settings, string request, string
/// <param name="retry">if set to <c>true</c> [retry].</param>
/// <param name="throwException">if set to <c>true</c> [throw exception].</param>
/// <returns>XmlDocument.</returns>
private static XmlDocument Communicate(Settings settings, string request, string referenceName, Logger logger, out HttpStatusCode httpStatusCode, bool retry = true, bool throwException = false, Order order = null)
private static XmlDocument Communicate(Settings settings, string request, string referenceName, Logger logger, SubmitType submitType, out HttpStatusCode httpStatusCode, bool retry = true, bool throwException = false, Order order = null)
{
XmlDocument result = null;
int retryCount = 0;
httpStatusCode = HttpStatusCode.OK;
var connector = GetConnector(settings, logger, order);
var connector = GetConnector(settings, logger, submitType, order);

if (InstanceIdTooManyRequestsCollection.TryGetValue(settings.InstanceId, out DateTime lastErrorTime) &&
DateTime.Now.Subtract(lastErrorTime).TotalSeconds < TooManyRequestsTimeoutSeconds)
Expand Down Expand Up @@ -277,31 +266,7 @@ private static XmlDocument Communicate(Settings settings, string request, string
logger.Log(ErrorLevel.ConnectionError, $"An error occurred while calling {referenceName} from Web Service: '{ex.Message}'.");
Diagnostics.ExecutionTable.Current.Add($"DynamicwebLiveIntegration: An error occurred while calling {referenceName} from Web Service: '{ex.Message}'.");

bool skipError = false;
//Do not ping Endpoints with Internal Server Error 500 (that means that the request was received but generating response failed)
if (ex?.InnerException != null && ex.InnerException is WebException webException)
{
if (webException != null && webException.Response != null && webException.Response is HttpWebResponse httpWebResponse)
{
httpStatusCode = httpWebResponse.StatusCode;
if (httpWebResponse != null && httpWebResponse.StatusCode == HttpStatusCode.InternalServerError)
{
skipError = true;
retry = false;
}
}
}
//ConnectionError: An error occurred while calling GetProductsInfo from Web Service: 'The remote server returned an error: (429).'
if (!skipError && !string.IsNullOrEmpty(ex.Message) && ex.Message.Contains("(429)"))
{
skipError = true;
retry = false;
InstanceIdTooManyRequestsCollection.TryAdd(settings.InstanceId, DateTime.Now);
}
if (!skipError)
{
connector.Error(endpoint);
}
HandleException(connector, settings, endpoint, ex, out httpStatusCode, ref retry);

NotificationManager.Notify(OnAfterErpException, new OnAfterErpExceptionArgs(request, erpXmlResponse, referenceName, ex, settings, logger));
}
Expand Down Expand Up @@ -329,15 +294,66 @@ private static XmlDocument Communicate(Settings settings, string request, string
return result;
}

internal static string RetrievePDF(Settings settings, string requestString)
private static void HandleException(ConnectorBase connector, Settings settings, EndpointInfo endpoint, Exception ex, out HttpStatusCode httpStatusCode, ref bool retry)
{
httpStatusCode = HttpStatusCode.OK;
bool skipError = false;
//Do not ping Endpoints with Internal Server Error 500 (that means that the request was received but generating response failed)
if (ex?.InnerException is not null)
{
if (ex.InnerException is WebException webException)
{
if (webException is not null && webException.Response is not null && webException.Response is HttpWebResponse httpWebResponse)
{
httpStatusCode = httpWebResponse.StatusCode;
if (httpWebResponse is not null && httpWebResponse.StatusCode == HttpStatusCode.InternalServerError)
{
skipError = true;
retry = false;
}
}
}
else if (ex.InnerException is HttpRequestException httpReqException && httpReqException?.StatusCode is not null)
{
httpStatusCode = (HttpStatusCode)httpReqException.StatusCode;
if (httpReqException.StatusCode == HttpStatusCode.InternalServerError)
{
skipError = true;
retry = false;
}
}
}
if (!skipError && ex is not null && ex is HttpRequestException httpRequestException && httpRequestException?.StatusCode is not null)
{
httpStatusCode = (HttpStatusCode)httpRequestException.StatusCode;
if (httpRequestException.StatusCode == HttpStatusCode.InternalServerError)
{
skipError = true;
retry = false;
}
}
//ConnectionError: An error occurred while calling GetProductsInfo from Web Service: 'The remote server returned an error: (429).'
if (!skipError && !string.IsNullOrEmpty(ex.Message) && ex.Message.Contains("(429)"))
{
skipError = true;
retry = false;
InstanceIdTooManyRequestsCollection.TryAdd(settings.InstanceId, DateTime.Now);
}
if (!skipError)
{
connector.Error(endpoint);
}
}

internal static string RetrievePDF(Settings settings, string requestString, SubmitType submitType)
{
Diagnostics.ExecutionTable.Current.Add("DynamicwebLiveIntegration.Connector.RetrievePDF START");
string base64EncodedPDF;
var logger = new Logger(settings);
try
{
logger.Log(ErrorLevel.DebugInfo, string.Format("Request RetrievePDF sent: '{0}'.", requestString));
base64EncodedPDF = GetConnector(settings, logger).Execute(requestString);
base64EncodedPDF = GetConnector(settings, logger, submitType).Execute(requestString);
logger.Log(ErrorLevel.DebugInfo, string.Format("Response RetrievePDF received: '{0}'.", base64EncodedPDF));
}
catch (Exception ex)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,23 +13,13 @@ namespace Dynamicweb.Ecommerce.DynamicwebLiveIntegration.Connectors
/// <summary>
/// Abstract base connector
/// </summary>
internal abstract class ConnectorBase
internal abstract class ConnectorBase(Settings settings, Logger logger, Order order, SubmitType submitType)
{
protected Settings Settings { get; }
protected Logger Logger { get; }
protected Order Order { get; }
protected Settings Settings { get; } = settings;
protected Logger Logger { get; } = logger;
protected Order Order { get; } = order;

[Obsolete("Use ConnectorBase(Settings settings, Logger logger, Order order) instead")]
public ConnectorBase(Settings settings, Logger logger) : this(settings, logger, null)
{
}

public ConnectorBase(Settings settings, Logger logger, Order order)
{
Settings = settings;
Logger = logger;
Order = order;
}
protected SubmitType SubmitType { get; } = submitType;

internal abstract EndpointInfo GetEndpoint();
internal abstract string Execute(string request);
Expand All @@ -46,7 +36,7 @@ public ConnectorBase(Settings settings, Logger logger, Order order)

internal void Error(EndpointInfo endpoint)
{
EndpointMonitoringService.Error(Settings, endpoint);
EndpointMonitoringService.Error(Settings, endpoint, SubmitType);
}

internal string Execute(EndpointInfo endpoint, string request)
Expand Down Expand Up @@ -81,7 +71,7 @@ protected bool ExecuteConnectionAvailableRequest(EndpointInfo endpoint, out Exce
error = ex;
Logger?.Log(ErrorLevel.ConnectionError, $"Error checking Web Service connection: '{ex.Message}'. Request: '{request}'.");

EndpointMonitoringService.Error(Settings, endpoint);
EndpointMonitoringService.Error(Settings, endpoint, SubmitType);

NotificationManager.Notify(OnErpCommunicationLost, new OnErpCommunicationLostArgs(request, ex, Settings, Logger));

Expand Down
Loading