OSDN Git Service

データを取りこぼすことがあるのを直す
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / HttpProxy.cs
index 4857a5a..e738670 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
@@ -103,23 +103,37 @@ namespace KancolleSniffer
                 try\r
                 {\r
                     ReceiveRequest();\r
+                    if (_session.Request.Method == null)\r
+                        return;\r
                     if (_session.Request.Method == "CONNECT")\r
                     {\r
                         HandleConnect();\r
                         return;\r
                     }\r
+                    if (_session.Request.Host.StartsWith("localhost") || _session.Request.Host.StartsWith("127.0.0.1"))\r
+                    {\r
+                        LogServer.Process(_client, _session.Request.RequestLine);\r
+                        return;\r
+                    }\r
                     SendRequest();\r
                     ReceiveRequestBody();\r
                     SendRequestBody();\r
                     ReceiveResponse();\r
-                    SendResponse();\r
-                    Close();\r
+                    if (_session.Response.StatusCode == null)\r
+                        return;\r
                     AfterSessionComplete?.Invoke(_session);\r
+                    SendResponse();\r
                 }\r
+#if DEBUG\r
                 catch (Exception e)\r
                 {\r
-                    File.AppendAllText("debug.log", $"[{DateTime.Now.ToString("g")}] " + e + "\r\n");\r
+                    File.AppendAllText("debug.log", $"[{DateTime.Now:g}] " + e + "\r\n");\r
                 }\r
+#else // ReSharper disable once EmptyGeneralCatchClause\r
+                catch\r
+                {\r
+                }\r
+#endif\r
                 finally\r
                 {\r
                     Close();\r
@@ -129,6 +143,8 @@ namespace KancolleSniffer
             private void ReceiveRequest()\r
             {\r
                 var requestLine = _clientStream.ReadLine();\r
+                if (requestLine == "")\r
+                    return;\r
                 _session.Request.RequestLine = requestLine;\r
                 _session.Request.Headers = _clientStream.ReadHeaders();\r
             }\r
@@ -142,8 +158,8 @@ namespace KancolleSniffer
             private void SendRequest()\r
             {\r
                 _server = ConnectServer();\r
-                _serverStream = new HttpStream(_server).\r
-                    WriteLines(_session.Request.RequestLine + _session.Request.ModifiedHeaders);\r
+                _serverStream =\r
+                    new HttpStream(_server).WriteLines(_session.Request.RequestLine + _session.Request.ModifiedHeaders);\r
             }\r
 \r
             private void SendRequestBody()\r
@@ -153,7 +169,10 @@ namespace KancolleSniffer
 \r
             private void ReceiveResponse()\r
             {\r
-                _session.Response.StatusLine = _serverStream.ReadLine();\r
+                var statusLine = _serverStream.ReadLine();\r
+                if (statusLine == "")\r
+                    return;\r
+                _session.Response.StatusLine = statusLine;\r
                 _session.Response.Headers = _serverStream.ReadHeaders();\r
                 if (HasBody)\r
                     _session.Response.ReadBody(_serverStream);\r
@@ -259,10 +278,31 @@ namespace KancolleSniffer
 \r
             private void Close()\r
             {\r
-                _serverStream?.Close();\r
-                _clientStream?.Close();\r
-                _server?.Close();\r
-                _client.Close();\r
+                SocketClose(_server);\r
+                SocketClose(_client);\r
+            }\r
+\r
+            private void SocketClose(Socket socket)\r
+            {\r
+                if (socket == null)\r
+                    return;\r
+                try\r
+                {\r
+                    socket.Shutdown(SocketShutdown.Both);\r
+                }\r
+                // ReSharper disable EmptyGeneralCatchClause\r
+                catch\r
+\r
+                {\r
+                }\r
+                try\r
+                {\r
+                    socket.Close();\r
+                }\r
+                catch\r
+                    // ReSharper restore EmptyGeneralCatchClause\r
+                {\r
+                }\r
             }\r
         }\r
 \r
@@ -288,7 +328,7 @@ namespace KancolleSniffer
 \r
             public string Headers\r
             {\r
-                get { return _headers; }\r
+                get => _headers;\r
                 set\r
                 {\r
                     _headers = value;\r
@@ -326,8 +366,7 @@ namespace KancolleSniffer
                 var s = GetField("content-length");\r
                 if (s != null)\r
                 {\r
-                    int len;\r
-                    ContentLength = int.TryParse(s, out len) ? len : -1;\r
+                    ContentLength = int.TryParse(s, out var len) ? len : -1;\r
                 }\r
                 TransferEncoding = GetField("transfer-encoding")?.ToLower(CultureInfo.InvariantCulture);\r
                 ContentType = GetField("content-type");\r
@@ -410,7 +449,7 @@ namespace KancolleSniffer
 \r
             public string RequestLine\r
             {\r
-                get { return _requestLine; }\r
+                get => _requestLine;\r
                 set\r
                 {\r
                     _requestLine = value;\r
@@ -441,7 +480,7 @@ namespace KancolleSniffer
 \r
             public string StatusLine\r
             {\r
-                get { return _statusLine; }\r
+                get => _statusLine;\r
                 set\r
                 {\r
                     _statusLine = value;\r
@@ -526,14 +565,10 @@ namespace KancolleSniffer
                         break;\r
                     var ext = size.IndexOf(';');\r
                     size = ext == -1 ? size.Substring(0, size.Length - 2) : size.Substring(0, ext);\r
-                    int val;\r
-                    if (!int.TryParse(size, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out val))\r
+                    if (!int.TryParse(size, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var val))\r
                         throw new HttpProxyAbort("Can't parse chunk size: " + size);\r
                     if (val == 0)\r
-                    {\r
-                        ReadLine();\r
                         break;\r
-                    }\r
                     var chunk = new byte[val];\r
                     Read(chunk, 0, chunk.Length);\r
                     buf.Write(chunk, 0, chunk.Length);\r
@@ -600,12 +635,6 @@ namespace KancolleSniffer
                     offset += n;\r
                 } while (count > 0);\r
             }\r
-\r
-            public HttpStream Close()\r
-            {\r
-                _socket.Close();\r
-                return this;\r
-            }\r
         }\r
     }\r
 }
\ No newline at end of file