From 98b70f7ef03aa874926a985f18a33ea40cd92e53 Mon Sep 17 00:00:00 2001 From: Bruce Wayne Date: Sun, 17 Nov 2019 12:42:07 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=C2=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shadowsocks-csharp/Controller/HttpRequest/HttpRequest.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/shadowsocks-csharp/Controller/HttpRequest/HttpRequest.cs b/shadowsocks-csharp/Controller/HttpRequest/HttpRequest.cs index 6980994ce78..5ace30bf370 100644 --- a/shadowsocks-csharp/Controller/HttpRequest/HttpRequest.cs +++ b/shadowsocks-csharp/Controller/HttpRequest/HttpRequest.cs @@ -14,11 +14,11 @@ public abstract class HttpRequest private static async Task GetAsync(string url, IWebProxy proxy, string userAgent = @"", double timeout = DefaultGetTimeout) { - var httpClientHandler = new HttpClientHandler(); - if (proxy != null) + var httpClientHandler = new HttpClientHandler { - httpClientHandler.Proxy = proxy; - } + Proxy = proxy, + UseProxy = proxy != null + }; var httpClient = new HttpClient(httpClientHandler) { Timeout = TimeSpan.FromMilliseconds(timeout) From c459f04680c5a690f7335c70f647dc6f8684dffb Mon Sep 17 00:00:00 2001 From: Bruce Wayne Date: Mon, 18 Nov 2019 14:07:40 +0800 Subject: [PATCH 2/3] Refine logging --- .../Controller/HttpRequest/HttpRequest.cs | 2 +- shadowsocks-csharp/Controller/Logging.cs | 225 ++++++++---------- .../Controller/ShadowsocksController.cs | 2 +- 3 files changed, 102 insertions(+), 127 deletions(-) diff --git a/shadowsocks-csharp/Controller/HttpRequest/HttpRequest.cs b/shadowsocks-csharp/Controller/HttpRequest/HttpRequest.cs index 5ace30bf370..024e9902094 100644 --- a/shadowsocks-csharp/Controller/HttpRequest/HttpRequest.cs +++ b/shadowsocks-csharp/Controller/HttpRequest/HttpRequest.cs @@ -77,7 +77,7 @@ protected static async Task AutoGetAsync(string url, IWebProxy proxy, st } } if (res != null) return res; - Logging.Info($@"GET request by default: {url}"); + Logging.Info($@"GET request directly: {url}"); res = await GetAsync(url, null, userAgent, getTimeout); return res; } diff --git a/shadowsocks-csharp/Controller/Logging.cs b/shadowsocks-csharp/Controller/Logging.cs index 447bf5d9ec8..7c3e2241fb4 100755 --- a/shadowsocks-csharp/Controller/Logging.cs +++ b/shadowsocks-csharp/Controller/Logging.cs @@ -2,23 +2,25 @@ using Shadowsocks.Obfs; using Shadowsocks.Util; using System; +using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Net.Sockets; +using System.Text; namespace Shadowsocks.Controller { - public class Logging + public static class Logging { public static string LogFile; public static string LogFileName; - protected static string date; + private static string _date; private static FileStream _logFileStream; private static StreamWriterWithTimestamp _logStreamWriter; - private static readonly object _lock = new object(); - public static bool save_to_file = true; + private static readonly object Lock = new object(); + public static bool SaveToFile = true; public static TextWriter DefaultOut; public static TextWriter DefaultError; @@ -28,7 +30,7 @@ public static bool OpenLogFile() { CloseLogFile(); - if (save_to_file) + if (SaveToFile) { var newDate = DateTime.Now.ToString("yyyy-MM"); LogFileName = $@"shadowsocks_{newDate}.log"; @@ -40,7 +42,7 @@ public static bool OpenLogFile() }; Console.SetOut(_logStreamWriter); Console.SetError(_logStreamWriter); - date = newDate; + _date = newDate; CompressOldLogFile(); } else @@ -88,7 +90,7 @@ public static void Error(object o) public static void Info(object o) { Log(LogLevel.Info, o); - System.Diagnostics.Debug.WriteLine($@"[{DateTime.Now}] INFO {o}"); + System.Diagnostics.Debug.WriteLine($@"[{DateTime.Now}] INFO {o}"); } [Conditional("DEBUG")] @@ -98,7 +100,7 @@ public static void Debug(object o) System.Diagnostics.Debug.WriteLine($@"[{DateTime.Now}] DEBUG {o}"); } - private static string ToString(StackFrame[] stacks) + private static string ToString(IEnumerable stacks) { return stacks.Aggregate(string.Empty, (current, stack) => current + $@"{stack.GetMethod()}{Environment.NewLine}"); } @@ -121,13 +123,13 @@ private static void CompressOldLogFile() } } - protected static void UpdateLogFile() + private static void UpdateLogFile() { - if (DateTime.Now.ToString("yyyy-MM") != date) + if (DateTime.Now.ToString("yyyy-MM") != _date) { - lock (_lock) + lock (Lock) { - if (DateTime.Now.ToString("yyyy-MM") != date) + if (DateTime.Now.ToString("yyyy-MM") != _date) { OpenLogFile(); } @@ -141,36 +143,38 @@ public static void LogUsefulException(Exception e) // just log useful exceptions, not all of them if (e is SocketException se) { - if (se.SocketErrorCode == SocketError.ConnectionAborted) + switch (se.SocketErrorCode) { - // closed by browser when sending - // normally happens when download is canceled or a tab is closed before page is loaded - } - else if (se.SocketErrorCode == SocketError.ConnectionReset) - { - // received rst - } - else if (se.SocketErrorCode == SocketError.NotConnected) - { - // close when not connected - } - else if ((uint)se.SocketErrorCode == 0x80004005) - { - // already closed - } - else if (se.SocketErrorCode == SocketError.Shutdown) - { - // ignore - } - else if (se.SocketErrorCode == SocketError.Interrupted) - { - // ignore - } - else - { - Error(e); + case SocketError.ConnectionAborted: + // closed by browser when sending + // normally happens when download is canceled or a tab is closed before page is loaded + break; + case SocketError.ConnectionReset: + // received rst + break; + case SocketError.NotConnected: + // close when not connected + break; + case SocketError.Shutdown: + // ignore + break; + case SocketError.Interrupted: + // ignore + break; + default: + { + if ((uint)se.SocketErrorCode == 0x80004005) + { + // already closed + } + else + { + Error(e); - Debug(ToString(new StackTrace().GetFrames())); + Debug(ToString(new StackTrace().GetFrames())); + } + break; + } } } else @@ -184,106 +188,63 @@ public static void LogUsefulException(Exception e) public static bool LogSocketException(string remarks, string server, Exception e) { UpdateLogFile(); - // just log useful exceptions, not all of them - if (e is ObfsException oe) - { - Error("Proxy server [" + remarks + "(" + server + ")] " - + oe.Message); - return true; - } - - if (e is NullReferenceException) - { - return true; - } - - if (e is ObjectDisposedException) + switch (e) { - // ignore - return true; - } - - if (e is SocketException se) - { - if ((uint)se.SocketErrorCode == 0x80004005) - { - // already closed + // just log useful exceptions, not all of them + case ObfsException oe: + Error($@"Proxy server [{remarks}({server})] {oe.Message}"); return true; - } - - if (se.ErrorCode == 11004) - { - Log(LogLevel.Warn, "Proxy server [" + remarks + "(" + server + ")] " - + "DNS lookup failed"); + case NullReferenceException _: + case ObjectDisposedException _: return true; - } - - if (se.SocketErrorCode == SocketError.HostNotFound) - { - Log(LogLevel.Warn, "Proxy server [" + remarks + "(" + server + ")] " - + "Host not found"); - return true; - } - - if (se.SocketErrorCode == SocketError.ConnectionRefused) - { - Log(LogLevel.Warn, "Proxy server [" + remarks + "(" + server + ")] " - + "connection refused"); + case SocketException se when se.ErrorCode == 11004: + Log(LogLevel.Warn, $@"Proxy server [{remarks}({server})] DNS lookup failed"); return true; - } - - if (se.SocketErrorCode == SocketError.NetworkUnreachable) - { - Log(LogLevel.Warn, "Proxy server [" + remarks + "(" + server + ")] " - + "network unreachable"); + case SocketException se when (uint)se.SocketErrorCode == 0x80004005: + // already closed return true; - } + case SocketException se: + switch (se.SocketErrorCode) + { + case SocketError.HostNotFound: + Log(LogLevel.Warn, $@"Proxy server [{remarks}({server})] Host not found"); + return true; + case SocketError.ConnectionRefused: + Log(LogLevel.Warn, $@"Proxy server [{remarks}({server})] connection refused"); + return true; + case SocketError.NetworkUnreachable: + Log(LogLevel.Warn, $@"Proxy server [{remarks}({server})] network unreachable"); + return true; + case SocketError.TimedOut: + case SocketError.Shutdown: + return true; + } - if (se.SocketErrorCode == SocketError.TimedOut) - { - //Logging.Log(LogLevel.Warn, "Proxy server [" + remarks + "(" + server + ")] " - // + "connection timeout"); - return true; - } + Log(LogLevel.Info, $@"Proxy server [{remarks}({server})] {Convert.ToString(se.SocketErrorCode)}:{se.Message}"); - if (se.SocketErrorCode == SocketError.Shutdown) - { + Debug(ToString(new StackTrace().GetFrames())); return true; - } - - Log(LogLevel.Info, "Proxy server [" + remarks + "(" + server + ")] " - + Convert.ToString(se.SocketErrorCode) + ":" + se.Message); - - Debug(ToString(new StackTrace().GetFrames())); - - return true; + default: + return false; } - return false; } public static void Log(LogLevel level, object s) { UpdateLogFile(); - var strMap = new[]{ - "Debug", - "Info", - "Warn", - "Error", - "Assert" - }; - Console.WriteLine($@"[{strMap[(int)level]}] {s}"); + Console.WriteLine($@"[{level}] {s}"); } [Conditional("DEBUG")] public static void LogBin(LogLevel level, string info, byte[] data, int length) { - //string s = ""; - //for (int i = 0; i < length; ++i) - //{ - // string fs = "0" + Convert.ToString(data[i], 16); - // s += " " + fs.Substring(fs.Length - 2, 2); - //} - //Log(level, info + s); + var s = new StringBuilder(); + for (var i = 0; i < length; ++i) + { + var fs = $@"0{Convert.ToString(data[i], 16)}"; + s.Append($@" {fs.Substring(fs.Length - 2, 2)}"); + } + Log(level, $@"{info}{s}"); } } @@ -295,19 +256,33 @@ public StreamWriterWithTimestamp(Stream stream) : base(stream) { } - private string GetTimestamp() + private static string GetTimestamp() { - return "[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "] "; + return $@"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] "; } public override void WriteLine(string value) { - base.WriteLine(GetTimestamp() + value); + try + { + base.WriteLine(GetTimestamp() + value); + } + catch (ObjectDisposedException) + { + + } } public override void Write(string value) { - base.Write(GetTimestamp() + value); + try + { + base.Write(GetTimestamp() + value); + } + catch (ObjectDisposedException) + { + + } } } diff --git a/shadowsocks-csharp/Controller/ShadowsocksController.cs b/shadowsocks-csharp/Controller/ShadowsocksController.cs index a6383fe5e51..bcf7023b94c 100755 --- a/shadowsocks-csharp/Controller/ShadowsocksController.cs +++ b/shadowsocks-csharp/Controller/ShadowsocksController.cs @@ -371,7 +371,7 @@ public void Reload() // some logic in configuration updated the config when saving, we need to read it again _config = MergeGetConfiguration(_config); _config.FlushPortMapCache(); - Logging.save_to_file = _config.logEnable; + Logging.SaveToFile = _config.logEnable; Logging.OpenLogFile(); if (_hostDaemon == null) From 59d5e095ad04ebca043b12ed6770e289523e2bcb Mon Sep 17 00:00:00 2001 From: Bruce Wayne Date: Mon, 18 Nov 2019 23:40:30 +0800 Subject: [PATCH 3/3] BeginInvoke=>InvokeAsync --- shadowsocks-csharp/View/ConfigWindow.xaml.cs | 30 +++++++++---------- .../View/ServerLogWindow.xaml.cs | 4 +-- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/shadowsocks-csharp/View/ConfigWindow.xaml.cs b/shadowsocks-csharp/View/ConfigWindow.xaml.cs index 876f925a419..130382c5b6d 100644 --- a/shadowsocks-csharp/View/ConfigWindow.xaml.cs +++ b/shadowsocks-csharp/View/ConfigWindow.xaml.cs @@ -156,14 +156,14 @@ private void ExpandTree(bool expand) public void MoveToSelectedItem(int index) { - Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Input, new Action(() => + Dispatcher.CurrentDispatcher.InvokeAsync(() => { if (index >= 0 && index < _modifiedConfiguration.configs.Count) { var server = _modifiedConfiguration.configs[index]; MoveToSelectedItem(server.Id); } - })); + }, DispatcherPriority.Input); } private void MoveToSelectedItem(string id) @@ -185,23 +185,21 @@ private void MoveToSelectedItem(IVirtualTree serverTreeViewModel) parent = parent.Parent; } - Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() => + Dispatcher.CurrentDispatcher.InvokeAsync(() => { var treeViewItem = ServersTreeView.GetContainerFromItem(serverTreeViewModel); - if (treeViewItem != null) + if (treeViewItem == null) return; + ServersTreeView.BringIntoView(treeViewItem); + if (ServersTreeView.SelectedItems.Count == 1 && ReferenceEquals(ServersTreeView.SelectedItem, treeViewItem.Header)) { - ServersTreeView.BringIntoView(treeViewItem); - if (ServersTreeView.SelectedItems.Count == 1 && ReferenceEquals(ServersTreeView.SelectedItem, treeViewItem.Header)) - { - //Fix a weird selection action - } - else - { - ServersTreeView.ClearSelection(); - serverTreeViewModel.IsSelected = true; - } + //Fix a weird selection action + } + else + { + ServersTreeView.ClearSelection(); + serverTreeViewModel.IsSelected = true; } - })); + }, DispatcherPriority.Render); } private void AddButton_Click(object sender, RoutedEventArgs e) @@ -424,7 +422,7 @@ private void LinkTextBox_PreviewMouseUp(object sender, MouseButtonEventArgs e) if (e.ChangedButton == MouseButton.Left) { var textBox = (TextBox)sender; - textBox.Dispatcher?.BeginInvoke(new Action(() => { textBox.SelectAll(); })); + textBox.Dispatcher?.InvokeAsync(() => { textBox.SelectAll(); }); } } diff --git a/shadowsocks-csharp/View/ServerLogWindow.xaml.cs b/shadowsocks-csharp/View/ServerLogWindow.xaml.cs index 8b778a28ad6..cbea20a3be7 100644 --- a/shadowsocks-csharp/View/ServerLogWindow.xaml.cs +++ b/shadowsocks-csharp/View/ServerLogWindow.xaml.cs @@ -73,13 +73,13 @@ private void LoadConfig(bool isFirstLoad) ServerLogViewModel.ReadConfig(_controller); ServerDataGrid.View?.EndInit(); - Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Input, new Action(() => + Dispatcher.CurrentDispatcher.InvokeAsync(() => { if (isFirstLoad && ServerLogViewModel.SelectedServer != null) { ServerDataGrid.ScrollInView(new RowColumnIndex(ServerLogViewModel.SelectedServer.Index, 2)); } - })); + }, DispatcherPriority.Input); } private void controller_ConfigChanged(object sender, EventArgs e)