public override DataFrame Read() { try { if (_request == null) { _request = HttpParser.ReadRequestHeader(new DataReader(_stm), false, _logger); } if (_chunks == null) { _chunks = _request.ReadChunks(_config).GetEnumerator(); // If we can't move to the first chunk (headers) there is a serious issue if (!_chunks.MoveNext()) { throw new EndOfStreamException(); } } HttpRequestDataChunk chunk = _chunks.Current; if (!_chunks.MoveNext()) { _request = null; _chunks = null; } MemoryStream stm = new MemoryStream(); DataWriter writer = new DataWriter(stm); chunk.WriteChunk(writer); return(new DataFrame(stm.ToArray())); } catch (EndOfStreamException) { return(null); } }
public override void Write(DataFrame frame) { Uri currUri = null; HttpRequestDataChunk chunk = frame.Root.GetValue(DATA_NAME).Value; if (chunk.ChunkNumber == 0) { int error = 0; string message = null; if (_currOutConn == null) { try { _logger.LogVerbose("Received new connection to {0}", chunk.Path); currUri = new Uri(chunk.Path, UriKind.Absolute); chunk.Path = currUri.PathAndQuery; // Upgrade to at least version 1.0 if (chunk.Version.IsVersionUnknown) { chunk.Version = HttpVersion.Version10; } // Add a Connection: close header? _currOutConn = new ProxyConnection(); _currOutConn.DataAdapter = new HttpProxyDataAdapter(currUri, _cancellationSource.Token); _currOutConn.Graph = ConnectClient(_currOutConn.DataAdapter); if (_currOutConn.Graph == null) { _currOutConn.DataAdapter.Close(); error = 404; message = "Not Found"; _currOutConn = null; } else { _currOutConn.ResponseReader = GetResponse(_currOutConn, currUri, chunk.Method.Equals("HEAD", StringComparison.OrdinalIgnoreCase)); _conns.Enqueue(_currOutConn); } } catch (UriFormatException) { error = 400; message = "Bad Request"; } if (error != 0) { ProxyConnection conn = new ProxyConnection(); conn.ResponseReader = new[] { BuildError(error, message, chunk.Method, chunk.Version) }; _conns.Enqueue(conn); } } } if (_currOutConn != null) { DataWriter writer = new DataWriter(new DataAdapterToStream(_currOutConn.DataAdapter.Coupling)); chunk.WriteChunk(writer); if (chunk.FinalChunk) { _currOutConn = null; } } else { // Do nothing } }