OSDN Git Service

閲覧サーバーの処理をプロキシサーバーに代行させる
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Sat, 3 Sep 2016 06:57:12 +0000 (15:57 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Sat, 3 Sep 2016 07:15:17 +0000 (16:15 +0900)
KancolleSniffer/Config.cs
KancolleSniffer/ConfigDialog.Designer.cs
KancolleSniffer/ConfigDialog.cs
KancolleSniffer/HttpProxy.cs
KancolleSniffer/LogServer.cs
KancolleSniffer/MainForm.cs

index d8abf32..83b6425 100644 (file)
@@ -58,16 +58,12 @@ namespace KancolleSniffer
         public bool On { get; set; }\r
         public string OutputDir { get; set; }\r
         public int MaterialLogInterval { get; set; }\r
-        public bool ServerOn { get; set; }\r
-        public int Listen { get; set; }\r
 \r
         public LogConfig()\r
         {\r
             On = true;\r
             OutputDir = "";\r
             MaterialLogInterval = 10;\r
-            ServerOn = true;\r
-            Listen = 8008;\r
         }\r
     }\r
 \r
@@ -252,8 +248,6 @@ namespace KancolleSniffer
             Log.On = json.Log.On;\r
             Log.OutputDir = json.Log.OutputDir;\r
             Log.MaterialLogInterval = (int)json.Log.MaterialLogInterval;\r
-            Log.ServerOn = json.Log.ServerOn;\r
-            Log.Listen = (int)json.Log.Listen;\r
         }\r
     }\r
 }
\ No newline at end of file
index 11f6bf3..f64598c 100644 (file)
@@ -45,6 +45,9 @@ namespace KancolleSniffer
             this.components = new System.ComponentModel.Container();\r
             this.tabControl = new System.Windows.Forms.TabControl();\r
             this.tabPageShow = new System.Windows.Forms.TabPage();\r
+            this.label15 = new System.Windows.Forms.Label();\r
+            this.comboBoxZoom = new System.Windows.Forms.ComboBox();\r
+            this.label14 = new System.Windows.Forms.Label();\r
             this.checkBoxHideOnMinimized = new System.Windows.Forms.CheckBox();\r
             this.checkBoxTopMost = new System.Windows.Forms.CheckBox();\r
             this.tabPageNotification = new System.Windows.Forms.TabPage();\r
@@ -94,11 +97,6 @@ namespace KancolleSniffer
             this.textBoxListen = new System.Windows.Forms.TextBox();\r
             this.labelListen = new System.Windows.Forms.Label();\r
             this.tabPageLog = new System.Windows.Forms.TabPage();\r
-            this.groupBox1 = new System.Windows.Forms.GroupBox();\r
-            this.radioButtonServerOff = new System.Windows.Forms.RadioButton();\r
-            this.radioButtonServerOn = new System.Windows.Forms.RadioButton();\r
-            this.textBoxServer = new System.Windows.Forms.TextBox();\r
-            this.label12 = new System.Windows.Forms.Label();\r
             this.label10 = new System.Windows.Forms.Label();\r
             this.checkBoxOutput = new System.Windows.Forms.CheckBox();\r
             this.label9 = new System.Windows.Forms.Label();\r
@@ -123,9 +121,6 @@ namespace KancolleSniffer
             this.toolTipError = new System.Windows.Forms.ToolTip(this.components);\r
             this.folderBrowserDialogOutputDir = new System.Windows.Forms.FolderBrowserDialog();\r
             this.openDebugLogDialog = new System.Windows.Forms.OpenFileDialog();\r
-            this.label14 = new System.Windows.Forms.Label();\r
-            this.comboBoxZoom = new System.Windows.Forms.ComboBox();\r
-            this.label15 = new System.Windows.Forms.Label();\r
             this.tabControl.SuspendLayout();\r
             this.tabPageShow.SuspendLayout();\r
             this.tabPageNotification.SuspendLayout();\r
@@ -141,7 +136,6 @@ namespace KancolleSniffer
             this.groupBoxUpstream.SuspendLayout();\r
             this.groupBoxAutoConfig.SuspendLayout();\r
             this.tabPageLog.SuspendLayout();\r
-            this.groupBox1.SuspendLayout();\r
             ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaterialLogInterval)).BeginInit();\r
             this.tabPageCollabo.SuspendLayout();\r
             this.groupBoxKancolleDb.SuspendLayout();\r
