Skip to content

Commit

Permalink
#1964 The speed of loading user agents was increased and memory usag…
Browse files Browse the repository at this point in the history
…e was reduced
  • Loading branch information
skoshelev committed Dec 21, 2016
1 parent a7084d6 commit f61e692
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 15 deletions.
21 changes: 11 additions & 10 deletions src/Libraries/Nop.Services/Helpers/BrowscapXmlParser.cs
Expand Up @@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Xml.Linq;
using Nop.Core;
Expand All @@ -14,7 +15,7 @@ namespace Nop.Services.Helpers
public class BrowscapXmlHelper
{
private readonly List<string> _crawlerUserAgentsRegexp;

public BrowscapXmlHelper(string filePath)
{
_crawlerUserAgentsRegexp = new List<string>();
Expand All @@ -26,9 +27,7 @@ private void Initialize(string filePath)
{
using (var sr = new StreamReader(filePath))
{
var text = sr.ReadToEnd().Replace("&", "&amp;");

var browsercapItems = XDocument.Parse(text).Root.Return(x => x.Element("browsercapitems"), null);
var browsercapItems = XDocument.Load(sr).Root.Return(x => x.Element("browsercapitems"), null);

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

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

private string ToRegexp(string str)
private static string ToRegexp(string str)
{
str = String.Format("^{0}$", Regex.Escape(str));
return str.Replace("\\?", ".").Replace("\\*", ".*?");
var sb = new StringBuilder(Regex.Escape(str));
sb.Replace("&amp;", "&").Replace("\\?", ".").Replace("\\*", ".*?");
return string.Format("^{0}$", sb);
}

/// <summary>
Expand Down
19 changes: 14 additions & 5 deletions src/Libraries/Nop.Services/Helpers/UserAgentHelper.cs
Expand Up @@ -15,6 +15,7 @@ public partial class UserAgentHelper : IUserAgentHelper
{
private readonly NopConfig _config;
private readonly HttpContextBase _httpContext;
private static readonly object _locker = new object();

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

var filePath = CommonHelper.MapPath(_config.UserAgentStringsPath);
var bowscapXmlHelper = new BrowscapXmlHelper(filePath);

Singleton<BrowscapXmlHelper>.Instance = bowscapXmlHelper;
return Singleton<BrowscapXmlHelper>.Instance;
//prevent multi loading data
lock (_locker)
{
//data can be loaded while we waited
if (Singleton<BrowscapXmlHelper>.Instance != null)
return Singleton<BrowscapXmlHelper>.Instance;

var filePath = CommonHelper.MapPath(_config.UserAgentStringsPath);
var browscapXmlHelper = new BrowscapXmlHelper(filePath);
Singleton<BrowscapXmlHelper>.Instance = browscapXmlHelper;

return Singleton<BrowscapXmlHelper>.Instance;
}
}

/// <summary>
Expand Down

0 comments on commit f61e692

Please sign in to comment.