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
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
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
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
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
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
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
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
// \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
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
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
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
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
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
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
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
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
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
{\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
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
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
}\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
}\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
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
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
_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
}\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
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
\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