public ServerResponseStatusLine ReadServerStatusLine(bool keepTrailingNewline = false) { bool carriageReturnDetected = false; ServerResponseStatusLine serverStatusLine = new ServerResponseStatusLine(); StringBuilder result = new StringBuilder(); bool foundEndOfLine = false; char currentChar; while (!foundEndOfLine) { try { currentChar = base.ReadChar(); } catch (EndOfStreamException ex) { Logging.Instance.LogMessage(this.clientConnectionId, this.proxyProtocol, Loglevel.Debug, "HttpReverseProxyLib.MyBinaryReader.ReadServerStatusLine(EndOfStreamException): Client request header: {0}", ex.Message); if (result.Length == 0) { return(null); } else { break; } } switch (currentChar) { case '\r': result.Append(currentChar); carriageReturnDetected = true; break; case '\n': result.Append(currentChar); foundEndOfLine = true; break; default: result.Append(currentChar); break; } } // Populate status line object serverStatusLine.StatusLine = result.ToString(); serverStatusLine.NewlineType = carriageReturnDetected?Newline.CRLF:Newline.LF; serverStatusLine.NewlineBytes = carriageReturnDetected ? new byte[] { 0x0D, 0x0A } : new byte[] { 0x0A }; serverStatusLine.NewlineString = Encoding.UTF8.GetString(serverStatusLine.NewlineBytes); // Remove trailing newlines if required. if (!keepTrailingNewline) { serverStatusLine.StatusLine = serverStatusLine.StatusLine.TrimEnd(); } return(serverStatusLine); }
public void ForwardStatusLineS2C(ServerResponseStatusLine serverResponseStatusLine) { string statusLineStr = $"{serverResponseStatusLine.HttpVersion} {serverResponseStatusLine.StatusCode} {serverResponseStatusLine.StatusDescription}"; byte[] statusLineByteArr = Encoding.UTF8.GetBytes(statusLineStr); Logging.Instance.LogMessage(this.requestObj.Id, this.requestObj.ProxyProtocol, Loglevel.Debug, "TcpClientBase.ForwardStatusLineS2C(): statusLineStr: |{0}|", statusLineStr); this.clientStreamWriter.Write(statusLineByteArr, 0, statusLineByteArr.Length); this.clientStreamWriter.Write(serverResponseStatusLine.NewlineBytes, 0, serverResponseStatusLine.NewlineBytes.Length); }