@@ -183,6 +177,37 @@ namespace KancolleSniffer
             this.tabPageShow.Text = "表示";\r
             this.tabPageShow.UseVisualStyleBackColor = true;\r
             // \r
+            // label15\r
+            // \r
+            this.label15.AutoSize = true;\r
+            this.label15.Location = new System.Drawing.Point(97, 57);\r
+            this.label15.Name = "label15";\r
+            this.label15.Size = new System.Drawing.Size(61, 12);\r
+            this.label15.TabIndex = 6;\r
+            this.label15.Text = "(要再起動)";\r
+            // \r
+            // comboBoxZoom\r
+            // \r
+            this.comboBoxZoom.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r
+            this.comboBoxZoom.FormattingEnabled = true;\r
+            this.comboBoxZoom.Items.AddRange(new object[] {\r
+            "100%",\r
+            "125%",\r
+            "150%"});\r
+            this.comboBoxZoom.Location = new System.Drawing.Point(47, 54);\r
+            this.comboBoxZoom.Name = "comboBoxZoom";\r
+            this.comboBoxZoom.Size = new System.Drawing.Size(48, 20);\r
+            this.comboBoxZoom.TabIndex = 5;\r
+            // \r
+            // label14\r
+            // \r
+            this.label14.AutoSize = true;\r
+            this.label14.Location = new System.Drawing.Point(9, 57);\r
+            this.label14.Name = "label14";\r
+            this.label14.Size = new System.Drawing.Size(35, 12);\r
+            this.label14.TabIndex = 4;\r
+            this.label14.Text = "ズーム";\r
+            // \r
             // checkBoxHideOnMinimized\r
             // \r
             this.checkBoxHideOnMinimized.AutoSize = true;\r
@@ -553,7 +578,6 @@ namespace KancolleSniffer
             this.labelCopyright.Name = "labelCopyright";\r
             this.labelCopyright.Size = new System.Drawing.Size(212, 12);\r
             this.labelCopyright.TabIndex = 13;\r
-            this.labelCopyright.Text = "";\r
             // \r
             // linkLabelProductName\r
             // \r
@@ -699,7 +723,6 @@ namespace KancolleSniffer
             // \r
             // tabPageLog\r
             // \r
-            this.tabPageLog.Controls.Add(this.groupBox1);\r
             this.tabPageLog.Controls.Add(this.label10);\r
             this.tabPageLog.Controls.Add(this.checkBoxOutput);\r
             this.tabPageLog.Controls.Add(this.label9);\r
@@ -715,58 +738,6 @@ namespace KancolleSniffer
             this.tabPageLog.Text = "報告書";\r
             this.tabPageLog.UseVisualStyleBackColor = true;\r
             // \r
-            // groupBox1\r
-            // \r
-            this.groupBox1.Controls.Add(this.radioButtonServerOff);\r
-            this.groupBox1.Controls.Add(this.radioButtonServerOn);\r
-            this.groupBox1.Controls.Add(this.textBoxServer);\r
-            this.groupBox1.Controls.Add(this.label12);\r
-            this.groupBox1.Location = new System.Drawing.Point(11, 83);\r
-            this.groupBox1.Name = "groupBox1";\r
-            this.groupBox1.Size = new System.Drawing.Size(234, 48);\r
-            this.groupBox1.TabIndex = 15;\r
-            this.groupBox1.TabStop = false;\r
-            this.groupBox1.Text = "閲覧サーバー";\r
-            // \r
-            // radioButtonServerOff\r
-            // \r
-            this.radioButtonServerOff.AutoSize = true;\r
-            this.radioButtonServerOff.Location = new System.Drawing.Point(59, 18);\r
-            this.radioButtonServerOff.Name = "radioButtonServerOff";\r
-            this.radioButtonServerOff.Size = new System.Drawing.Size(47, 16);\r
-            this.radioButtonServerOff.TabIndex = 10;\r
-            this.radioButtonServerOff.TabStop = true;\r
-            this.radioButtonServerOff.Text = "無効";\r
-            this.radioButtonServerOff.UseVisualStyleBackColor = true;\r
-            this.radioButtonServerOff.CheckedChanged += new System.EventHandler(this.radioButtonServerOff_CheckedChanged);\r
-            // \r
-            // radioButtonServerOn\r
-            // \r
-            this.radioButtonServerOn.AutoSize = true;\r
-            this.radioButtonServerOn.Location = new System.Drawing.Point(6, 18);\r
-            this.radioButtonServerOn.Name = "radioButtonServerOn";\r
-            this.radioButtonServerOn.Size = new System.Drawing.Size(47, 16);\r
-            this.radioButtonServerOn.TabIndex = 9;\r
-            this.radioButtonServerOn.TabStop = true;\r
-            this.radioButtonServerOn.Text = "有効";\r
-            this.radioButtonServerOn.UseVisualStyleBackColor = true;\r
-            // \r
-            // textBoxServer\r
-            // \r
-            this.textBoxServer.Location = new System.Drawing.Point(175, 17);\r
-            this.textBoxServer.Name = "textBoxServer";\r
-            this.textBoxServer.Size = new System.Drawing.Size(36, 19);\r
-            this.textBoxServer.TabIndex = 11;\r
-            // \r
-            // label12\r
-            // \r
-            this.label12.AutoSize = true;\r
-            this.label12.Location = new System.Drawing.Point(114, 20);\r
-            this.label12.Name = "label12";\r
-            this.label12.Size = new System.Drawing.Size(59, 12);\r
-            this.label12.TabIndex = 8;\r
-            this.label12.Text = "受信ポート:";\r
-            // \r
             // label10\r
             // \r
             this.label10.AutoSize = true;\r
