using System.Net; using Microsoft.AspNetCore.Http; using Microsoft.Net.Http.Headers; using Nop.Core; using Nop.Core.Domain.Common; using Nop.Core.Domain.Messages; using Nop.Core.Rss; using Nop.Services.Localization; using Nop.Services.Messages; namespace Nop.Services.Common; /// /// Represents the HTTP client to request nopCommerce official site /// public partial class NopHttpClient { #region Fields protected readonly AdminAreaSettings _adminAreaSettings; protected readonly EmailAccountSettings _emailAccountSettings; protected readonly HttpClient _httpClient; protected readonly IEmailAccountService _emailAccountService; protected readonly IHttpContextAccessor _httpContextAccessor; protected readonly ILanguageService _languageService; protected readonly IWebHelper _webHelper; protected readonly IWorkContext _workContext; #endregion #region Ctor public NopHttpClient(AdminAreaSettings adminAreaSettings, EmailAccountSettings emailAccountSettings, HttpClient client, IEmailAccountService emailAccountService, IHttpContextAccessor httpContextAccessor, ILanguageService languageService, IWebHelper webHelper, IWorkContext workContext) { //configure client client.BaseAddress = new Uri("https://www.nopcommerce.com/"); client.Timeout = TimeSpan.FromSeconds(5); client.DefaultRequestHeaders.Add(HeaderNames.UserAgent, $"nopCommerce-{NopVersion.CURRENT_VERSION}"); _adminAreaSettings = adminAreaSettings; _emailAccountSettings = emailAccountSettings; _httpClient = client; _emailAccountService = emailAccountService; _httpContextAccessor = httpContextAccessor; _languageService = languageService; _webHelper = webHelper; _workContext = workContext; } #endregion #region Methods /// /// Check whether the site is available /// /// /// A task that represents the asynchronous operation /// The task result contains the asynchronous task whose result determines that request is completed /// public virtual async Task PingAsync() { await _httpClient.GetStringAsync("/"); } /// /// Check the current store for license compliance /// /// /// A task that represents the asynchronous operation /// The task result contains the asynchronous task whose result contains the license check details /// public virtual async Task GetLicenseCheckDetailsAsync() { var isLocal = _webHelper.IsLocalRequest(_httpContextAccessor.HttpContext.Request); var storeUrl = _webHelper.GetStoreLocation(); if (!_adminAreaSettings.CheckLicense || isLocal || storeUrl.Contains("localhost")) return string.Empty; var emailAccount = await _emailAccountService.GetEmailAccountByIdAsync(_emailAccountSettings.DefaultEmailAccountId) ?? (await _emailAccountService.GetAllEmailAccountsAsync()).FirstOrDefault(); var language = _languageService.GetTwoLetterIsoLanguageName(await _workContext.GetWorkingLanguageAsync()); var url = string.Format(NopCommonDefaults.NopLicenseCheckPath, storeUrl, NopVersion.FULL_VERSION, WebUtility.UrlEncode(emailAccount.Email), language).ToLowerInvariant(); return await _httpClient.GetStringAsync(url); } /// /// Get official news RSS /// /// /// A task that represents the asynchronous operation /// The task result contains the asynchronous task whose result contains news RSS feed /// public virtual async Task GetNewsRssAsync() { //prepare URL to request var language = _languageService.GetTwoLetterIsoLanguageName(await _workContext.GetWorkingLanguageAsync()); var url = string.Format(NopCommonDefaults.NopNewsRssPath, NopVersion.FULL_VERSION, _webHelper.IsLocalRequest(_httpContextAccessor.HttpContext.Request), _adminAreaSettings.HideAdvertisementsOnAdminArea, _webHelper.GetStoreLocation(), language).ToLowerInvariant(); //get news feed await using var stream = await _httpClient.GetStreamAsync(url); return await RssFeed.LoadAsync(stream); } /// /// Notification about the successful installation /// /// Admin email /// Language code /// Culture name /// /// A task that represents the asynchronous operation /// The task result contains the asynchronous task whose result contains the result string /// public virtual async Task InstallationCompletedAsync(string email, string languageCode, string culture) { //prepare URL to request var url = string.Format(NopCommonDefaults.NopInstallationCompletedPath, NopVersion.FULL_VERSION, _webHelper.IsLocalRequest(_httpContextAccessor.HttpContext.Request), WebUtility.UrlEncode(email), _webHelper.GetStoreLocation(), languageCode, culture) .ToLowerInvariant(); //this request takes some more time try { if (_httpClient.Timeout != TimeSpan.FromSeconds(30)) _httpClient.Timeout = TimeSpan.FromSeconds(30); } catch { } return await _httpClient.GetStringAsync(url); } /// /// Subscribe to nopCommerce newsletters during installation /// /// Admin email /// /// A task that represents the asynchronous operation /// The task result contains the asynchronous task whose result contains the result string /// public virtual async Task SubscribeNewslettersAsync(string email) { //prepare URL to request var url = string.Format(NopCommonDefaults.NopSubscribeNewslettersPath, WebUtility.UrlEncode(email)) .ToLowerInvariant(); return await _httpClient.GetAsync(url); } /// /// Get a response regarding available categories of marketplace extensions /// /// /// A task that represents the asynchronous operation /// The task result contains the asynchronous task whose result contains the result string /// public virtual async Task GetExtensionsCategoriesAsync() { //prepare URL to request var language = _languageService.GetTwoLetterIsoLanguageName(await _workContext.GetWorkingLanguageAsync()); var url = string.Format(NopCommonDefaults.NopExtensionsCategoriesPath, language).ToLowerInvariant(); //get XML response return await _httpClient.GetStringAsync(url); } /// /// Get a response regarding available versions of marketplace extensions /// /// /// A task that represents the asynchronous operation /// The task result contains the asynchronous task whose result contains the result string /// public virtual async Task GetExtensionsVersionsAsync() { //prepare URL to request var language = _languageService.GetTwoLetterIsoLanguageName(await _workContext.GetWorkingLanguageAsync()); var url = string.Format(NopCommonDefaults.NopExtensionsVersionsPath, language).ToLowerInvariant(); //get XML response return await _httpClient.GetStringAsync(url); } /// /// Get a response regarding marketplace extensions /// /// Category identifier /// Version identifier /// Price; 0 - all, 10 - free, 20 - paid /// Search term /// Page index /// Page size /// /// A task that represents the asynchronous operation /// The task result contains the asynchronous task whose result contains the result string /// public virtual async Task GetExtensionsAsync(int categoryId = 0, int versionId = 0, int price = 0, string searchTerm = null, int pageIndex = 0, int pageSize = int.MaxValue) { //prepare URL to request var language = _languageService.GetTwoLetterIsoLanguageName(await _workContext.GetWorkingLanguageAsync()); var url = string.Format(NopCommonDefaults.NopExtensionsPath, categoryId, versionId, price, WebUtility.UrlEncode(searchTerm), pageIndex, pageSize, language).ToLowerInvariant(); //get XML response return await _httpClient.GetStringAsync(url); } #endregion }