OSDN Git Service

url, request, responseをまとめるクラスを導入する
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Fri, 1 May 2020 05:27:54 +0000 (14:27 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Sun, 30 Aug 2020 05:58:21 +0000 (14:58 +0900)
KancolleSniffer.Test/PrivacyTest.cs
KancolleSniffer/ErrorLog.cs
KancolleSniffer/MainForm.cs
KancolleSniffer/Privacy.cs

index cfb612e..5abcbbf 100644 (file)
@@ -30,15 +30,15 @@ namespace KancolleSniffer.Test
         public void RemoveToken()\r
         {\r
             const string request = "api%5Fverno=1&api%5Ftoken=0123456abcdef&api%5Fport=0123456789";\r
-            PAssert.That(() => Privacy.RemoveToken(request) == "api%5Fverno=1&api%5Fport=0123456789", "トークンが中間");\r
+            PAssert.That(() => RemoveToken(request) == "api%5Fverno=1&api%5Fport=0123456789", "トークンが中間");\r
             const string request2 = "api%5Fverno=1&api%5Ftoken=0123456abcdef";\r
-            PAssert.That(() => Privacy.RemoveToken(request2) == @"api%5Fverno=1", "トークンが末尾");\r
+            PAssert.That(() => RemoveToken(request2) == @"api%5Fverno=1", "トークンが末尾");\r
             const string request3 = "api%5Ftoken=0123456abcdef&api%5Fverno=1";\r
-            PAssert.That(() => Privacy.RemoveToken(request3) == @"api%5Fverno=1", "トークンが先頭");\r
+            PAssert.That(() => RemoveToken(request3) == @"api%5Fverno=1", "トークンが先頭");\r
             const string request4 = "api%5Ftoken=0123456abcdef";\r
-            PAssert.That(() => Privacy.RemoveToken(request4) == "", "トークン単独");\r
+            PAssert.That(() => RemoveToken(request4) == "", "トークン単独");\r
             const string request5 = "api%5Fbtime=83026279&api%5Ftoken=0123456abcdef&api%5Fverno=1";\r
-            PAssert.That(() => Privacy.RemoveToken(request5) == "api%5Fverno=1", "戦闘APIの時刻印を削除");\r
+            PAssert.That(() => RemoveToken(request5) == "api%5Fverno=1", "戦闘APIの時刻印を削除");\r
         }\r
 \r
         /// <summary>\r
@@ -48,9 +48,9 @@ namespace KancolleSniffer.Test
         public void RemoveToken2()\r
         {\r
             var request = "api_verno=1&api_token=0123456abcdef&api_port=0123456789";\r
-            PAssert.That(() => Privacy.RemoveToken(request) == "api_verno=1&api_port=0123456789", "トークンが中間");\r
+            PAssert.That(() => RemoveToken(request) == "api_verno=1&api_port=0123456789", "トークンが中間");\r
             var request5 = "api_btime=83026279&api_token=0123456abcdef&api_verno=1";\r
-            PAssert.That(() => Privacy.RemoveToken(request5) == "api_verno=1", "戦闘APIの時刻印を削除");\r
+            PAssert.That(() => RemoveToken(request5) == "api_verno=1", "戦闘APIの時刻印を削除");\r
         }\r
 \r
         [TestMethod]\r
@@ -61,15 +61,29 @@ namespace KancolleSniffer.Test
                 @"""api_nickname"":""ぱんなこった"",""api_nickname_id"":""12345678"",""api_active_flag"":1}}}";\r
             const string result1 =\r
                 @"{""api_result"":1,""api_result_msg"":""成功"",""api_data"":{""api_basic"":{""api_active_flag"":1}}}";\r
-            PAssert.That(() => Privacy.RemoveName(response1) == result1);\r
+            PAssert.That(() => RemoveName(response1) == result1);\r
             const string response2 =\r
                 @"{""api_deck_data"":[{""api_member_id"":123456,""api_id"":1,""api_name"":""第一艦隊"",""api_name_id"":""123456"",""api_mission"":[0,0,0,0],""api_flagship"":""0""}]}";\r
             const string result2 =\r
                 @"{""api_deck_data"":[{""api_id"":1,""api_mission"":[0,0,0,0],""api_flagship"":""0""}]}";\r
-            PAssert.That(() => Privacy.RemoveName(response2) == result2);\r
+            PAssert.That(() => RemoveName(response2) == result2);\r
             const string response3 =\r
                 @"{""api_deck_data"":[{""api_member_id"":123456,""api_id"":1,""api_name"":""第\\/一艦\\""隊\\"""",""api_name_id"":""123456"",""api_mission"":[0,0,0,0],""api_flagship"":""0""}]}";\r
-            PAssert.That(() => Privacy.RemoveName(response3) == result2);\r
+            PAssert.That(() => RemoveName(response3) == result2);\r
+        }\r
+\r
+        private string RemoveToken(string query)\r
+        {\r
+            var s = new MainForm.Session(query, null, null);\r
+            Privacy.Remove(s);\r
+            return s.Url;\r
+        }\r
+\r
+        private string RemoveName(string response)\r
+        {\r
+            var s = new MainForm.Session(null, null, response);\r
+            Privacy.Remove(s);\r
+            return s.Response;\r
         }\r
     }\r
 }
