Skip to content

Commit f61e692

Browse files
committed
#1964 The speed of loading user agents was increased and memory usage was reduced
1 parent a7084d6 commit f61e692

File tree

2 files changed

+25
-15
lines changed

2 files changed

+25
-15
lines changed

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

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.IO;
44
using System.Linq;
5+
using System.Text;
56
using System.Text.RegularExpressions;
67
using System.Xml.Linq;
78
using Nop.Core;
@@ -14,7 +15,7 @@ namespace Nop.Services.Helpers
1415
public class BrowscapXmlHelper
1516
{
1617
private readonly List<string> _crawlerUserAgentsRegexp;
17-
18+
1819
public BrowscapXmlHelper(string filePath)
1920
{
2021
_crawlerUserAgentsRegexp = new List<string>();
@@ -26,9 +27,7 @@ private void Initialize(string filePath)
2627
{
2728
using (var sr = new StreamReader(filePath))
2829
{
29-
var text = sr.ReadToEnd().Replace("&", "&amp;");
30-
31-
var browsercapItems = XDocument.Parse(text).Root.Return(x => x.Element("browsercapitems"), null);
30+
var browsercapItems = XDocument.Load(sr).Root.Return(x => x.Element("browsercapitems"), null);
3231

3332
if (browsercapItems == null)
3433
throw new Exception("Incorrect file format");
@@ -37,8 +36,9 @@ private void Initialize(string filePath)
3736
//only crawlers
3837
.Where(IsBrowscapItemIsCrawler)
3938
//get only user agent names
40-
.Select(e => e.Attribute("name").Return(a => a.Value.Replace("&amp;", "&"), ""))
41-
.Where(s => !string.IsNullOrEmpty(s))
39+
.Select(e => e.Attribute("name"))
40+
.Where(e => e != null && !string.IsNullOrEmpty(e.Value))
41+
.Select(e => e.Value)
4242
.Select(ToRegexp));
4343
}
4444
}
@@ -47,13 +47,14 @@ private static bool IsBrowscapItemIsCrawler(XElement browscapItem)
4747
{
4848
var el = browscapItem.Elements("item").FirstOrDefault(e => e.Attribute("name").Return(a => a.Value, "") == "Crawler");
4949

50-
return el == null ? false : el.Attribute("value").Return(a => a.Value.ToLower() == "true", false);
50+
return el != null && el.Attribute("value").Return(a => a.Value.ToLower() == "true", false);
5151
}
5252

53-
private string ToRegexp(string str)
53+
private static string ToRegexp(string str)
5454
{
55-
str = String.Format("^{0}$", Regex.Escape(str));
56-
return str.Replace("\\?", ".").Replace("\\*", ".*?");
55+
var sb = new StringBuilder(Regex.Escape(str));
56+
sb.Replace("&amp;", "&").Replace("\\?", ".").Replace("\\*", ".*?");
57+
return string.Format("^{0}$", sb);
5758
}
5859

5960
/// <summary>

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

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public partial class UserAgentHelper : IUserAgentHelper
1515
{
1616
private readonly NopConfig _config;
1717
private readonly HttpContextBase _httpContext;
18+
private static readonly object _locker = new object();
1819

1920
/// <summary>
2021
/// Ctor
@@ -37,11 +38,19 @@ protected virtual BrowscapXmlHelper GetBrowscapXmlHelper()
3738
if (String.IsNullOrEmpty(_config.UserAgentStringsPath))
3839
return null;
3940

40-
var filePath = CommonHelper.MapPath(_config.UserAgentStringsPath);
41-
var bowscapXmlHelper = new BrowscapXmlHelper(filePath);
42-
43-
Singleton<BrowscapXmlHelper>.Instance = bowscapXmlHelper;
44-
return Singleton<BrowscapXmlHelper>.Instance;
41+
//prevent multi loading data
42+
lock (_locker)
43+
{
44+
//data can be loaded while we waited
45+
if (Singleton<BrowscapXmlHelper>.Instance != null)
46+
return Singleton<BrowscapXmlHelper>.Instance;
47+
48+
var filePath = CommonHelper.MapPath(_config.UserAgentStringsPath);
49+
var browscapXmlHelper = new BrowscapXmlHelper(filePath);
50+
Singleton<BrowscapXmlHelper>.Instance = browscapXmlHelper;
51+
52+
return Singleton<BrowscapXmlHelper>.Instance;
53+
}
4554
}
4655

4756
/// <summary>

0 commit comments

Comments
 (0)