/// <summary> /// This method creates a transfer ID that can be /// applied to an <see cref="HttpTransfer"/> object. /// The <see cref="HTTPSession"/> object provides /// the base value for the transfer id. /// </summary> /// <param name="session"></param> /// <returns></returns> private uint CreateTransferId(HTTPSession session) { UInt32 id = (uint) session.GetHashCode(); this.m_LockHttpTransfers.AcquireWriterLock(-1); while (this.m_HttpTransfers.ContainsKey(id)) { id++; } this.m_LockHttpTransfers.ReleaseWriterLock(); return id; }
private void CloseSink(HTTPSession ss) { bool err = false; string erraddr = ""; ss.CancelAllEvents(); lock (TagQueue) { KeepAliveTimer.Remove(this.GetHashCode()); if (TagQueue.Count > 0) { OpenSource.Utilities.EventLogger.Log(this, System.Diagnostics.EventLogEntryType.Information, "Switching Pipeline Modes [" + ss.GetHashCode().ToString() + "]"); _PIPELINE = false; if (!ReceivedFirstResponse) { erraddr = ((StateData)TagQueue.Peek()).Dest.ToString(); } } if (!ReceivedFirstResponse) { OpenSource.Utilities.EventLogger.Log(this, System.Diagnostics.EventLogEntryType.Error, "Server[" + erraddr + "] closed socket without answering"); err = true; } while (TagQueue.Count > 0) { StateData sd = (StateData)TagQueue.Dequeue(); if (!err) { HTTPRequest TR = new HTTPRequest(); TR.ProxySetting = ProxySetting; TR._PIPELINE = true; if (this.OnSniff != null) TR.OnSniff += new HTTPRequest.SniffHandler(NonPipelinedSniffSink); if (this.OnSniffPacket != null) TR.OnSniffPacket += new HTTPRequest.RequestHandler(NonPipelinedSniffPacketSink); TR.OnResponse += new HTTPRequest.RequestHandler(NonPipelinedResponseSink); this.NotPipelinedTable[TR] = TR; TR.PipelineRequest(sd.Dest, sd.Request, sd.Tag); } else { if (OnResponse != null) OnResponse(this, null, sd.Tag); } } s = null; } }
/// <summary> /// Lock the set of existing transfers for the entire server. /// Add the new transfer to the session's state object, for future reference. /// Obtain a unique transfer ID /// Add the new transfer to the set of existing transfers for the entire server. /// Unlock the set of existing transfers. /// </summary> /// <param name="session"></param> /// <param name="transferInfo"></param> private void AddTransfer(HTTPSession session, HttpTransfer transferInfo) { this.m_LockHttpTransfers.AcquireWriterLock(-1); SessionData sd = (SessionData) session.StateObject; sd.Transfers.Enqueue(transferInfo); sd.Requested++; // obtain unique transfer id UInt32 id = (uint) session.GetHashCode(); while (this.m_HttpTransfers.ContainsKey(id)) { id++; } this.m_HttpTransfers.Add(id, transferInfo); transferInfo.m_TransferId = id; this.m_LockHttpTransfers.ReleaseWriterLock(); this.FireHttpTransfersChange(); }