상속: IMessageDecoder
        public void request_with_a_multiline_header()
        {
            IHttpRequest actual = null;
            var buffer = new SocketBufferFake();
            buffer.Buffer =
                Encoding.ASCII.GetBytes(@"GET / HTTP/1.1
host: www.onetrueerror.com
Content-Length: 0
Multi-part: header
   which should be merged

");
            buffer.BytesTransferred = buffer.Buffer.Length;

            var decoder = new HttpMessageDecoder();
            decoder.MessageReceived = o => actual = (IHttpRequest)o;
            decoder.ProcessReadBytes(buffer);

            actual.Should().NotBeNull();
            actual.HttpMethod.Should().Be("GET");
            actual.HttpVersion.Should().Be("HTTP/1.1");
            actual.Uri.ToString().Should().Be("http://www.onetrueerror.com/");
            actual.Headers["Multi-part"].Should().Be("header which should be merged");
            actual.Headers["content-length"].Should().Be("0");
        }
        public void request_with_body()
        {
            IHttpRequest actual = null;
            var buffer = new SocketBufferFake();
            buffer.Buffer =
                Encoding.ASCII.GetBytes(
                    @"PUT /?query HTTP/1.0
host: www.onetrueerror.com
content-length:13

hello queue a");
            buffer.BytesTransferred = buffer.Buffer.Length;

            var decoder = new HttpMessageDecoder();
            decoder.MessageReceived = o => actual = (IHttpRequest)o;
            decoder.ProcessReadBytes(buffer);

            actual.Should().NotBeNull();
            actual.HttpMethod.Should().Be("PUT");
            actual.HttpVersion.Should().Be("HTTP/1.0");
            actual.Uri.ToString().Should().Be("http://www.onetrueerror.com/?query");
            actual.Body.Should().NotBeNull();
            actual.Body.Length.Should().Be(13);
            actual.Headers["host"].Should().Be("www.onetrueerror.com");
            actual.Headers["content-length"].Should().Be("13");
            var sw = new StreamReader(actual.Body);
            sw.ReadToEnd().Should().Be("hello queue a");
        }
        public void ParsePost()
        {
            const string HttpPost = @"POST / HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 11
Origin: http://localhost:8080
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11
Content-Type: application/x-www-form-urlencoded; charset=UTF-32
Accept: */*
Referer: http://localhost:8080/ajaxPost.html
Accept-Encoding: gzip,deflate,sdch
Accept-Language: sv,en;q=0.8,en-US;q=0.6
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: ASP.NET_SessionId=5vkr4tfivb1ybu1sm4u4kahy; GriffinLanguageSwitcher=sv-se; __RequestVerificationToken=LiTSJATsiqh8zlcft_3gZwvY8HpcCUkirm307njxIZLdsJSYyqaV2st1tunH8sMvMwsVrj3W4dDoV8ECZRhU4s6DhTvd2F-WFkgApDBB-CA1; .ASPXAUTH=BF8BE1C246428B10B49AE867BEDF9748DB3842285BC1AF1EC44AD80281C4AE084B75F0AE13EAF1BE7F71DD26D0CE69634E83C4846625DC7E4D976CA1845914E2CC7A7CF2C522EA5586623D9B73B0AE433337FC59CF6AF665DC135491E78978EF

hello=world";
            var buffer = new SocketBufferFake();
            buffer.SetBuffer(Encoding.ASCII.GetBytes(HttpPost), 0, HttpPost.Length);
            IHttpMessage message = null;

            var builder = new HttpMessageDecoder();
            builder.MessageReceived = o => message = (IHttpMessage) o;
            builder.ProcessReadBytes(buffer);


            message.Should().NotBeNull();
            message.ContentCharset.Should().Be(Encoding.UTF32);
            message.ContentLength.Should().Be(11);
            message.Body.Should().NotBeNull();
            message.Body.Position.Should().Be(0);
            message.Body.Length.Should().Be(11);
        }
        public void allow_text_plain_even_if_the_decoder_doesnt_support_it()
        {
            IHttpRequest actual = null;
            var buffer = new SocketBufferFake();
            buffer.Buffer =
                Encoding.ASCII.GetBytes(
                    @"PUT /?query HTTP/1.0
host: www.onetrueerror.com
content-type: text/plain
content-length:13

hello queue a");
            buffer.BytesTransferred = buffer.Buffer.Length;

            var sut = new HttpMessageDecoder();
            sut.MessageReceived = o => actual = (IHttpRequest)o;
            sut.ProcessReadBytes(buffer);

            actual.Body.Position.Should().Be(0);
        }
        public void decode_two_messages()
        {
            var actual = new List<IHttpRequest>();
            var buffer = new SocketBufferFake();
            buffer.Buffer =
                Encoding.ASCII.GetBytes(
                    @"PUT /?query HTTP/1.0
host: www.onetrueerror.com
content-length:13

hello queue aGET /?query HTTP/1.1
host: www.onetrueerror.com
content-length:14

hello queue aa");
            buffer.BytesTransferred = buffer.Buffer.Length;

            var decoder = new HttpMessageDecoder();
            decoder.MessageReceived = o => actual.Add((IHttpRequest)o);
            decoder.ProcessReadBytes(buffer);

            actual.Count.Should().Be(2);
            actual[1].HttpMethod.Should().Be("GET");
            actual[1].HttpVersion.Should().Be("HTTP/1.1");
            actual[1].Uri.ToString().Should().Be("http://www.onetrueerror.com/?query");
            actual[1].Body.Should().NotBeNull();
            actual[1].Body.Length.Should().Be(14);
            actual[1].Headers["host"].Should().Be("www.onetrueerror.com");
            actual[1].Headers["content-length"].Should().Be("14");
            var sw = new StreamReader(actual[1].Body);
            sw.ReadToEnd().Should().Be("hello queue aa");
        }
        public void header_parser_should_be_reset_when_the_decoder_is_reset()
        {
            var actual = new List<IHttpRequest>();
            var buffer1 = new SocketBufferFake();
            buffer1.Buffer = Encoding.ASCII.GetBytes("GET / invalid_request1\r\n");
            buffer1.BytesTransferred = buffer1.Buffer.Length;

            var buffer2 = new SocketBufferFake();
            buffer2.Buffer = Encoding.ASCII.GetBytes("GET / invalid_request2\r\n");
            buffer2.BytesTransferred = buffer2.Buffer.Length;

            var decoder = new HttpMessageDecoder();
            decoder.MessageReceived = o => actual.Add((IHttpRequest)o);

            var ex1 = Assert.Throws<BadRequestException>(() => decoder.ProcessReadBytes(buffer1));
            ex1.Message.Should().Contain("'invalid_request1'");

            decoder.Clear();

            var ex2 = Assert.Throws<BadRequestException>(() => decoder.ProcessReadBytes(buffer2));
            ex2.Message.Should().Contain("'invalid_request2'");

            actual.Count.Should().Be(0);
        }  
        public void response_with_body_encoding()
        {
            IHttpResponse actual = null;
            var buffer = new SocketBufferFake();
            buffer.Buffer = Encoding.ASCII.GetBytes("HTTP/1.1 404 Failed to find it dude\r\nServer: griffinframework.net\r\nContent-Type: text/plain;charset=utf-8\r\nX-Requested-With: XHttpRequest\r\nContent-Length: 13\r\n\r\nhello queue a\r\n\r\n");
            buffer.BytesTransferred = buffer.Buffer.Length;

            var decoder = new HttpMessageDecoder();
            decoder.MessageReceived = o => actual = (IHttpResponse)o;
            decoder.ProcessReadBytes(buffer);

            actual.Should().NotBeNull();
            actual.StatusCode.Should().Be(404);
            actual.HttpVersion.Should().Be("HTTP/1.1");
            actual.ReasonPhrase.Should().Be("Failed to find it dude");
            actual.Headers["Server"].Should().Be("griffinframework.net");
            actual.Headers["X-Requested-With"].Should().Be("XHttpRequest");
            actual.ContentType.Should().Be("text/plain");
            actual.ContentLength.Should().Be(13);
            actual.ContentCharset.Should().Be(Encoding.UTF8);
            new StreamReader(actual.Body, actual.ContentCharset).ReadToEnd().Should().Be("hello queue a");
        }
        public void basic_response()
        {
            IHttpResponse actual = null;
            var buffer = new SocketBufferFake();
            buffer.Buffer = Encoding.ASCII.GetBytes("HTTP/1.1 404 Failed to find it dude\r\nServer: griffinframework.net\r\n\r\n");
            buffer.BytesTransferred = buffer.Buffer.Length;

            var decoder = new HttpMessageDecoder();
            decoder.MessageReceived = o => actual = (IHttpResponse)o;
            decoder.ProcessReadBytes(buffer);

            actual.Should().NotBeNull();
            actual.StatusCode.Should().Be(404);
            actual.HttpVersion.Should().Be("HTTP/1.1");
            actual.ReasonPhrase.Should().Be("Failed to find it dude");
            actual.Headers["Server"].Should().Be("griffinframework.net");
        }
        public void header_only_message_sprinkled_with_a_litte_bit_of_NoOp_lines__and_finally_a_regular_message()
        {
            var actual = new List<IHttpRequest>();
            var buffer = new SocketBufferFake();
            buffer.Buffer =
                Encoding.ASCII.GetBytes(
                    @"


PUT / HTTP/1.0
host: www.onetrueerror.com
X-identity: 1


GET /?query HTTP/1.1
host: www.onetrueerror.com
content-length:13

hello queue a");
            buffer.BytesTransferred = buffer.Buffer.Length;

            var decoder = new HttpMessageDecoder();
            decoder.MessageReceived = o => actual.Add((IHttpRequest)o);
            decoder.ProcessReadBytes(buffer);

            actual.Count.Should().Be(2);
            actual[0].HttpMethod.Should().Be("PUT");
            actual[0].HttpVersion.Should().Be("HTTP/1.0");
            actual[0].Uri.ToString().Should().Be("http://www.onetrueerror.com/");
            actual[0].Body.Should().BeNull();
            actual[0].Headers["host"].Should().Be("www.onetrueerror.com");
            actual[0].Headers["X-identity"].Should().Be("1");
            actual[1].HttpMethod.Should().Be("GET");
            actual[1].HttpVersion.Should().Be("HTTP/1.1");
            actual[1].Uri.ToString().Should().Be("http://www.onetrueerror.com/?query");
            actual[1].Body.Should().NotBeNull();
            actual[1].Body.Length.Should().Be(13);
            actual[1].Headers["host"].Should().Be("www.onetrueerror.com");
            actual[1].Headers["content-length"].Should().Be("13");
            var sw = new StreamReader(actual[1].Body);
            sw.ReadToEnd().Should().Be("hello queue a");
        }
        public void header_only_message_sprinkled_with_a_litte_bit_of_keepalive_lines()
        {
            IHttpRequest actual = null;
            var buffer = new SocketBufferFake();
            buffer.Buffer =
                Encoding.ASCII.GetBytes(
                    @"



PUT / HTTP/1.0
host: www.onetrueerror.com
X-identity: 1

");
            buffer.BytesTransferred = buffer.Buffer.Length;

            var decoder = new HttpMessageDecoder();
            decoder.MessageReceived = o => actual = (IHttpRequest)o;
            decoder.ProcessReadBytes(buffer);

            actual.Should().NotBeNull();
            actual.HttpMethod.Should().Be("PUT");
            actual.HttpVersion.Should().Be("HTTP/1.0");
            actual.Uri.ToString().Should().Be("http://www.onetrueerror.com/");
            actual.Body.Should().BeNull();
            actual.Headers["host"].Should().Be("www.onetrueerror.com");
            actual.Headers["X-identity"].Should().Be("1");
        }