internal static void ProcessQueue()
        {
            RequestEventInfo requestEvent;

            while (requestEventQueue.TryDequeue(out requestEvent))
            {
                HTTPRequest source = requestEvent.SourceRequest;

                if (HTTPManager.Logger.Level == Loglevels.All)
                {
                    HTTPManager.Logger.Information("RequestEventHelper", "Processing request event: " + requestEvent.ToString(), source.Context);
                }

                if (OnEvent != null)
                {
                    try
                    {
                        OnEvent(requestEvent);
                    }
                    catch (Exception ex)
                    {
                        HTTPManager.Logger.Exception("RequestEventHelper", "ProcessQueue", ex, source.Context);
                    }
                }

                switch (requestEvent.Event)
                {
                case RequestEvents.StreamingData:
                {
                    var response = source.Response;
                    if (response != null)
                    {
                        System.Threading.Interlocked.Decrement(ref response.UnprocessedFragments);
                    }

                    bool reuseBuffer = true;
                    try
                    {
                        if (source.OnStreamingData != null)
                        {
                            reuseBuffer = source.OnStreamingData(source, response, requestEvent.Data, requestEvent.DataLength);
                        }
                    }
                    catch (Exception ex)
                    {
                        HTTPManager.Logger.Exception("RequestEventHelper", "Process RequestEventQueue - RequestEvents.StreamingData", ex, source.Context);
                    }

                    if (reuseBuffer)
                    {
                        BufferPool.Release(requestEvent.Data);
                    }
                    break;
                }

                case RequestEvents.DownloadProgress:
                    try
                    {
                        if (source.OnDownloadProgress != null)
                        {
                            source.OnDownloadProgress(source, requestEvent.Progress, requestEvent.ProgressLength);
                        }
                    }
                    catch (Exception ex)
                    {
                        HTTPManager.Logger.Exception("RequestEventHelper", "Process RequestEventQueue - RequestEvents.DownloadProgress", ex, source.Context);
                    }
                    break;

                case RequestEvents.UploadProgress:
                    try
                    {
                        if (source.OnUploadProgress != null)
                        {
                            source.OnUploadProgress(source, requestEvent.Progress, requestEvent.ProgressLength);
                        }
                    }
                    catch (Exception ex)
                    {
                        HTTPManager.Logger.Exception("RequestEventHelper", "Process RequestEventQueue - RequestEvents.UploadProgress", ex, source.Context);
                    }
                    break;

                case RequestEvents.Upgraded:
                    try
                    {
                        if (source.OnUpgraded != null)
                        {
                            source.OnUpgraded(source, source.Response);
                        }
                    }
                    catch (Exception ex)
                    {
                        HTTPManager.Logger.Exception("RequestEventHelper", "Process RequestEventQueue - RequestEvents.Upgraded", ex, source.Context);
                    }

                    IProtocol protocol = source.Response as IProtocol;
                    if (protocol != null)
                    {
                        ProtocolEventHelper.AddProtocol(protocol);
                    }
                    break;

                case RequestEvents.Resend:
                    source.State = HTTPRequestStates.Initial;

                    var host = HostManager.GetHost(source.CurrentUri.Host);

                    host.Send(source);

                    break;

                case RequestEvents.Headers:
                {
                    try
                    {
                        var response = source.Response;
                        if (source.OnHeadersReceived != null && response != null)
                        {
                            source.OnHeadersReceived(source, response);
                        }
                    }
                    catch (Exception ex)
                    {
                        HTTPManager.Logger.Exception("RequestEventHelper", "Process RequestEventQueue - RequestEvents.Headers", ex, source.Context);
                    }
                    break;
                }

                case RequestEvents.StateChange:
                    try
                    {
                        RequestEventHelper.HandleRequestStateChange(requestEvent);
                    }
                    catch (Exception ex)
                    {
                        HTTPManager.Logger.Exception("RequestEventHelper", "HandleRequestStateChange", ex, source.Context);
                    }
                    break;
                }
            }
        }