示例#1
0
        public static void Handle(IPAddress remoteAddress, NetworkStream streamEnclosure)
        {
            do
            {
                string stateId = Guid.NewGuid().ToString();

                Basics.Context.IHttpContext context = null;
                IHandler xeoraHandler = null;
                try
                {
                    DateTime wholeProcessBegins = DateTime.Now;

                    Basics.Context.IHttpRequest request = new HttpRequest(remoteAddress);
                    if (!((HttpRequest)request).Build(stateId, streamEnclosure))
                    {
                        return;
                    }

                    Basics.Context.IHttpResponse response =
                        new HttpResponse(
                            stateId,
                            string.Compare(
                                request.Header["Connection"],
                                "keep-alive",
                                StringComparison.OrdinalIgnoreCase) == 0,
                            header =>
                    {
                        header.AddOrUpdate("Server", "XeoraEngine");
                        header.AddOrUpdate("X-Powered-By", "Xeora");
                        header.AddOrUpdate("X-Framework-Version", Server.GetVersionText());
                    });
                    ((HttpResponse)response).StreamEnclosureRequested +=
                        (out NetworkStream enclosure) => enclosure     = streamEnclosure;

                    ClientState.AcquireSession(request, out Basics.Session.IHttpSession session);
                    context =
                        new HttpContext(stateId, Configurations.Xeora.Service.Ssl, request, response, session, ApplicationContainer.Current);
                    PoolManager.KeepAlive(session.SessionId, context.HashCode);

                    DateTime xeoraHandlerProcessBegins = DateTime.Now;

                    xeoraHandler =
                        Handler.Manager.Current.Create(ref context);
                    ((Handler.Xeora)xeoraHandler).Handle();

                    if (Configurations.Xeora.Application.Main.PrintAnalysis)
                    {
                        double totalMs =
                            DateTime.Now.Subtract(xeoraHandlerProcessBegins).TotalMilliseconds;
                        Basics.Console.Push(
                            "analysed - xeora handler",
                            $"{totalMs}ms",
                            string.Empty, false, groupId: stateId,
                            type: totalMs > Configurations.Xeora.Application.Main.AnalysisThreshold
                                ? Basics.Console.Type.Warn
                                : Basics.Console.Type.Info);
                    }

                    DateTime responseFlushBegins = DateTime.Now;

                    ((HttpResponse)context.Response).Flush(streamEnclosure);

                    if (Configurations.Xeora.Application.Main.PrintAnalysis)
                    {
                        double totalMs =
                            DateTime.Now.Subtract(responseFlushBegins).TotalMilliseconds;
                        Basics.Console.Push(
                            "analysed - response flush",
                            $"{totalMs}ms",
                            string.Empty, false, groupId: stateId,
                            type: totalMs > Configurations.Xeora.Application.Main.AnalysisThreshold
                                ? Basics.Console.Type.Warn
                                : Basics.Console.Type.Info);

                        totalMs = DateTime.Now.Subtract(wholeProcessBegins).TotalMilliseconds;
                        Basics.Console.Push(
                            "analysed - whole process",
                            $"{totalMs}ms ({context.Request.Header.Url.Raw})",
                            string.Empty, false, groupId: stateId,
                            type: totalMs > Configurations.Xeora.Application.Main.AnalysisThreshold
                                ? Basics.Console.Type.Warn
                                : Basics.Console.Type.Info);
                    }

                    StatusTracker.Current.Increase(context.Response.Header.Status.Code);
                }
                catch (Exception ex)
                {
                    // Skip SocketExceptions
                    if (ex is IOException && ex.InnerException is SocketException)
                    {
                        return;
                    }

                    Basics.Console.Push("Execution Exception...", ex.Message, ex.ToString(), false, true,
                                        type: Basics.Console.Type.Error);

                    ClientState.PushServerError(ref streamEnclosure);

                    StatusTracker.Current.Increase(500);
                }
                finally
                {
                    if (xeoraHandler != null)
                    {
                        Handler.Manager.Current.Drop(xeoraHandler.HandlerId);
                    }
                    else
                    {
                        context?.Dispose();
                    }

                    Basics.Console.Flush(stateId);
                }
            } while (streamEnclosure.Alive());
        }
示例#2
0
        public void Handle()
        {
            try
            {
                DateTime wholeProcessBegins = DateTime.Now;

                Basics.Context.IHttpRequest request = new HttpRequest(this._RemoteAddr);
                if (!((HttpRequest)request).Build(this._StateID, this._StreamEnclosure))
                {
                    return;
                }

                this._Context = new HttpContext(this._StateID, ref request);

                DateTime xeoraHandlerProcessBegins = DateTime.Now;

                IHandler xeoraHandler =
                    Handler.HandlerManager.Current.Create(ref this._Context);
                ((Handler.XeoraHandler)xeoraHandler).Handle();

                if (Configurations.Xeora.Application.Main.PrintAnalytics)
                {
                    Basics.Console.Push(
                        "analytic - xeora handler",
                        string.Format("{0}ms", DateTime.Now.Subtract(xeoraHandlerProcessBegins).TotalMilliseconds), false);
                }

                DateTime responseFlushBegins = DateTime.Now;

                this._Context.Response.Header.AddOrUpdate("Server", "XeoraEngine");
                this._Context.Response.Header.AddOrUpdate("X-Powered-By", "XeoraCube");
                this._Context.Response.Header.AddOrUpdate("X-Framework-Version", WebServer.GetVersionText());
                this._Context.Response.Header.AddOrUpdate("Connection", "close");

                ((HttpResponse)this._Context.Response).Flush(this._StreamEnclosure);

                Handler.HandlerManager.Current.UnMark(xeoraHandler.HandlerID);

                if (Configurations.Xeora.Application.Main.PrintAnalytics)
                {
                    Basics.Console.Push(
                        "analytic - response flush",
                        string.Format("{0}ms", DateTime.Now.Subtract(responseFlushBegins).TotalMilliseconds), false);

                    Basics.Console.Push(
                        "analytic - whole process",
                        string.Format("{0}ms", DateTime.Now.Subtract(wholeProcessBegins).TotalMilliseconds), false);
                }
            }
            catch (System.Exception ex)
            {
                // Skip SocketExceptions
                if (ex is IOException && ex.InnerException is SocketException)
                {
                    return;
                }

                Helper.EventLogger.Log(ex);

                if (Configurations.Xeora.Service.Print)
                {
                    Basics.Console.Push("SYSTEM ERROR", ex.ToString(), false);
                }

                this.PushServerError();
            }
        }
示例#3
0
        public DomainControl(ref Basics.Context.IHttpContext context)
        {
            this._Context = context;

            this.Build();
        }