{\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"))\r
+ {\r
+ LogServer.Process(_client, _session.Request.RequestLine);\r
+ return;\r
+ }\r
SendRequest();\r
ReceiveRequestBody();\r
SendRequestBody();\r
ReceiveResponse();\r
+ if (_session.Response.StatusCode == null)\r
+ return;\r
SendResponse();\r
Close();\r
AfterSessionComplete?.Invoke(_session);\r
}\r
- catch (SocketException)\r
- {\r
- }\r
- catch (IOException)\r
- {\r
- }\r
- catch (HttpProxyAbort)\r
+ catch (Exception e)\r
{\r
+ File.AppendAllText("debug.log", $"[{DateTime.Now:g}] " + e + "\r\n");\r
}\r
finally\r
{\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
\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
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