Skip to content

Commit 0a5651a

Browse files
committed
Merge branch 'issue-1964-BrowscapXmlHelper-performance-issue' into develop
2 parents ceda101 + dde91cd commit 0a5651a

File tree

6 files changed

+67
-19
lines changed

6 files changed

+67
-19
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,4 +162,5 @@ src/Presentation/Nop.Web/Plugins/*
162162
src/Presentation/Nop.Web/Content/Images/Thumbs/*
163163
src/Presentation/Nop.Web/App_Data/InstalledPlugins.txt
164164
src/Presentation/Nop.Web/App_Data/Settings.txt
165+
src/Presentation/Nop.Web/App_Data/browscap.crawlersonly.xml
165166
src/Presentation/Nop.Web/Administration/db_backups/*.bak

src/Libraries/Nop.Core/Configuration/NopConfig.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ public object Create(object parent, object configContext, XmlNode section)
2929

3030
var userAgentStringsNode = section.SelectSingleNode("UserAgentStrings");
3131
config.UserAgentStringsPath = GetString(userAgentStringsNode, "databasePath");
32-
32+
config.CrawlerOnlyUserAgentStringsPath = GetString(userAgentStringsNode, "crawlersOnlyDatabasePath");
33+
3334
var supportPreviousNopcommerceVersionsNode = section.SelectSingleNode("SupportPreviousNopcommerceVersions");
3435
config.SupportPreviousNopcommerceVersions = GetBool(supportPreviousNopcommerceVersionsNode, "Enabled");
3536

@@ -79,6 +80,11 @@ private T SetByXElement<T>(XmlNode node, string attrName, Func<string, T> conver
7980
/// </summary>
8081
public string UserAgentStringsPath { get; private set; }
8182

83+
/// <summary>
84+
/// Path to database with crawler only user agent strings
85+
/// </summary>
86+
public string CrawlerOnlyUserAgentStringsPath { get; private set; }
87+
8288

8389

8490
/// <summary>

src/Libraries/Nop.Services/Helpers/BrowscapXmlParser.cs

Lines changed: 52 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,30 +16,67 @@ public class BrowscapXmlHelper
1616
{
1717
private readonly List<string> _crawlerUserAgentsRegexp;
1818

19-
public BrowscapXmlHelper(string filePath)
19+
public BrowscapXmlHelper(string userAgentStringsPath, string crawlerOnlyUserAgentStringsPath)
2020
{
2121
_crawlerUserAgentsRegexp = new List<string>();
2222

23-
Initialize(filePath);
23+
Initialize(userAgentStringsPath, crawlerOnlyUserAgentStringsPath);
2424
}
2525

26-
private void Initialize(string filePath)
26+
private void Initialize(string userAgentStringsPath, string crawlerOnlyUserAgentStringsPath)
2727
{
28-
using (var sr = new StreamReader(filePath))
28+
List<XElement> crawlerItems = null;
29+
30+
if (!string.IsNullOrEmpty(crawlerOnlyUserAgentStringsPath) && File.Exists(crawlerOnlyUserAgentStringsPath))
31+
{
32+
//try to load crawler list from crawlers only file
33+
using (var sr = new StreamReader(crawlerOnlyUserAgentStringsPath))
34+
{
35+
crawlerItems = XDocument.Load(sr).Root.Return(x => x.Elements("browscapitem").ToList(), null);
36+
}
37+
}
38+
39+
if (crawlerItems == null)
40+
{
41+
//try to load crawler list from full user agents file
42+
using (var sr = new StreamReader(userAgentStringsPath))
43+
{
44+
crawlerItems = XDocument.Load(sr).Root.Return(x => x.Element("browsercapitems"), null)
45+
//only crawlers
46+
.Return(x => x.Elements("browscapitem").Where(IsBrowscapItemIsCrawler).ToList(), null);
47+
}
48+
}
49+
50+
if (crawlerItems == null)
51+
throw new Exception("Incorrect file format");
52+
53+
_crawlerUserAgentsRegexp.AddRange(crawlerItems
54+
//get only user agent names
55+
.Select(e => e.Attribute("name"))
56+
.Where(e => e != null && !string.IsNullOrEmpty(e.Value))
57+
.Select(e => e.Value)
58+
.Select(ToRegexp));
59+
60+
if (string.IsNullOrEmpty(crawlerOnlyUserAgentStringsPath) || File.Exists(crawlerOnlyUserAgentStringsPath))
61+
return;
62+
63+
//try to write crawlers file
64+
using (var sw = new StreamWriter(crawlerOnlyUserAgentStringsPath))
2965
{
30-
var browsercapItems = XDocument.Load(sr).Root.Return(x => x.Element("browsercapitems"), null);
66+
var root = new XElement("browsercapitems");
3167

32-
if (browsercapItems == null)
33-
throw new Exception("Incorrect file format");
68+
foreach (var crawler in crawlerItems)
69+
{
70+
foreach (var element in crawler.Elements().ToList())
71+
{
72+
if (element.Attribute("name").Return(x => x.Value.ToLower(), string.Empty) == "crawler")
73+
continue;
74+
element.Remove();
75+
}
3476

35-
_crawlerUserAgentsRegexp.AddRange(browsercapItems.Elements("browscapitem")
36-
//only crawlers
37-
.Where(IsBrowscapItemIsCrawler)
38-
//get only user agent names
39-
.Select(e => e.Attribute("name"))
40-
.Where(e => e != null && !string.IsNullOrEmpty(e.Value))
41-
.Select(e => e.Value)
42-
.Select(ToRegexp));
77+
root.Add(crawler);
78+
}
79+
root.Save(sw);
4380
}
4481
}
4582

src/Libraries/Nop.Services/Helpers/UserAgentHelper.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,10 @@ protected virtual BrowscapXmlHelper GetBrowscapXmlHelper()
4545
if (Singleton<BrowscapXmlHelper>.Instance != null)
4646
return Singleton<BrowscapXmlHelper>.Instance;
4747

48-
var filePath = CommonHelper.MapPath(_config.UserAgentStringsPath);
49-
var browscapXmlHelper = new BrowscapXmlHelper(filePath);
48+
var userAgentStringsPath = CommonHelper.MapPath(_config.UserAgentStringsPath);
49+
var crawlerOnlyUserAgentStringsPath = string.IsNullOrEmpty(_config.CrawlerOnlyUserAgentStringsPath) ? string.Empty : CommonHelper.MapPath(_config.CrawlerOnlyUserAgentStringsPath);
50+
51+
var browscapXmlHelper = new BrowscapXmlHelper(userAgentStringsPath, crawlerOnlyUserAgentStringsPath);
5052
Singleton<BrowscapXmlHelper>.Instance = browscapXmlHelper;
5153

5254
return Singleton<BrowscapXmlHelper>.Instance;

src/Presentation/Nop.Web/Nop.Web.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1281,6 +1281,7 @@
12811281
App_Data\InstalledPlugins.txt;
12821282
App_Data\Settings.txt;
12831283
App_Data\Nop.Db.sdf;
1284+
App_Data\browscap.crawlersonly.xml;
12841285
bin\Nop.Admin.dll.config;
12851286
bin\Nop.Web.dll.config;
12861287
Content\Files\ExportImport\*.txt;

src/Presentation/Nop.Web/Web.config

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@
2929
<!-- Redis support (used by web farms, Azure, etc). Find more about it at https://azure.microsoft.com/en-us/documentation/articles/cache-dotnet-how-to-use-azure-redis-cache/ -->
3030
<RedisCaching Enabled="false" ConnectionString="localhost" />
3131
<!-- You can get the latest version of user agent strings at http://browscap.org/ -->
32-
<UserAgentStrings databasePath="~/App_Data/browscap.xml" />
32+
<!-- Leave "crawlersOnlyDatabasePath" attribute empty if you want to use full version of "browscap.xml" file -->
33+
<UserAgentStrings databasePath="~/App_Data/browscap.xml" crawlersOnlyDatabasePath="~/App_Data/browscap.crawlersonly.xml"/>
3334
<!-- Set the setting below to "False" if you did not upgrade from one of the previous versions. It can slightly improve performance -->
3435
<SupportPreviousNopcommerceVersions Enabled="True" />
3536
<!-- Do not edit this element. For advanced users only -->

0 commit comments

Comments
 (0)