using System; using System.Collections.Generic; using System.Text; using System.Net; using System.IO; using Shadowsocks.Properties; using SimpleJson; using Shadowsocks.Util; using Shadowsocks.Model; namespace Shadowsocks.Controller { public class GFWListUpdater { private const string GFWLIST_URL = "https://autoproxy-gfwlist.googlecode.com/svn/trunk/gfwlist.txt"; private static string PAC_FILE = PACServer.PAC_FILE; public event EventHandler UpdateCompleted; public event ErrorEventHandler Error; private void http_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { try { List lines = ParseResult(e.Result); string abpContent = Utils.UnGzip(Resources.abp_js); abpContent = abpContent.Replace("__RULES__", SimpleJson.SimpleJson.SerializeObject(lines)); File.WriteAllText(PAC_FILE, abpContent, Encoding.UTF8); if (UpdateCompleted != null) { UpdateCompleted(this, new EventArgs()); } } catch (Exception ex) { if (Error != null) { Error(this, new ErrorEventArgs(ex)); } } } public void UpdatePACFromGFWList(Configuration config) { WebClient http = new WebClient(); http.Proxy = new WebProxy(IPAddress.Loopback.ToString(), config.localPort); http.DownloadStringCompleted += http_DownloadStringCompleted; http.DownloadStringAsync(new Uri(GFWLIST_URL)); } public List ParseResult(string response) { byte[] bytes = Convert.FromBase64String(response); string content = Encoding.ASCII.GetString(bytes); string[] lines = content.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); List valid_lines = new List(lines.Length); foreach (string line in lines) { if (line.StartsWith("!") || line.StartsWith("[")) continue; valid_lines.Add(line); } return valid_lines; } } }