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()); }
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(); } }
public DomainControl(ref Basics.Context.IHttpContext context) { this._Context = context; this.Build(); }