@@ -984,37 +955,6 @@ namespace KancolleSniffer
             this.openDebugLogDialog.CheckFileExists = false;\r
             this.openDebugLogDialog.Title = "ログファイルの選択";\r
             // \r
-            // label14\r
-            // \r
-            this.label14.AutoSize = true;\r
-            this.label14.Location = new System.Drawing.Point(9, 57);\r
-            this.label14.Name = "label14";\r
-            this.label14.Size = new System.Drawing.Size(35, 12);\r
-            this.label14.TabIndex = 4;\r
-            this.label14.Text = "ズーム";\r
-            // \r
-            // comboBoxZoom\r
-            // \r
-            this.comboBoxZoom.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r
-            this.comboBoxZoom.FormattingEnabled = true;\r
-            this.comboBoxZoom.Items.AddRange(new object[] {\r
-            "100%",\r
-            "125%",\r
-            "150%"});\r
-            this.comboBoxZoom.Location = new System.Drawing.Point(47, 54);\r
-            this.comboBoxZoom.Name = "comboBoxZoom";\r
-            this.comboBoxZoom.Size = new System.Drawing.Size(48, 20);\r
-            this.comboBoxZoom.TabIndex = 5;\r
-            // \r
-            // label15\r
-            // \r
-            this.label15.AutoSize = true;\r
-            this.label15.Location = new System.Drawing.Point(97, 57);\r
-            this.label15.Name = "label15";\r
-            this.label15.Size = new System.Drawing.Size(61, 12);\r
-            this.label15.TabIndex = 6;\r
-            this.label15.Text = "(要再起動)";\r
-            // \r
             // ConfigDialog\r
             // \r
             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r
@@ -1055,8 +995,6 @@ namespace KancolleSniffer
             this.groupBoxAutoConfig.PerformLayout();\r
             this.tabPageLog.ResumeLayout(false);\r
             this.tabPageLog.PerformLayout();\r
-            this.groupBox1.ResumeLayout(false);\r
-            this.groupBox1.PerformLayout();\r
             ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaterialLogInterval)).EndInit();\r
             this.tabPageCollabo.ResumeLayout(false);\r
             this.groupBoxKancolleDb.ResumeLayout(false);\r
@@ -1128,11 +1066,6 @@ namespace KancolleSniffer
         private System.Windows.Forms.NumericUpDown numericUpDownMaterialLogInterval;\r
         private System.Windows.Forms.FolderBrowserDialog folderBrowserDialogOutputDir;\r
         private System.Windows.Forms.TabPage tabPageDebug;\r
-        private System.Windows.Forms.GroupBox groupBox1;\r
-        private System.Windows.Forms.RadioButton radioButtonServerOff;\r
-        private System.Windows.Forms.RadioButton radioButtonServerOn;\r
-        private System.Windows.Forms.TextBox textBoxServer;\r
-        private System.Windows.Forms.Label label12;\r
         private System.Windows.Forms.Button buttonPlayDebugLog;\r
         private System.Windows.Forms.Button buttonDebugLogOpenFile;\r
         private System.Windows.Forms.TextBox textBoxDebugLog;\r