\ No newline at end of file
index 7053d51..165aff2 100644 (file)
@@ -33,14 +33,14 @@ namespace KancolleSniffer
     {\r
         private readonly Sniffer _sniffer;\r
         private BattleState _prevBattleState = BattleState.None;\r
-        private readonly List<string[]> _battleApiLog = new List<string[]>();\r
+        private readonly List<MainForm.Session> _battleApiLog = new List<MainForm.Session>();\r
 \r
         public ErrorLog(Sniffer sniffer)\r
         {\r
             _sniffer = sniffer;\r
         }\r
 \r
-        public void CheckBattleApi(string url, string request, string response)\r
+        public void CheckBattleApi(MainForm.Session session)\r
         {\r
             if (_prevBattleState == BattleState.None)\r
                 _battleApiLog.Clear();\r
@@ -48,7 +48,7 @@ namespace KancolleSniffer
             {\r
                 if (_sniffer.Battle.BattleState != BattleState.None)\r
                 {\r
-                    _battleApiLog.Add(new[] {url, request, response});\r
+                    _battleApiLog.Add(session);\r
                 }\r
                 else if (_prevBattleState == BattleState.Result &&\r
                          // battleresultのあとのship_deckかportでのみエラー判定する\r
@@ -65,11 +65,11 @@ namespace KancolleSniffer
 \r
         public string GenerateBattleErrorLog()\r
         {\r
-            foreach (var logs in _battleApiLog)\r
-                Privacy.Remove(ref logs[0], ref logs[1], ref logs[2]);\r
+            foreach (var s in _battleApiLog)\r
+                Privacy.Remove(s);\r
             var version = string.Join(".", Application.ProductVersion.Split('.').Take(2));\r
             var api = CompressApi(string.Join("\r\n",\r
-                new[] {BattleStartSlots()}.Concat(_battleApiLog.SelectMany(logs => logs))));\r
+                new[] {BattleStartSlots()}.Concat(_battleApiLog.SelectMany(s => s.Lines))));\r
             var rank = _sniffer.Battle.DisplayedResultRank;\r
             var status = string.Join("\r\n", new[]\r
             {\r
@@ -99,11 +99,11 @@ namespace KancolleSniffer
             let actual = pair.Actual\r
             select $"({actual.Fleet.Number}-{actual.DeckIndex}) {assumed.NowHp}->{actual.NowHp}");\r
 \r
-        public string GenerateErrorLog(string url, string request, string response, string exception)\r
+        public string GenerateErrorLog(MainForm.Session s, string exception)\r
         {\r
-            Privacy.Remove(ref url, ref request, ref response);\r
+            Privacy.Remove(s);\r
             var version = string.Join(".", Application.ProductVersion.Split('.').Take(2));\r
-            var api = CompressApi($"{url}\r\n{request}\r\n{response}");\r
+            var api = CompressApi(string.Join("\r\n", s.Lines));\r
             var result = $"{{{{{{\r\n{DateTime.Now:g} {version}\r\n{exception}\r\n{api}\r\n}}}}}}";\r
             File.WriteAllText("error.log", result);\r
             return result;\r
index e610650..db75565 100644 (file)
@@ -13,6 +13,7 @@
 // limitations under the License.\r
 \r
 using System;\r
+using System.Collections;\r
 using System.Collections.Generic;\r
 using System.ComponentModel;\r
 using System.Diagnostics;\r
@@ -161,37 +162,56 @@ namespace KancolleSniffer
             BeginInvoke(new Action<HttpProxy.Session>(ProcessRequest), session);\r
         }\r
 \r
+        public class Session\r
+        {\r
+            public string Url { get; set; }\r
+            public string Request { get; set; }\r
+            public string Response { get; set; }\r
+\r
+            public Session()\r
+            {\r
+            }\r
+\r
+            public Session(string url, string request, string response)\r
+            {\r
+                Url = url;\r
+                Request = request;\r
+                Response = response;\r
+            }\r
+\r
+            public string[] Lines => new[] {Url, Request, Response};\r
+        }\r
+\r
         private void ProcessRequest(HttpProxy.Session session)\r
         {\r
             var url = session.Request.PathAndQuery;\r
             if (!url.Contains("kcsapi/"))\r
                 return;\r
-            var request = session.Request.BodyAsString;\r
-            var response = session.Response.BodyAsString;\r
-            Privacy.Remove(ref url, ref request, ref response);\r
-            if (response == null || !response.StartsWith("svdata="))\r
+            var s = new Session(url, session.Request.BodyAsString, session.Response.BodyAsString);\r
+            Privacy.Remove(s);\r
+            if (s.Response == null || !s.Response.StartsWith("svdata="))\r
             {\r
-                WriteDebugLog(url, request, response);\r
+                WriteDebugLog(s);\r
                 return;\r
             }\r
-            response = UnEscapeString(response.Remove(0, "svdata=".Length));\r
-            WriteDebugLog(url, request, response);\r
-            ProcessRequestMain(url, request, response);\r
+            s.Response = UnEscapeString(s.Response.Remove(0, "svdata=".Length));\r
+            WriteDebugLog(s);\r
+            ProcessRequestMain(s);\r
         }\r
 \r
-        private void ProcessRequestMain(string url, string request, string response)\r
+        private void ProcessRequestMain(Session s)\r
         {\r
             try\r
             {\r
-                UpdateInfo(Sniffer.Sniff(url, request, JsonObject.Parse(response)));\r
-                _errorLog.CheckBattleApi(url, request, response);\r
+                UpdateInfo(Sniffer.Sniff(s.Url, s.Request, JsonObject.Parse(s.Response)));\r
+                _errorLog.CheckBattleApi(s);\r
             }\r
 \r
             catch (RuntimeBinderException e)\r
             {\r
                 if (_errorDialog.ShowDialog(this,\r
                         "艦これに仕様変更があったか、受信内容が壊れています。",\r
-                        _errorLog.GenerateErrorLog(url, request, response, e.ToString())) == DialogResult.Abort)\r
+                        _errorLog.GenerateErrorLog(s, e.ToString())) == DialogResult.Abort)\r
                     Exit();\r
             }\r
             catch (LogIOException e)\r
@@ -209,7 +229,7 @@ namespace KancolleSniffer
             catch (Exception e)\r
             {\r
                 if (_errorDialog.ShowDialog(this, "エラーが発生しました。",\r
-                        _errorLog.GenerateErrorLog(url, request, response, e.ToString())) == DialogResult.Abort)\r
+                        _errorLog.GenerateErrorLog(s, e.ToString())) == DialogResult.Abort)\r
                     Exit();\r
             }\r
         }\r
