コード例 #1
0
        public void NewInstance_ParsesHttpHeaderCorrectly()
        {
            var data = GetResourceAsBytes("HttpHeaderExample.txt");

            var header = new TcpRequestHeader(data);

            var headerExContent = Encoding.ASCII.GetString(data.Take(header.HeaderLength).ToArray());

            Assert.That(header.HeaderLength, Is.EqualTo(453));
            Assert.That(header.Path, Is.EqualTo("/status"));
            Assert.That(header.TransportProtocol, Is.EqualTo(TransportProtocol.Http));
            Assert.That(header.Headers["Connection"][0], Is.EqualTo("keep-alive"));
        }
コード例 #2
0
        public async Task<TcpReceiveContext> ReadAsync()
        {
            using (var cancellationTokenSource = new CancellationTokenSource(Timeout))
            {
                var socketStream = new NetworkStream(_socket);
                var receivedStream = new MemoryStream();
                var read = 0;

                TcpRequestHeader header = null;

                while (true)
                {
                    read = await socketStream.ReadAsync(_readBuffer, 0, _readBuffer.Length, cancellationTokenSource.Token);

                    if (header == null)
                    {
                        header = new TcpRequestHeader(_readBuffer);
                    }
                    else
                    {
                        header.Append(_readBuffer);
                    }

                    if (header.IsComplete || read < _readBuffer.Length) break;
                }

                if ((read - header.HeaderLength) > 0)
                    receivedStream.Write(_readBuffer, header.HeaderLength, read - header.HeaderLength);

                while (receivedStream.Position < header.ContentLength)
                {
                    read = await socketStream.ReadAsync(_readBuffer, 0, _readBuffer.Length, cancellationTokenSource.Token);

                    receivedStream.Write(_readBuffer, 0, read);
                }

                DebugOutput.Log("Received {0} bytes", receivedStream.Position);

                receivedStream.Position = 0;

                return new TcpReceiveContext(_socket)
                {
                    Header = header,
                    ReceivedData = receivedStream
                };
            }
        }