internal void CopyHeadersTo(Stream outputStream) { // Prepare response headers. List <string> responseHeaders = new List <string>(); responseHeaders.Add(Version + " " + Status); // Copy response headers to final set of headers. responseHeaders.AddRange(Headers); responseHeaders.Add("Date: " + DateTime.UtcNow.ToString("R")); if (IsKeepAlive) { responseHeaders.Add("Connection: Keep-Alive"); } // Convert headers to bytes. string headersString = String.Join("\r\n", responseHeaders) + "\r\n\r\n"; byte[] headersBytes = Encoding.ASCII.GetBytes(headersString); // Send headers. outputStream.Write(headersBytes, 0, headersBytes.Length); outputStream.Flush(); // For debugging. logger.WriteHeaders(Encoding.ASCII.GetString(headersBytes)); }
public void ReadHeaders(Stream inputStream, Stream outputStream) { int c; StringBuilder builder = new StringBuilder(); LastChars lastChars = LastChars.None; while (true) { c = inputStream.ReadByte(); Utils.CheckByteRead(c); if (outputStream != null) { outputStream.WriteByte((byte)c); } logger.WriteHeaders((char)c); builder.Append((char)c); if (c == '\r' && lastChars == LastChars.None) { lastChars = LastChars.Cr; } else if (c == '\n' && lastChars == LastChars.Cr) { lastChars = LastChars.CrLf; ParseHeader(builder.ToString()); builder.Clear(); } else if (c == '\r' && lastChars == LastChars.CrLf) { lastChars = LastChars.CrLfCr; } else if (c == '\n' && lastChars == LastChars.CrLfCr) { break; } else { lastChars = LastChars.None; } } ParseCommonHeaders(); }