4 using System.Net.Sockets;
\r
6 using System.Threading;
\r
8 using System.Windows.Forms;
\r
10 namespace KancolleSniffer
\r
12 public class LogServer
\r
14 private readonly TcpListener _listener;
\r
15 private readonly Thread _thread;
\r
16 private readonly string _indexDir = Path.GetDirectoryName(Application.ExecutablePath);
\r
17 private string _outputDir = Path.GetDirectoryName(Application.ExecutablePath);
\r
19 public string OutputDir
\r
21 set { _outputDir = value; }
\r
24 public LogServer(int port)
\r
26 _listener = new TcpListener(IPAddress.Loopback, port);
\r
27 _thread = new Thread(Listen);
\r
35 private void Listen()
\r
42 var data = new byte[4096];
\r
43 var client = _listener.AcceptSocket();
\r
46 if (client.Available == 0)
\r
49 if (client.Available == 0)
\r
52 if (client.Receive(data) == 0)
\r
54 var request = Encoding.UTF8.GetString(data).Split('\r')[0].Split(' ');
\r
55 if (request.Length != 3)
\r
57 SendError(client, "400 Bad Request");
\r
60 if (!request[0].StartsWith("GET", StringComparison.OrdinalIgnoreCase))
\r
62 SendError(client, "501 Not Implemented");
\r
65 var path = HttpUtility.UrlDecode(request[1].Split('?')[0]);
\r
66 if (path == null || !path.StartsWith("/"))
\r
68 SendError(client, "400 Bad Request");
\r
72 path = path == "/" ? "index.html" : path.Substring(1);
\r
73 var full = Path.Combine(_indexDir, path);
\r
74 var csv = Path.Combine(_outputDir, path);
\r
75 if (path.EndsWith(".html", StringComparison.OrdinalIgnoreCase) && File.Exists(full))
\r
77 SendFile(client, full, "text/html");
\r
80 if (path.EndsWith(".csv", StringComparison.OrdinalIgnoreCase) && File.Exists(csv))
\r
82 SendFile(client, csv, "text/csv; charset=Shift_JIS");
\r
85 if (path.EndsWith(".js", StringComparison.OrdinalIgnoreCase) && File.Exists(full))
\r
87 SendFile(client, full, "application/javascript");
\r
90 SendError(client, "404 Not Found");
\r
95 catch (InvalidOperationException)
\r
104 catch (SocketException)
\r
113 private void SendError(Socket client, string error)
\r
115 using (var writer = new StreamWriter(new MemoryStream(), Encoding.ASCII))
\r
117 writer.Write("HTTP/1.1 {0}\r\n", error);
\r
118 writer.Write("Server: KancolleSniffer\r\n");
\r
119 writer.Write("Date: {0:R}\r\n", DateTime.Now);
\r
120 writer.Write("Connection: close\r\n\r\n");
\r
121 writer.Write("<html><head><title>{0}</title></head>\r\n", error);
\r
122 writer.Write("<body><h4>{0}</h4></body></html>\r\n\r\n", error);
\r
124 client.Send(((MemoryStream)writer.BaseStream).ToArray());
\r
128 private void SendFile(Socket client, string path, string mime)
\r
130 using (var writer = new StreamWriter(new MemoryStream(), Encoding.ASCII))
\r
132 writer.Write("HTTP/1.1 200 OK\r\n");
\r
133 writer.Write("Server: KancolleSniffer\r\n");
\r
134 writer.Write("Date: {0:R}\r\n", DateTime.Now);
\r
135 writer.Write("Content-Length: {0}\r\n", new FileInfo(path).Length);
\r
136 writer.Write("Content-Type: {0}\r\n", mime);
\r
137 writer.Write("Connection: close\r\n\r\n");
\r
139 client.SendFile(path, ((MemoryStream)writer.BaseStream).ToArray(), null, TransmitFileOptions.UseDefaultWorkerThread);
\r