Browse Source

Merge pull request #2196 from celeron533/pac_user_rules

Update PAC to handle user rules in a better way
tags/4.1.5
Allen Zhu GitHub 5 years ago
parent
commit
0cb9158233
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 29 additions and 21 deletions
  1. +29
    -21
      shadowsocks-csharp/Controller/Service/GfwListUpdater.cs
  2. BIN
      shadowsocks-csharp/Data/abp.js.gz
  3. BIN
      shadowsocks-csharp/Data/proxy.pac.txt.gz

+ 29
- 21
shadowsocks-csharp/Controller/Service/GfwListUpdater.cs View File

@@ -47,21 +47,21 @@ namespace Shadowsocks.Controller
public static bool MergeAndWritePACFile(string gfwListResult)
{
List<string> lines = new List<string>();
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<string> userruleLines = new List<string>();
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<string> gfwLines = new List<string>();
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<string> ParseResult(string response)
public static List<string> ParseBase64ToValidList(string response)
{
byte[] bytes = Convert.FromBase64String(response);
string content = Encoding.ASCII.GetString(bytes);
return ParseToValidList(content);
}
private static List<string> ParseToValidList(string content)
{
List<string> valid_lines = new List<string>();
using (var sr = new StringReader(content))
{


BIN
shadowsocks-csharp/Data/abp.js.gz View File


BIN
shadowsocks-csharp/Data/proxy.pac.txt.gz View File


Loading…
Cancel
Save