Пример #1
0
        private void killConnectionToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (listViewConns.SelectedItems.Count > 0)
            {
                ListViewItem item  = listViewConns.SelectedItems[0];
                NetGraph     graph = item.Tag as NetGraph;

                if (_service != null)
                {
                    _service.CloseConnection(graph);
                }
                else
                {
                    // If no service, then just destroy, shouldn't be here anyway
                    try
                    {
                        ((IDisposable)graph).Dispose();
                    }
                    catch
                    { }
                    item.Remove();
                }
            }
        }
Пример #2
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);
                        }
                    }
                }
            }
Пример #3
0
            private void Poll()
            {
                // Not much point if no event handler
                if (ClientConnected != null)
                {
                    NetGraph[] graphs = _service.Connections;

                    int newConnections = _document._concurrentConnections - graphs.Length;

                    long currTicks = DateTime.UtcNow.Ticks;

                    if (_document._specifyTimeout && (_document._timeoutMilliSeconds >= 0))
                    {
                        TimeSpan span = new TimeSpan(currTicks);
                        foreach (NetGraph graph in graphs)
                        {
                            if (span.Subtract(graph.CreatedTicks).TotalMilliseconds >= (double)_document._timeoutMilliSeconds)
                            {
                                _service.CloseConnection(graph);

                                // Add another connection
                                newConnections++;
                            }
                        }
                    }

                    if (_document._limitConnections)
                    {
                        newConnections = Math.Min(_connsLeft, newConnections);
                    }

                    while (newConnections > 0)
                    {
                        IDataAdapter adapter = new DataEndpointAdapter(
                            _document._factory.Create(_logger, new MetaDictionary(), _document._globalMeta), _logger);

                        ClientConnectedEventArgs args = new ClientConnectedEventArgs(adapter);

                        args.Properties.AddValue("ConnectionNumber", System.Threading.Interlocked.Increment(ref _connCount));

                        ClientConnected(this, new ClientConnectedEventArgs(adapter));

                        newConnections--;
                        if (_connsLeft > 0)
                        {
                            _connsLeft--;
                        }
                        else
                        {
                            break;
                        }
                    }

                    if (_document._limitConnections && (_connsLeft == 0) && (_service.Connections.Length == 0))
                    {
                        // Don't reenable timer
                        _logger.LogInfo("Completed {0} connections", _document._totalConnections);
                    }
                    else
                    {
                        _timer.Start();
                    }
                }
            }