index cde8e91..0f411b1 100644 (file)
@@ -93,9 +93,6 @@ namespace KancolleSniffer
             textBoxOutput.Select(textBoxOutput.Text.Length, 0);\r
             folderBrowserDialogOutputDir.SelectedPath = _config.Log.OutputDir;\r
             numericUpDownMaterialLogInterval.Value = _config.Log.MaterialLogInterval;\r
-            radioButtonServerOn.Checked = _config.Log.ServerOn;\r
-            radioButtonServerOff.Checked = !_config.Log.ServerOn;\r
-            textBoxServer.Text = _config.Log.Listen.ToString("D");\r
         }\r
 \r
         private void LoadDebugSettings()\r
@@ -129,16 +126,10 @@ namespace KancolleSniffer
             int listen, outbound, server;\r
             if (!ValidatePorts(out listen, out outbound, out server))\r
                 return;\r
-            if (radioButtonAutoConfigOn.Checked && radioButtonServerOff.Checked)\r
-            {\r
-                ShowToolTip("自動設定には閲覧サーバーが必要です。", radioButtonServerOff);\r
-                return;\r
-            }\r
             DialogResult = DialogResult.OK;\r
             if (!ApplyProxySettings(listen, outbound))\r
                 DialogResult = DialogResult.None;\r
-            if (!ApplyLogSettings(server))\r
-                DialogResult = DialogResult.None;\r
+            ApplyLogSettings();\r
             ApplyDebugSettings();\r
             _config.KancolleDb.On = checkBoxKancolleDbOn.Checked;\r
             _config.KancolleDb.Token = textBoxKancolleDbToken.Text;\r
@@ -181,18 +172,11 @@ namespace KancolleSniffer
                 return false;\r
             if (radioButtonUpstreamOn.Checked && !ValidatePortNumber(textBoxPort, out outbound))\r
                 return false;\r
-            if (radioButtonServerOn.Checked && !ValidatePortNumber(textBoxServer, out server))\r
-                return false;\r
             if (radioButtonUpstreamOn.Checked && listen == outbound)\r
             {\r
                 ShowToolTip("受信と送信に同じポートは使えません。", textBoxPort);\r
                 return false;\r
             }\r
-            if (radioButtonServerOn.Checked && server == listen)\r
-            {\r
-                ShowToolTip("プロキシの受信ポートと同じポートは使えません。", textBoxServer);\r
-                return false;\r
-            }\r
             return true;\r
         }\r
 \r
@@ -209,17 +193,12 @@ namespace KancolleSniffer
             return true;\r
         }\r
 \r
-        private bool ApplyLogSettings(int server)\r
+        private void ApplyLogSettings()\r
         {\r
             _config.Log.On = checkBoxOutput.Checked;\r
             _config.Log.MaterialLogInterval = (int)numericUpDownMaterialLogInterval.Value;\r
             _config.Log.OutputDir = textBoxOutput.Text;\r
-            _config.Log.ServerOn = radioButtonServerOn.Checked;\r
-            _config.Log.Listen = server;\r
-            if (!_main.ApplyLogSetting())\r
-                return false;\r
-            textBoxServer.Text = _config.Log.Listen.ToString();\r
-            return true;\r
+            _main.ApplyLogSetting();\r
         }\r
 \r
         private void ApplyDebugSettings()\r
@@ -274,12 +253,6 @@ namespace KancolleSniffer
             textBoxPort.Enabled = !off;\r
         }\r
 \r
-        private void radioButtonServerOff_CheckedChanged(object sender, EventArgs e)\r
-        {\r
-            var off = ((RadioButton)sender).Checked;\r
-            textBoxServer.Enabled = !off;\r
-        }\r
-\r
         private void buttonOutputDir_Click(object sender, EventArgs e)\r
         {\r
             if (folderBrowserDialogOutputDir.ShowDialog(this) == DialogResult.OK)\r
index a1f0f57..85b17c6 100644 (file)
@@ -47,7 +47,7 @@ namespace KancolleSniffer
         {\r
             _listener = new TcpListener(IPAddress.Loopback, LocalPort);\r
             _listener.Start();\r
-            LocalPort = ((IPEndPoint)(_listener.LocalEndpoint)).Port;\r
+            LocalPort = ((IPEndPoint)_listener.LocalEndpoint).Port;\r
             IsInListening = true;\r
             Task.Run(() => AcceptClient());\r
         }\r
@@ -108,6 +108,11 @@ namespace KancolleSniffer
                         HandleConnect();\r
                         return;\r
                     }\r
