コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }