public static void DisplayResponse(HttpResponse Response, 
            int Mode, int InputCount, long Milliseconds, int respLength)
        {
            var resp = !string.IsNullOrEmpty(Response.Header) ?
                    Response.Header.Split('\r', '\n')[0] :
                    "[No Header]";

            var inputColor =
                InputCount >= 20 ? ConsoleColor.Red :
                InputCount > 0 ? ConsoleColor.Yellow :
                ConsoleColor.Gray;

            var timeColor =
                Milliseconds >= 20000 ? ConsoleColor.Red :
                Milliseconds >= 10000 ? ConsoleColor.Yellow :
                ConsoleColor.Green;

            var respLengthColor =
                respLength >= 1000000 ? ConsoleColor.Red :
                respLength >= 100000 ? ConsoleColor.Yellow :
                ConsoleColor.Green;

            var respColor =
               Regex.IsMatch(resp, @"\s[45]\d{2}($|[^\d])") ? ConsoleColor.Red :
               Regex.IsMatch(resp, @"\s2\d{2}($|[^\d])") ? ConsoleColor.Green :
               ConsoleColor.DarkCyan;

            Cli.WriteLine(
                "{{Mode: {0}, Input Count: ~{1}~{2}~R~}} -> ~{3}~{4}~R~ (~{5}~{6:n0} bytes~R~ in ~{7}~{8}ms~R~)",
                Mode,
                inputColor,
                InputCount,
                respColor,
                resp,
                respLengthColor,
                respLength,
                timeColor,
                Milliseconds);
        }
        public HttpResponse Read()
        {
            var bufferSize = 8192 * 4;
            var response = new HttpResponse();

            var responseString = Stream.ReadString(bufferSize);

            if (responseString.Length == 0)
                return new HttpResponse() { Header = "", Body = "" };

            if (!Regex.IsMatch(responseString, @"HTTP/\d\.\d\s\d+\s"))
                return new HttpResponse()
                {
                    Header = "",
                    Body = responseString
                };

            var bodyIndex = responseString.IndexOf("\r\n\r\n");

            if (bodyIndex == -1)
                return new HttpResponse()
                {
                    Header = responseString,
                    Body = ""
                };

            response.Header = responseString.Remove(bodyIndex);
            response.Body = "";

            var body = responseString.Substring(bodyIndex + 4);

            if (response.Header.ToLower().Contains("\r\ntransfer-encoding: chunked\r\n"))
            {
                var sb = new StringBuilder(body);

                if (!body.EndsWith("0\r\n\r\n"))
                    while (true)
                    {
                        var c = Stream.ReadString(bufferSize);

                        sb.Append(c);

                        if (c == "" || c.EndsWith("0\r\n\r\n"))
                            break;
                    }

                if (sb.Length > 0)
                {
                    response.ParseChunkedBody(sb.ToString());
                }
                else
                {
                    response.Body = "";
                }
            }
            else
            {
                response.Body = body;
            }

            return response;
        }
        public static void DisplayResponse(HttpResponse Response, 
            int Mode, int InputCount, long Milliseconds)
        {
            var resp = !string.IsNullOrEmpty(Response.Header) ?
                    Response.Header.Split('\r', '\n')[0] :
                    "[No Header]";
            Console.ForegroundColor = ConsoleColor.Gray;
            TraceHelper.WriteFormat("{{Mode: {0}, Input Count: ", Mode);

            if (InputCount >= 20)
                Console.ForegroundColor = ConsoleColor.Red;
            else if (InputCount > 0)
                Console.ForegroundColor = ConsoleColor.Yellow;

            TraceHelper.WriteFormat("{0}", InputCount);

            ResetColors();

            Trace.Write("} -> ");

            if (Regex.IsMatch(resp, @"\s[45]\d{2}($|[^\d])"))
                Console.ForegroundColor = ConsoleColor.Red;
            else if (Regex.IsMatch(resp, @"\s2\d{2}($|[^\d])"))
                Console.ForegroundColor = ConsoleColor.Green;
            else
                Console.ForegroundColor = ConsoleColor.DarkCyan;
            Trace.Write(resp);
            ResetColors();

            Trace.Write(" (");

            if (Milliseconds > 20000)
                Console.ForegroundColor = ConsoleColor.Red;
            else if (Milliseconds > 10000)
                Console.ForegroundColor = ConsoleColor.Yellow;
            else
                Console.ForegroundColor = ConsoleColor.Green;

            Trace.Write(string.Format("{0:N0}ms", Milliseconds));

            ResetColors();

            Trace.WriteLine(")");
        }