Exemplo n.º 1
0
            private IEnumerable <HttpResponseDataChunk> GetResponse(ProxyConnection conn, Uri url, bool headRequest)
            {
                try
                {
                    DataReader reader = new DataReader(conn.DataAdapter.Coupling);

                    HttpParserConfig config = new HttpParserConfig();
                    config.StreamBody = true;

                    if (_server._config.Version10Proxy)
                    {
                        config.DowngradeChunkedToHttp10 = true;
                    }

                    _logger.LogVerbose("Starting processing of {0}", url);

                    HttpResponseHeader response = HttpParser.ReadResponseHeader(reader, false, _logger);

                    // If 100 continue then read out just that response then restart read
                    if (response.Is100Continue)
                    {
                        foreach (HttpResponseDataChunk chunk in response.ReadChunks(config))
                        {
                            _logger.LogVerbose("Read 100 continue chunk for {0} {1} {2}", url, chunk.Body.Length, chunk.FinalChunk);

                            yield return(chunk);
                        }

                        response = HttpParser.ReadResponseHeader(reader, false, _logger);
                    }

                    _logger.LogVerbose("Read response header {0}", response.ResponseCode);

                    response.SetHeadRequest(headRequest);

                    foreach (HttpResponseDataChunk newChunk in response.ReadChunks(config))
                    {
                        _logger.LogVerbose("Read chunk for {0} {1} {2}", url, newChunk.Body.Length, newChunk.FinalChunk);

                        yield return(newChunk);
                    }
                }
                finally
                {
                    bool closeSuccess = false;
                    try
                    {
                        conn.DataAdapter.Coupling.Dispose();
                        lock (_graphs)
                        {
                            _graphs.Remove(conn.Graph);
                        }
                        closeSuccess = true;
                    }
                    catch (OperationCanceledException)
                    {
                    }
                    catch (ObjectDisposedException)
                    {
                    }

                    if (!closeSuccess)
                    {
                        lock (_graphs)
                        {
                            // Force close
                            _service.CloseConnection(conn.Graph);
                            _graphs.Remove(conn.Graph);
                        }
                    }
                }
            }