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")); }
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 }; } }