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