+                    if (_session.Request.Host.StartsWith("localhost"))\r
+                    {\r
+                        LogServer.Process(_client, _session.Request.RequestLine);\r
+                        return;\r
+                    }\r
                     SendRequest();\r
                     ReceiveRequestBody();\r
                     SendRequestBody();\r
index 252514c..513f45d 100644 (file)
@@ -17,158 +17,92 @@ using System.Collections.Generic;
 using System.Globalization;\r
 using System.IO;\r
 using System.Linq;\r
-using System.Net;\r
 using System.Net.Sockets;\r
 using System.Text;\r
-using System.Threading;\r
 \r
 namespace KancolleSniffer\r
 {\r
     public class LogServer\r
     {\r
-        private readonly TcpListener _listener;\r
-        private readonly string _indexDir = AppDomain.CurrentDomain.BaseDirectory;\r
-        private string _outputDir = AppDomain.CurrentDomain.BaseDirectory;\r
-        private readonly List<Socket> _sockets = new List<Socket>();\r
+        private static readonly string IndexDir = AppDomain.CurrentDomain.BaseDirectory;\r
+        private static string _outputDir = AppDomain.CurrentDomain.BaseDirectory;\r
 \r
-        public int Port { get; private set; }\r
-\r
-        public bool IsListening { get; private set; }\r
-\r
-        public string OutputDir\r
+        public static string OutputDir\r
         {\r
             set { _outputDir = value; }\r
         }\r
 \r
-        public LogServer(int port)\r
-        {\r
-            _listener = new TcpListener(IPAddress.Loopback, port);\r
-        }\r
-\r
-        public void Start()\r
-        {\r
-            _listener.Start();\r
-            Port = ((IPEndPoint)_listener.LocalEndpoint).Port;\r
-            IsListening = true;\r
-            new Thread(Listen).Start();\r
-        }\r
-\r
-        private void Listen()\r
+        public static void Process(Socket client, string requestLine)\r
         {\r
-            try\r
+            var from = DateTime.MinValue;\r
+            var to = DateTime.MaxValue;\r
+            var request = requestLine.Split(' ');\r
+            if (request.Length != 3)\r
             {\r
-                while (true)\r
-                {\r
-                    var socket = _listener.AcceptSocket();\r
-                    lock (_sockets)\r
-                        _sockets.Add(socket);\r
-                    new Thread(Process).Start(socket);\r
-                }\r
+                SendError(client, "400 Bad Request");\r
+                return;\r
             }\r
-            catch (SocketException)\r
+            if (!request[0].StartsWith("GET", StringComparison.OrdinalIgnoreCase))\r
             {\r
+                SendError(client, "501 Not Implemented");\r
+                return;\r
             }\r
-            finally\r
+            var tmp = request[1].Split('?');\r
+            var path = HttpUtility.UrlDecode(tmp[0]);\r
+            if (path == null || !path.StartsWith("/"))\r
             {\r
-                _listener.Stop();\r
+                SendError(client, "400 Bad Request");\r
+                return;\r
             }\r
-        }\r
-\r
-        private void Process(object obj)\r
-        {\r
-            var client = (Socket)obj;\r
-            var data = new byte[4096];\r
-            var from = DateTime.MinValue;\r
-            var to = DateTime.MaxValue;\r
-            var port = 8080;\r
-            try\r
+            if (tmp.Length == 2)\r
             {\r
-                if (client.Receive(data) == 0)\r
-                    return;\r
-                var request = Encoding.UTF8.GetString(data).Split('\r')[0].Split(' ');\r
-                if (request.Length != 3)\r
-                {\r
-                    SendError(client, "400 Bad Request");\r
-                    return;\r
-                }\r
-                if (!request[0].StartsWith("GET", StringComparison.OrdinalIgnoreCase))\r
+                var query = HttpUtility.ParseQueryString(tmp[1]);\r
+                if (query["from"] != null)\r
                 {\r
-                    SendError(client, "501 Not Implemented");\r
-                    return;\r
+                    double tick;\r
+                    double.TryParse(query["from"], out tick);\r
+                    from = new DateTime(1970, 1, 1).ToLocalTime().AddSeconds(tick / 1000);\r
                 }\r
-                var tmp = request[1].Split('?');\r
-                var path = HttpUtility.UrlDecode(tmp[0]);\r
-                if (path == null || !path.StartsWith("/"))\r
+                if (query["to"] != null)\r
                 {\r
-                    SendError(client, "400 Bad Request");\r
-                    return;\r
-                }\r
-                if (tmp.Length == 2)\r
-                {\r
-                    var query = HttpUtility.ParseQueryString(tmp[1]);\r
-                    if (query["from"] != null)\r
-                    {\r
-                        double tick;\r
-                        double.TryParse(query["from"], out tick);\r
-                        from = new DateTime(1970, 1, 1).ToLocalTime().AddSeconds(tick / 1000);\r
-                    }\r
-                    if (query["to"] != null)\r
-                    {\r
-                        double tick;\r
-                        double.TryParse(query["to"], out tick);\r
-                        to = new DateTime(1970, 1, 1).ToLocalTime().AddSeconds(tick / 1000);\r
-                    }\r
-                    if (query["port"] != null)\r
-                    {\r
-                        port = int.Parse(query["port"]);\r
-                    }\r
+                    double tick;\r
+                    double.TryParse(query["to"], out tick);\r
+                    to = new DateTime(1970, 1, 1).ToLocalTime().AddSeconds(tick / 1000);\r
                 }\r
+            }\r
 \r
-                path = path == "/" ? "index.html" : path.Substring(1);\r
-                var full = Path.Combine(_indexDir, path);\r
-                var csv = Path.Combine(_outputDir, path);\r
-                if (path.EndsWith(".html", StringComparison.OrdinalIgnoreCase) && File.Exists(full))\r
-                {\r
-                    SendFile(client, full, "text/html");\r
-                    return;\r
-                }\r
-                if (path.EndsWith(".csv", StringComparison.OrdinalIgnoreCase) && File.Exists(csv))\r
-                {\r
-                    SendFile(client, csv, "text/csv; charset=Shift_JIS");\r
-                    return;\r
-                }\r
-                if (path.EndsWith(".json", StringComparison.OrdinalIgnoreCase))\r
-                {\r
-                    SendJsonData(client, csv, from, to);\r
-                    return;\r
-                }\r
-                if (path.EndsWith(".js", StringComparison.OrdinalIgnoreCase) && File.Exists(full))\r
-                {\r
-                    SendFile(client, full, "application/javascript");\r
-                    return;\r
-                }\r
-                if (path.EndsWith("proxy.pac"))\r
-                {\r
-                    SendProxyPac(client, port);\r
-                    return;\r
-                }\r
-                SendError(client, "404 Not Found");\r
+            path = path == "/" ? "index.html" : path.Substring(1);\r
+            var full = Path.Combine(IndexDir, path);\r
+            var csv = Path.Combine(_outputDir, path);\r
+            if (path.EndsWith(".html", StringComparison.OrdinalIgnoreCase) && File.Exists(full))\r
+            {\r
+                SendFile(client, full, "text/html");\r
+                return;\r
             }\r
-            catch (IOException)\r
+            if (path.EndsWith(".csv", StringComparison.OrdinalIgnoreCase) && File.Exists(csv))\r
             {\r
+                SendFile(client, csv, "text/csv; charset=Shift_JIS");\r
+                return;\r
             }\r
-            catch (SocketException)\r
+            if (path.EndsWith(".json", StringComparison.OrdinalIgnoreCase))\r
             {\r
+                SendJsonData(client, csv, from, to);\r
+                return;\r
             }\r
-            finally\r
+            if (path.EndsWith(".js", StringComparison.OrdinalIgnoreCase) && File.Exists(full))\r
+            {\r
+                SendFile(client, full, "application/javascript");\r
+                return;\r
+            }\r
+            if (path.EndsWith("proxy.pac"))\r
             {\r
-                lock (_sockets)\r
-                    _sockets.Remove(client);\r
-                client.Close();\r
+                SendProxyPac(client, HttpProxy.LocalPort);\r
+                return;\r
             }\r
+            SendError(client, "404 Not Found");\r
         }\r
 \r
-        private void SendError(Socket client, string error)\r
+        private static void SendError(Socket client, string error)\r
         {\r
             using (var writer = new StreamWriter(new MemoryStream(), Encoding.ASCII))\r
             {\r
@@ -183,17 +117,18 @@ namespace KancolleSniffer
             }\r
         }\r
 \r
-        private void SendJsonData(Socket client, string path, DateTime from, DateTime to)\r
+        private static void SendJsonData(Socket client, string path, DateTime from, DateTime to)\r
         {\r
-            var header = new StreamWriter(new MemoryStream(), Encoding.ASCII);\r
-            header.Write("HTTP/1.1 200 OK\r\n");\r
-            header.Write("Server: KancolleSniffer\r\n");\r
-            header.Write("Date: {0:R}\r\n", DateTime.Now);\r
-            header.Write("Content-Type: {0}\r\n", "application/json; charset=Shift_JIS");\r
-            header.Write("Connection: close\r\n\r\n");\r
-            header.Flush();\r
-            client.Send(((MemoryStream)header.BaseStream).ToArray());\r
-\r
+            using (var header = new StreamWriter(new MemoryStream(), Encoding.ASCII))\r
+            {\r
+                header.Write("HTTP/1.1 200 OK\r\n");\r
+                header.Write("Server: KancolleSniffer\r\n");\r
+                header.Write("Date: {0:R}\r\n", DateTime.Now);\r
+                header.Write("Content-Type: {0}\r\n", "application/json; charset=Shift_JIS");\r
+                header.Write("Connection: close\r\n\r\n");\r
+                header.Flush();\r
+                client.Send(((MemoryStream)header.BaseStream).ToArray());\r
+            }\r
             var csv = path.Replace(".json", ".csv");\r
             var encoding = Encoding.GetEncoding("Shift_JIS");\r
             client.Send(encoding.GetBytes("{ \"data\": [\n"));\r
@@ -233,34 +168,35 @@ namespace KancolleSniffer
             }\r
         }\r
 \r
-        private void SendFile(Socket client, string path, string mime)\r
+        private static void SendFile(Socket client, string path, string mime)\r
         {\r
-            using (var writer = new StreamWriter(new MemoryStream(), Encoding.ASCII))\r
+            using (var header = new StreamWriter(new MemoryStream(), Encoding.ASCII))\r
             {\r
-                writer.Write("HTTP/1.1 200 OK\r\n");\r
-                writer.Write("Server: KancolleSniffer\r\n");\r
-                writer.Write("Date: {0:R}\r\n", DateTime.Now);\r
-                writer.Write("Content-Length: {0}\r\n", new FileInfo(path).Length);\r
-                writer.Write("Content-Type: {0}\r\n", mime);\r
-                writer.Write("Connection: close\r\n\r\n");\r
-                writer.Flush();\r
-                client.SendFile(path, ((MemoryStream)writer.BaseStream).ToArray(), null,\r
+                header.Write("HTTP/1.1 200 OK\r\n");\r
+                header.Write("Server: KancolleSniffer\r\n");\r
+                header.Write("Date: {0:R}\r\n", DateTime.Now);\r
+                header.Write("Content-Length: {0}\r\n", new FileInfo(path).Length);\r
+                header.Write("Content-Type: {0}\r\n", mime);\r
+                header.Write("Connection: close\r\n\r\n");\r
+                header.Flush();\r
+                client.SendFile(path, ((MemoryStream)header.BaseStream).ToArray(), null,\r
                     TransmitFileOptions.UseDefaultWorkerThread);\r
             }\r
         }\r
 \r
-        private void SendProxyPac(Socket client, int port)\r
+        private static void SendProxyPac(Socket client, int port)\r
         {\r
-            var header = new StreamWriter(new MemoryStream(), Encoding.ASCII);\r
-            header.Write("HTTP/1.1 200 OK\r\n");\r
-            header.Write("Server: KancolleSniffer\r\n");\r
-            header.Write("Date: {0:R}\r\n", DateTime.Now);\r
-            header.Write("Content-Type: {0}\r\n", "application/x-ns-proxy-autoconfig");\r
-            header.Write("Connection: close\r\n\r\n");\r
-            header.Flush();\r
-            client.Send(((MemoryStream)header.BaseStream).ToArray());\r
-\r
-            var pacfile = @"\r
+            using (var header = new StreamWriter(new MemoryStream(), Encoding.ASCII))\r
+            {\r
+                header.Write("HTTP/1.1 200 OK\r\n");\r
+                header.Write("Server: KancolleSniffer\r\n");\r
+                header.Write("Date: {0:R}\r\n", DateTime.Now);\r
+                header.Write("Content-Type: application/x-ns-proxy-autoconfig\r\n");\r
+                header.Write("Connection: close\r\n\r\n");\r
+                header.Flush();\r
+                client.Send(((MemoryStream)header.BaseStream).ToArray());\r
+            }\r
+            var pacFile = @"\r
 function FindProxyForURL(url, host) {\r
   if(isInNet(host, ""203.104.209.71"", ""255.255.255.255"") ||\r
      isInNet(host, ""125.6.184.15"", ""255.255.255.255"") ||\r
@@ -289,15 +225,7 @@ function FindProxyForURL(url, host) {
     return ""DIRECT"";\r
   }\r
 }".Replace("8080", port.ToString());\r
-            client.Send(Encoding.ASCII.GetBytes(pacfile));\r
-        }\r
-\r
-        public void Stop()\r
-        {\r
-            IsListening = false;\r
-            _listener.Server.Close();\r
-            lock (_sockets)\r
-                _sockets.ForEach(s => s.Close());\r
+            client.Send(Encoding.ASCII.GetBytes(pacFile));\r
         }\r
     }\r
 }
\ No newline at end of file
index d732ccc..2e31162 100644 (file)
@@ -47,7 +47,6 @@ namespace KancolleSniffer
         private bool _started;\r
         private string _debugLogFile;\r
         private IEnumerator<string> _playLog;\r
-        private LogServer _logServer;\r
         private int _prevProxyPort;\r
         private readonly SystemProxy _systemProxy = new SystemProxy();\r
         private readonly ErrorDialog _errorDialog = new ErrorDialog();\r
@@ -206,7 +205,6 @@ namespace KancolleSniffer
             _config.Location = (WindowState == FormWindowState.Normal ? Bounds : RestoreBounds).Location;\r
             _config.Save();\r
             Task.Run(() => ShutdownProxy());\r
-            _logServer?.Stop();\r
             if (_config.Proxy.Auto)\r
                 _systemProxy.RestoreSettings();\r
             SystemEvents.PowerModeChanged -= SystemEvents_PowerModeChanged;\r
@@ -305,7 +303,7 @@ namespace KancolleSniffer
             }\r
             if (_config.Proxy.Auto && result)\r
             {\r
-                _systemProxy.SetAutoProxyUrl($"http://localhost:{_config.Log.Listen}/proxy.pac?port={_config.Proxy.Listen}");\r
+                _systemProxy.SetAutoProxyUrl($"http://localhost:{_config.Proxy.Listen}/proxy.pac");\r
             }\r
             _prevProxyPort = _config.Proxy.Listen;\r
             return result;\r
