public void AddInSteps()
        {
            var slize = CreateSlice(@"GET / HTTP/1.1
Connection: Keep-Alive
HOST: localhost
Content-Length: 0

");
            var stream = new SliceStream(slize, 1);
            _parser.Parse(stream);

            stream.SetLength(10);
            _parser.Parse(stream);
            Assert.False(_completed);

            stream.SetLength(16);
            _parser.Parse(stream);
            Assert.False(_completed);

            stream.SetLength(78);
            _parser.Parse(stream);
            Assert.True(_completed);
            Assert.Equal("Keep-Alive", _request.Headers["Connection"].Value);
            Assert.Equal("localhost", _request.Headers["HOST"].Value);
            Assert.Equal("0", _request.Headers["Content-Length"].Value);
        }
        public void ParseHeader_SkipBody()
        {
            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-8
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";
            string actual = "";
            var buffer = new BufferSlice(Encoding.ASCII.GetBytes(HttpPost), 0, HttpPost.Length);
            var stream = new SliceStream(buffer, buffer.Count);
            var parser = new HttpHeaderParser();
            parser.HeaderParsed += (sender, args) => actual = args.Value;
            parser.Parse(stream);

            Assert.Equal("ASP.NET_SessionId=5vkr4tfivb1ybu1sm4u4kahy; GriffinLanguageSwitcher=sv-se; __RequestVerificationToken=LiTSJATsiqh8zlcft_3gZwvY8HpcCUkirm307njxIZLdsJSYyqaV2st1tunH8sMvMwsVrj3W4dDoV8ECZRhU4s6DhTvd2F-WFkgApDBB-CA1; .ASPXAUTH=BF8BE1C246428B10B49AE867BEDF9748DB3842285BC1AF1EC44AD80281C4AE084B75F0AE13EAF1BE7F71DD26D0CE69634E83C4846625DC7E4D976CA1845914E2CC7A7CF2C522EA5586623D9B73B0AE433337FC59CF6AF665DC135491E78978EF", actual);
            Assert.Equal('h', (char)buffer.Buffer[stream.Position]);
        }
        public void Write_WrongOffset()
        {
            var slice = new BufferSlice(5);
            var stream = new SliceStream(slice);

            var mammasBullar = Encoding.UTF8.GetBytes("Mammas bullar smakar godast.");
            Assert.Throws<ArgumentOutOfRangeException>(() => stream.Write(mammasBullar, -1, 1));
        }
        public void Write_TooSmallInternalBuffer()
        {
            var slice = new BufferSlice(5);
            var stream = new SliceStream(slice);

            var mammasBullar = Encoding.UTF8.GetBytes("Mammas bullar smakar godast.");
            Assert.Throws<ArgumentOutOfRangeException>(() => stream.Write(mammasBullar, 0, 6));
        }
 /// <summary>
 /// Will serialize messages
 /// </summary>
 /// <param name="message"></param>
 public virtual void Write(object message)
 {
     var formatter = _formatterFactory.CreateSerializer();
     var buffer = new BufferSlice(65535);
     var writer = new SliceStream(buffer);
     formatter.Serialize(message, writer);
     writer.Position = 0;
     Send(buffer, (int) writer.Length);
 }
        public void Test()
        {
            var slice = new BufferSlice(65535);
            var stream = new SliceStream(slice);

            Assert.Equal(0, stream.Position);
            Assert.Equal(0, stream.Length);
            Assert.Equal(65535, ((IBufferWrapper)stream).Capacity);
        }
        public void Parse()
        {
            var buffer = Encoding.ASCII.GetBytes("GET / HTTP/1.1\r\nSERVER: LOCALHOST\r\n\r\n");
            var slice = new BufferSlice(buffer, 0, buffer.Length);
            var reader = new SliceStream(slice);


            var parser = new HttpHeaderParser();
            parser.HeaderParsed += (sender, args) => Console.WriteLine(args.Name + ": " + args.Value);
            parser.Parse(reader);
        }
        public void Write_Single()
        {
            var slice = new BufferSlice(65535);
            var stream = new SliceStream(slice);

            var mammasBullar = Encoding.UTF8.GetBytes("Mammas bullar smakar godast.");
            stream.Write(mammasBullar, 0, mammasBullar.Length);

            Assert.Equal(mammasBullar.Length, stream.Position);
            Assert.Equal(mammasBullar.Length, stream.Length);

            // must be able to write after the last byte.
            stream.Position = mammasBullar.Length;
        }
        /// <summary>
        /// Send a HTTP message
        /// </summary>
        /// <param name="message">Message to send</param>
        public void Send(IMessage message)
        {
            if (message == null) throw new ArgumentNullException("message");
            var slice = _stack.Pop();
            var stream = new SliceStream(slice);
            var serializer = new HttpHeaderSerializer();
            serializer.SerializeResponse((IResponse) message, stream);
            Context.Send(slice, (int) stream.Length);
            if (message.ContentLength > 0 && message.Body == null)
                throw new InvalidOperationException("A content length is specified, but the Body stream is null.");

            if (message.Body != null)
                Context.Send(message.Body);

            if (message.ProtocolVersion == "HTTP/1.0")
                Context.Close();
        }
        /// <summary>
        /// Process message
        /// </summary>
        /// <param name="context"></param>
        /// <param name="message"></param>
        public void HandleDownstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as SendHttpResponse;
            if (msg == null)
            {
                context.SendDownstream(message);
                return;
            }

            var slice = _pool.Pop();
            var serializer = new HttpHeaderSerializer();
            var stream = new SliceStream(slice);
            serializer.SerializeResponse(msg.Response, stream);
            context.SendDownstream(new SendSlice(slice, (int) stream.Length));
            if (msg.Response.Body != null)
                context.SendDownstream(new SendStream(msg.Response.Body));

            if (!msg.Response.KeepAlive)
                context.SendDownstream(new Close());
        }
        public void ReadLongerThanBuffer()
        {
            var slice = new BufferSlice(65535);
            var stream = new SliceStream(slice);
            var expected = "Mammas bullar smakar godast";
            var mammasBullar = Encoding.UTF8.GetBytes(expected);
            stream.Write(mammasBullar, 0, mammasBullar.Length);

            var buffer = new byte[100];
            stream.Position = 0;

            Assert.Equal(expected.Length, stream.Read(buffer, 0, 1024));
            Assert.Equal(expected, Encoding.UTF8.GetString(buffer, 0, expected.Length));
        }
        public void Read_TwoTimes()
        {
            var slice = new BufferSlice(65535);
            var stream = new SliceStream(slice);
            var mammasBullar = Encoding.UTF8.GetBytes("Mammas bullar smakar godast.");
            stream.Write(mammasBullar, 0, mammasBullar.Length);

            var buffer = new byte[10];
            stream.Position = 0;
            stream.Read(buffer, 0, 6);
            var buffer2 = new byte[10];
            stream.Read(buffer2, 0, 7);

            Assert.Equal("Mammas", Encoding.UTF8.GetString(buffer, 0, 6));
            Assert.Equal(" bullar", Encoding.UTF8.GetString(buffer2, 0, 7));
        }
        public void Position_SetGet()
        {
            var slice = new BufferSlice(65535);
            var stream = new SliceStream(slice);
            var mammasBullar = Encoding.UTF8.GetBytes("Mammas bullar smakar godast.");
            stream.Write(mammasBullar, 0, mammasBullar.Length);

            stream.Position = 2;
            Assert.Equal(2, stream.Position);
        }
        public void Write_ThenMovePositionOutOfRange()
        {
            var slice = new BufferSlice(65535);
            var stream = new SliceStream(slice);

            var mammasBullar = Encoding.UTF8.GetBytes("Mammas bullar smakar godast.");
            stream.Write(mammasBullar, 0, mammasBullar.Length);


            Assert.Throws<ArgumentOutOfRangeException>(() => stream.Position = mammasBullar.Length + 1);
            Assert.Throws<ArgumentOutOfRangeException>(() => stream.Position = -1);
        }