@@ -220,12 +240,12 @@ namespace KancolleSniffer
             Environment.Exit(1);\r
         }\r
 \r
-        private void WriteDebugLog(string url, string request, string response)\r
+        private void WriteDebugLog(Session s)\r
         {\r
             if (_debugLogFile != null)\r
             {\r
                 File.AppendAllText(_debugLogFile,\r
-                    $"date: {DateTime.Now:g}\nurl: {url}\nrequest: {request}\nresponse: {response ?? "(null)"}\n");\r
+                    $"date: {DateTime.Now:g}\nurl: {s.Url}\nrequest: {s.Request}\nresponse: {s.Response ?? "(null)"}\n");\r
             }\r
         }\r
 \r
@@ -555,7 +575,7 @@ namespace KancolleSniffer
                 lines.Add(_playLog.Current.Substring(s.Length));\r
             }\r
             hqPanel.PlayLog.Visible = !hqPanel.PlayLog.Visible;\r
-            ProcessRequestMain(lines[0], lines[1], lines[2]);\r
+            ProcessRequestMain(new Session(lines[0], lines[1], lines[2]));\r
         }\r
 \r
         private void ShowShipOnShipList(int id)\r
index 29bb027..2dddd8a 100644 (file)
@@ -18,33 +18,34 @@ namespace KancolleSniffer
 {\r
     public static class Privacy\r
     {\r
-        public static void Remove(ref string url, ref string request, ref string response)\r
+        public static void Remove(MainForm.Session s)\r
         {\r
-            if (url != null)\r
-                url = RemoveToken(url);\r
-            if (request != null)\r
-                request = RemoveToken(request);\r
-            if (response != null && !(url != null && url.Contains("start2")))\r
-                response = RemoveName(response);\r
+            RemoveToken(s);\r
+            RemoveName(s);\r
         }\r
 \r
-        private static readonly Regex NameRegex = new Regex(\r
-            @"""api_member_id"":""?\d*""?,|""api_(?:nick)?name"":""(?:[^\""]|\\.)*"",""api_(?:nick)?name_id"":""\d*"",",\r
-            RegexOptions.Compiled);\r
-\r
-        public static string RemoveName(string response)\r
+        private static void RemoveToken(MainForm.Session s)\r
         {\r
-            var result = NameRegex.Replace(response, "");\r
-            return result;\r
+            s.Url = RemoveToken(s.Url);\r
+            s.Request = RemoveToken(s.Request);\r
         }\r
 \r
-        public static string RemoveToken(string query)\r
+        private static string RemoveToken(string query)\r
         {\r
+            if (query == null)\r
+                return null;\r
             var result = new Regex(@"api(?:%5F|_)token=\w+|api(?:%5F|_)btime=\w+").Replace(query, "");\r
-            result = result.Replace("&&", "&");\r
-            result = result.Replace("?&", "?");\r
-            result = result.Trim('&', '?');\r
-            return result;\r
+            return result.Replace("&&", "&").Replace("?&", "?").Trim('&', '?');\r
+        }\r
+\r
+        private static readonly Regex NameRegex = new Regex(\r
+            @"""api_member_id"":""?\d*""?,|""api_(?:nick)?name"":""(?:[^\""]|\\.)*"",""api_(?:nick)?name_id"":""\d*"",",\r
+            RegexOptions.Compiled);\r
+\r
+        private static void RemoveName(MainForm.Session s)\r
+        {\r
+            if (s.Response != null && !(s.Url != null && s.Url.Contains("start2")))\r
+                s.Response = NameRegex.Replace(s.Response, "");\r
         }\r
     }\r
 }
\ No newline at end of file