@@ -344,48 +342,12 @@ namespace KancolleSniffer
                     MessageBoxButtons.OK, MessageBoxIcon.Exclamation);\r
         }\r
 \r
-        public bool ApplyLogSetting()\r
+        public void ApplyLogSetting()\r
         {\r
-            var result = true;\r
-            if (_config.Proxy.Auto)\r
-                _config.Log.ServerOn = true;\r
-            if (_config.Log.ServerOn)\r
-            {\r
-                result = StartLogServer();\r
-            }\r
-            else\r
-            {\r
-                _logServer?.Stop();\r
-                _logServer = null;\r
-            }\r
+            LogServer.OutputDir = _config.Log.OutputDir;\r
             _sniffer.EnableLog(_config.Log.On ? LogType.All : LogType.None);\r
             _sniffer.MaterialLogInterval = _config.Log.MaterialLogInterval;\r
             _sniffer.LogOutputDir = _config.Log.OutputDir;\r
-            return result;\r
-        }\r
-\r
-        private bool StartLogServer()\r
-        {\r
-            var port = _config.Log.Listen;\r
-            if (_logServer?.Port == port)\r
-                return true;\r
-            _logServer?.Stop();\r
-            _logServer = null;\r
-            try\r
-            {\r
-                _logServer = new LogServer(port);\r
-                _logServer.Start();\r
-            }\r
-            catch (SocketException e) when (e.SocketErrorCode == SocketError.AddressAlreadyInUse)\r
-            {\r
-                if (WarnConflictPortNumber("閲覧サーバー", port, true) == DialogResult.No)\r
-                    return false;\r
-                _logServer = new LogServer(0);\r
-                _logServer.Start();\r
-                _config.Log.Listen = _logServer.Port;\r
-            }\r
-            _logServer.OutputDir = _config.Log.OutputDir;\r
-            return true;\r
         }\r
 \r
         public static bool IsVisibleOnAnyScreen(Rectangle rect)\r
@@ -1018,7 +980,7 @@ namespace KancolleSniffer
 \r
         private void LogToolStripMenuItem_Click(object sender, EventArgs e)\r
         {\r
-            Process.Start("http://localhost:" + _config.Log.Listen + "/");\r
+            Process.Start("http://localhost:" + _config.Proxy.Listen + "/");\r
         }\r
 \r
         private void CaptureToolStripMenuItem_Click(object sender, EventArgs e)\r