{\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
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
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
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
\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
\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
\r
public string Headers\r
{\r
- get { return _headers; }\r
+ get => _headers;\r
set\r
{\r
_headers = value;\r
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
\r
public string RequestLine\r
{\r
- get { return _requestLine; }\r
+ get => _requestLine;\r
set\r
{\r
_requestLine = value;\r
\r
public string StatusLine\r
{\r
- get { return _statusLine; }\r
+ get => _statusLine;\r
set\r
{\r
_statusLine = value;\r
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
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