/// <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;
 }
Ejemplo n.º 2
0
        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();
        }