diff --git a/shadowsocks-csharp/Controller/Service/GfwListUpdater.cs b/shadowsocks-csharp/Controller/Service/GfwListUpdater.cs index 702170d4..c283d210 100644 --- a/shadowsocks-csharp/Controller/Service/GfwListUpdater.cs +++ b/shadowsocks-csharp/Controller/Service/GfwListUpdater.cs @@ -47,21 +47,21 @@ namespace Shadowsocks.Controller public static bool MergeAndWritePACFile(string gfwListResult) { - List lines = new List(); - if (File.Exists(PACServer.USER_RULE_FILE)) + string abpContent = MergePACFile(gfwListResult); + if (File.Exists(PACServer.PAC_FILE)) { - string local = FileManager.NonExclusiveReadAllText(PACServer.USER_RULE_FILE, Encoding.UTF8); - using (var sr = new StringReader(local)) + string original = FileManager.NonExclusiveReadAllText(PACServer.PAC_FILE, Encoding.UTF8); + if (original == abpContent) { - foreach (var rule in sr.NonWhiteSpaceLines()) - { - if (rule.BeginWithAny(IgnoredLineBegins)) - continue; - lines.Add(rule); - } + return false; } } - lines.AddRange(ParseResult(gfwListResult)); + File.WriteAllText(PACServer.PAC_FILE, abpContent, Encoding.UTF8); + return true; + } + + private static string MergePACFile(string gfwListResult) + { string abpContent; if (File.Exists(PACServer.USER_ABP_FILE)) { @@ -71,17 +71,20 @@ namespace Shadowsocks.Controller { abpContent = Utils.UnGzip(Resources.abp_js); } - abpContent = abpContent.Replace("__RULES__", JsonConvert.SerializeObject(lines, Formatting.Indented)); - if (File.Exists(PACServer.PAC_FILE)) + + List userruleLines = new List(); + if (File.Exists(PACServer.USER_RULE_FILE)) { - string original = FileManager.NonExclusiveReadAllText(PACServer.PAC_FILE, Encoding.UTF8); - if (original == abpContent) - { - return false; - } + string userrulesString = FileManager.NonExclusiveReadAllText(PACServer.USER_RULE_FILE, Encoding.UTF8); + userruleLines = ParseToValidList(userrulesString); } - File.WriteAllText(PACServer.PAC_FILE, abpContent, Encoding.UTF8); - return true; + + List gfwLines = new List(); + gfwLines = ParseBase64ToValidList(gfwListResult); + + abpContent = abpContent.Replace("__USERRULES__", JsonConvert.SerializeObject(userruleLines, Formatting.Indented)) + .Replace("__RULES__", JsonConvert.SerializeObject(gfwLines, Formatting.Indented)); + return abpContent; } public void UpdatePACFromGFWList(Configuration config) @@ -92,10 +95,15 @@ namespace Shadowsocks.Controller http.DownloadStringAsync(new Uri(GFWLIST_URL)); } - public static List ParseResult(string response) + public static List ParseBase64ToValidList(string response) { byte[] bytes = Convert.FromBase64String(response); string content = Encoding.ASCII.GetString(bytes); + return ParseToValidList(content); + } + + private static List ParseToValidList(string content) + { List valid_lines = new List(); using (var sr = new StringReader(content)) { diff --git a/shadowsocks-csharp/Data/abp.js.gz b/shadowsocks-csharp/Data/abp.js.gz index 0577c7f5..740cb462 100755 Binary files a/shadowsocks-csharp/Data/abp.js.gz and b/shadowsocks-csharp/Data/abp.js.gz differ