22using System . Collections . Generic ;
33using System . IO ;
44using System . Linq ;
5+ using System . Text ;
56using System . Text . RegularExpressions ;
67using System . Xml . Linq ;
78using 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 ( "&" , "&" ) ;
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 ( "&" , "&" ) , "" ) )
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 ( "&" , "&" ) . Replace ( "\\ ?" , "." ) . Replace ( "\\ *" , ".*?" ) ;
57+ return string . Format ( "^{0}$" , sb ) ;
5758 }
5859
5960 /// <summary>
0 commit comments