internal void LoadHeader(AutoCSer.Net.HttpDomainServer.ViewServer domainServer, AutoCSer.Net.Http.SocketBase socket, CallMethodInfo callInfo) { DomainServer = domainServer; Socket = socket; SocketIdentity = socket.Identity; MethodInfo = callInfo; }
/// <summary> /// 加载查询参数 /// </summary> internal unsafe void LoadAjax() { long identity = SocketIdentity; AutoCSer.Net.Http.SocketBase socket = Socket; try { if (loadView()) { if (!IsAsynchronous) { responseAjax(); } } else { if (!IsLocationPath) { setLocationPath(notFound404); } responseLocationPathAjax(); } return; } catch (Exception error) { DomainServer.RegisterServer.TcpServer.Log.Exception(error, null, LogLevel.Exception | LogLevel.AutoCSer); } serverError500(socket, identity); }
internal void LoadHeader(AutoCSer.Net.HttpDomainServer.ViewServer domainServer, AutoCSer.Net.Http.SocketBase socket, bool isAsynchronous) { DomainServer = domainServer; Socket = socket; SocketIdentity = socket.Identity; IsAsynchronous = isAsynchronous; }
/// <summary> /// 页面输出[TRY+1] /// </summary> private unsafe void responsePage() { long identity = SocketIdentity; AutoCSer.Net.Http.SocketBase socket = Socket; byte *buffer = null, encodeBuffer = null; try { if (ResponsePage(ref buffer, ref encodeBuffer) && SocketResponse(ref PageResponse)) { return; } } catch (Exception error) { DomainServer.RegisterServer.TcpServer.Log.Add(AutoCSer.Log.LogType.Error, error); } finally { if (buffer != null) { AutoCSer.UnmanagedPool.Default.Push(buffer); } if (encodeBuffer != null) { AutoCSer.UnmanagedPool.Default.Push(encodeBuffer); } } serverError500(socket, identity); }
/// <summary> /// 输出视图错误重定向路径[TRY+1] /// </summary> private unsafe void responseLocationPath() { long identity = SocketIdentity; AutoCSer.Net.Http.SocketBase socket = Socket; if (identity == socket.Identity) { try { if (LocationPath.LocationPath == null) { if (LocationPath.ErrorPath == null) { socket.ResponseError(identity, Net.Http.ResponseState.NotFound404); return; } ResponseLocationPath(socket); } else { HttpResponse.SetLocation(socket.HttpHeader, LocationPath.LocationPath, Net.Http.ResponseState.Found302); } if (SocketResponse(ref PageResponse)) { return; } } catch (Exception error) { DomainServer.RegisterServer.TcpServer.Log.Exception(error, null, LogLevel.Exception | LogLevel.AutoCSer); } serverError500(socket, identity); } }
internal void ResponseLocationPath(AutoCSer.Net.Http.SocketBase socket) { if (LocationPath.ReturnPath == null) { HttpResponse.SetLocation(socket.HttpHeader, LocationPath.ErrorPath, Net.Http.ResponseState.Found302); } else { SubArray <byte> data = default(SubArray <byte>); socket.HttpHeader.SetResponseLocationRange(LocationPath.ErrorPath.Length + 5 + LocationPath.ReturnPath.Length, ref data); fixed(byte *dataFixed = data.Array) { byte *write = dataFixed + data.Start; fixed(char *pathFixed = LocationPath.ErrorPath) AutoCSer.Extension.StringExtension.WriteBytes(pathFixed, LocationPath.ErrorPath.Length, write); *(write += LocationPath.ErrorPath.Length) = LocationPath.ErrorPath.IndexOf('#') >= 0 ? (byte)'&' : (byte)'#'; *(long *)(++write) = 'u' + ('r' << 16) + ((long)'l' << 32) + ((long)'=' << 48); fixed(char *pathFixed = LocationPath.ReturnPath) AutoCSer.Extension.StringExtension.WriteBytes(pathFixed, LocationPath.ReturnPath.Length, write + sizeof(long)); } HttpResponse.SetLocation(ref data, Net.Http.ResponseState.Found302); } }
protected override void request(int viewIndex, AutoCSer.Net.Http.SocketBase socket) { switch (viewIndex) { #region LOOP Views #region IF Attribute.IsPage case @PageIndex: #region IF IsPoolType #region IF IsSetPage @WebViewMethodType.FullName @PageName = @WebViewMethodType.FullName /**/.Pop(); if (@PageName == null) { setPage(@PageName = new @WebViewMethodType.FullName() /*PUSH:Attribute*/, @IsAsynchronous /*PUSH:Attribute*/, @IsAwaitMethod); } loadPage(socket, @PageName); #endregion IF IsSetPage #region NOT IsSetPage loadPage(socket, /*IF:IsPoolType*/ @WebViewMethodType.FullName /**/.Pop() ?? /*IF:IsPoolType*/ new @WebViewMethodType.FullName()); #endregion NOT IsSetPage #endregion IF IsPoolType #region NOT IsPoolType loadPage(socket, /*NOTE*/ (AutoCSer.WebView.View)(object) /*NOTE*/ new @WebViewMethodType.FullName() /*IF:IsSetPage*//*PUSH:Attribute*/, @IsAsynchronous /*PUSH:Attribute*/, @IsAwaitMethod /*IF:IsSetPage*/); #endregion NOT IsPoolType return; #endregion IF Attribute.IsPage #endregion LOOP Views }
/// <summary> /// 释放资源 /// </summary> public virtual void Dispose() { AutoCSer.Net.Http.SocketBase socket = Socket; Socket = null; if (socket != null) { socket.ResponseError(SocketIdentity, AutoCSer.Net.Http.ResponseState.ServerError500); } }
protected override void request(int viewIndex, AutoCSer.Net.Http.SocketBase socket) { switch (viewIndex) { case 0: loadPage(socket, new AutoCSer.TestCase.WebPerformance.WebView(), false); return; case 1: loadPage(socket, new AutoCSer.TestCase.WebPerformance.WebViewAsynchronous(), true); return; } }
protected override void call(int callIndex, AutoCSer.Net.Http.SocketBase socket) { switch (callIndex) { case 0: loadAsynchronous(socket, AutoCSer.TestCase.WebPerformance.Json /**/.Pop() ?? new AutoCSer.TestCase.WebPerformance.Json(), _i0); return; } }
protected override void request(int viewIndex, AutoCSer.Net.Http.SocketBase socket) { switch (viewIndex) { case 0: loadPage(socket, AutoCSer.Web.WebView.Template /**/.Pop() ?? new AutoCSer.Web.WebView.Template()); return; } } /// <summary> /// 网站生成配置 /// </summary> internal new static readonly AutoCSer.Web.WebConfig WebConfig = new AutoCSer.Web.WebConfig(); /// <summary> /// 网站生成配置 /// </summary> /// <returns>网站生成配置</returns> protected override AutoCSer.WebView.Config getWebConfig() { return(WebConfig); } static WebServer() { CompileQueryParse(new System.Type[] { null }, new System.Type[] { null }); } } } namespace AutoCSer.Web { /// <summary> /// AJAX函数调用 /// </summary> [AutoCSer.WebView.Call] [AutoCSer.WebView.ClearMember(IsIgnoreCurrent = true)] public sealed class AjaxLoader : AutoCSer.WebView.AjaxLoader <AjaxLoader> { [AutoCSer.WebView.CallMethod(FullName = "/Ajax")] [System.Runtime.CompilerServices.MethodImpl(AutoCSer.MethodImpl.AggressiveInlining)] public void Load() { load(); } protected override void loadView(AutoCSer.WebView.AjaxMethodInfo ajaxInfo) { switch (ajaxInfo.MethodIndex) { case 2: loadView(AutoCSer.Web.WebView.Template /**/.Pop() ?? new AutoCSer.Web.WebView.Template(), ajaxInfo); return; default: return; } }
protected override void request(int viewIndex, AutoCSer.Net.Http.SocketBase socket) { switch (viewIndex) { case 0: loadPage(socket, new AutoCSer.TestCase.SqlTableWeb.Class(), false); return; case 1: loadPage(socket, new AutoCSer.TestCase.SqlTableWeb.ClassList(), false); return; case 2: loadPage(socket, new AutoCSer.TestCase.SqlTableWeb.Student(), false); return; } }
protected override void request(int viewIndex, AutoCSer.Net.Http.SocketBase socket) { switch (viewIndex) { case 0: loadPage(socket, AutoCSer.Web.Search/**/.Pop() ?? new AutoCSer.Web.Search()); return; case 1: loadPage(socket, AutoCSer.Web.WebView.Template/**/.Pop() ?? new AutoCSer.Web.WebView.Template()); return; } }
internal bool LoadHeader(AutoCSer.Net.HttpDomainServer.ViewServer domainServer, AutoCSer.Net.Http.SocketBase socket) { DomainServer = domainServer; Socket = socket; SocketIdentity = socket.Identity; if (loadHeader()) { return(true); } serverError500(); return(false); }
protected override void request(int viewIndex, AutoCSer.Net.Http.SocketBase socket) { switch (viewIndex) { #region LOOP Views #region IF Attribute.IsPage case @PageIndex: loadPage(socket, /*IF:IsPoolType*/ @WebViewMethodType.FullName /**/.Pop() ?? /*IF:IsPoolType*/ new @WebViewMethodType.FullName() /*PUSH:Attribute*/, @IsAsynchronous /*PUSH:Attribute*/); return; #endregion IF Attribute.IsPage #endregion LOOP Views } }
/// <summary> /// 输出结束 /// </summary> /// <param name="response">HTTP响应输出</param> /// <returns>是否操作成功</returns> internal unsafe bool SocketResponse(ref AutoCSer.Net.Http.Response response) { long identity = SocketIdentity; AutoCSer.Net.Http.SocketBase socket = Socket; try { AutoCSer.Net.Http.Header header = socket.HttpHeader; AutoCSer.Net.Http.HeaderFlag flag = header.Flag; if ((flag & AutoCSer.Net.Http.HeaderFlag.IsVersion) != 0 && (flag & Net.Http.HeaderFlag.IsRange) == 0) { response.TryStaticFileCacheControl(); } switch (response.Type) { case Net.Http.ResponseType.ByteArray: case Net.Http.ResponseType.SubByteArray: case Net.Http.ResponseType.SubBuffer: if ((flag & Net.Http.HeaderFlag.IsRange) == 0) { #if DOTNET2 || DOTNET4 if ((flag & Net.Http.HeaderFlag.IsGZip) != 0 && isGZip) { response.Compress(); } #else if ((flag & Net.Http.HeaderFlag.IsGZip) != 0 && isGZip) { response.Compress(DomainServer.WebConfigIsFastestCompressionLevel); } #endif response.NoStore200(DomainServer.HtmlContentType); } else if (header.FormatRange(response.Body.Array.Length)) { response.NoStore200(DomainServer.HtmlContentType); } else if (socket.ResponseError(identity, AutoCSer.Net.Http.ResponseState.RangeNotSatisfiable416)) { return(true); } break; //case Net.Http.ResponseType.File: response.SetState(AutoCSer.Net.Http.ResponseState.Ok200); break; } if (socket.Response(identity, ref response)) { return(true); } } finally { AutoCSer.Net.Http.Response.Push(ref response); } return(false); }
protected override void call(int callIndex, AutoCSer.Net.Http.SocketBase socket) { switch (callIndex) { case 0: AutoCSer.Web.AjaxLoader loader = AutoCSer.Web.AjaxLoader/**/.Pop() ?? new AutoCSer.Web.AjaxLoader(); ajaxLoader(loader, socket); loader.Load(); return; case 1: load(socket, AutoCSer.Web.LocationIndex/**/.Pop() ?? new AutoCSer.Web.LocationIndex(), _i1); return; } }
/// <summary> /// AJAX调用 /// </summary> protected void load() { try { AutoCSer.Net.Http.SocketBase socket = Socket; AutoCSer.Net.Http.Header header = Socket.HttpHeader; if ((header.Flag & Net.Http.HeaderFlag.IsSetAjaxCallName) != 0) { #if MONO AutoCSer.WebView.AjaxMethodInfo call = methods.Get(header.AjaxCallNameData); #else AutoCSer.WebView.AjaxMethodInfo call = DomainServer.WebConfigIgnoreCase ? methods.GetLower(header.AjaxCallNameData) : methods.Get(header.AjaxCallNameData); #endif if (call == null) { byte[] path = DomainServer.GetViewRewrite(header.AjaxCallNameData); if (path.length() != 0) { call = methods.GetNotEmpty(path); } } if (call != null && (!call.IsReferer || header.IsReferer != 0))// || AutoCSer.Config.Pub.Default.IsDebug { if (call.IsViewPage) { if (header.Method == Net.Http.MethodType.GET) { loadView(call); return; } } else if ((header.Method == Net.Http.MethodType.POST || !call.IsPost)) { if (header.ContentLength <= call.MaxPostDataSize) { loadAjax(call); } else { socket.ResponseErrorIdentity(AutoCSer.Net.Http.ResponseState.ServerError500); } return; } } } socket.ResponseErrorIdentity(AutoCSer.Net.Http.ResponseState.NotFound404); } finally { PushPool(); } }
protected override void call(int callIndex, AutoCSer.Net.Http.SocketBase socket) { switch (callIndex) { case 0: AutoCSer.TestCase.WebPerformance.AjaxLoader loader = AutoCSer.TestCase.WebPerformance.AjaxLoader /**/.Pop() ?? new AutoCSer.TestCase.WebPerformance.AjaxLoader(); ajaxLoader(loader, socket); loader.Load(); return; case 1: load(socket, AutoCSer.TestCase.WebPerformance.WebCall /**/.Pop() ?? new AutoCSer.TestCase.WebPerformance.WebCall(), _i1); return; case 2: loadAsynchronous(socket, AutoCSer.TestCase.WebPerformance.WebCallAsynchronous /**/.Pop() ?? new AutoCSer.TestCase.WebPerformance.WebCallAsynchronous(), _i2); return; } }
protected override void call(int callIndex, AutoCSer.Net.Http.SocketBase socket) { switch (callIndex) { #region LOOP Methods case @MethodIndex: #region IF IsAjaxLoad @WebCallAsynchronousMethodType.FullName loader = @WebCallAsynchronousMethodType.FullName /**/.Pop() ?? new @WebCallAsynchronousMethodType.FullName(); ajaxLoader(loader, socket); loader./*PUSH:Method*/ @MethodName/*PUSH:Method*/ (); #endregion IF IsAjaxLoad #region NOT IsAjaxLoad #region IF IsAsynchronous loadAsynchronous(socket, /*IF:IsPoolType*/ @WebCallAsynchronousMethodType.FullName /**/.Pop() ?? /*IF:IsPoolType*/ new @WebCallAsynchronousMethodType.FullName(), @CallMethodInfo); #endregion IF IsAsynchronous #region NOT IsAsynchronous load(socket, /*IF:IsPoolType*/ @WebCallMethodType.FullName /**/.Pop() ?? /*IF:IsPoolType*/ new @WebCallMethodType.FullName(), @CallMethodInfo); #endregion NOT IsAsynchronous #endregion NOT IsAjaxLoad return; #endregion LOOP Methods } }
/// <summary> /// 页面输出[TRY+1] /// </summary> private unsafe void responsePage() { long identity = SocketIdentity; AutoCSer.Net.Http.SocketBase socket = Socket; AutoCSer.Memory.Pointer buffer = default(AutoCSer.Memory.Pointer), encodeBuffer = default(AutoCSer.Memory.Pointer); try { if (ResponsePage(ref buffer, ref encodeBuffer) && SocketResponse(ref PageResponse)) { return; } } catch (Exception error) { DomainServer.RegisterServer.TcpServer.Log.Exception(error, null, LogLevel.Exception | LogLevel.AutoCSer); } finally { UnmanagedPool.Default.Push(ref buffer); UnmanagedPool.Default.Push(ref encodeBuffer); } serverError500(socket, identity); }
private void serverError500(AutoCSer.Net.Http.SocketBase socket, long identity) { socket.ResponseError(identity, Net.Http.ResponseState.ServerError500); }
protected override void call(int callIndex, AutoCSer.Net.Http.SocketBase socket) { switch (callIndex) { case 0: AutoCSer.TestCase.WebPerformance.AjaxLoader loader = AutoCSer.TestCase.WebPerformance.AjaxLoader /**/.Pop() ?? new AutoCSer.TestCase.WebPerformance.AjaxLoader(); ajaxLoader(loader, socket); loader.Load(); return; case 1: load(socket, AutoCSer.TestCase.WebPerformance.WebCall /**/.Pop() ?? new AutoCSer.TestCase.WebPerformance.WebCall(), _i1); return; case 2: loadAsynchronous(socket, AutoCSer.TestCase.WebPerformance.WebCallAsynchronous /**/.Pop() ?? new AutoCSer.TestCase.WebPerformance.WebCallAsynchronous(), _i2); return; } } protected override bool call(AutoCSer.WebView.CallBase call, ref AutoCSer.Memory.UnmanagedStream responseStream) { switch (call.CallMethodIndex) { case 1: { _p1 parameter = new _p1(); if (call.ParseParameter(ref parameter)) { AutoCSer.TestCase.WebPerformance.WebCall value = (AutoCSer.TestCase.WebPerformance.WebCall)call; value.Add(parameter.left, parameter.right); repsonseCall(value, ref responseStream); return(true); } } return(false); default: return(false); } } protected override bool call(AutoCSer.WebView.CallBase call) { switch (call.CallMethodIndex) { case 2: { _p1 parameter = new _p1(); if (call.ParseParameter(ref parameter)) { ((AutoCSer.TestCase.WebPerformance.WebCallAsynchronous)call).Xor(parameter.left, parameter.right); return(true); } } return(false); default: return(false); } } [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Auto)] struct _p1 { public int left; public int right; } } } namespace AutoCSer.TestCase.WebPerformance { internal partial class WebView { protected override bool page(ref AutoCSer.WebView.Response _html_) { byte[][] htmls; htmls = loadHtml(@"WebView.html", 2); if (htmls != null) { _html_.WriteNotNull(htmls[0]); _html_.Write(Return); _html_.WriteNotNull(htmls[1]); return(true); } return(false); } protected override void ajax(AutoCSer.Memory.CharStream _js_) { _js_.Write(@"{Return:"); { int _value1_ = Return; _js_.WriteWebViewJson((int)_value1_); } _js_.Write(@"}"); } [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Auto)] internal struct WebViewQuery { [AutoCSer.JsonDeSerializeMember(IsDefault = true)] public int left; public int right; } /// <summary> /// 查询参数 /// </summary> private WebViewQuery query; /// <summary> /// WEB视图加载 /// </summary> /// <returns>是否成功</returns> protected override bool loadView() { if (base.loadView()) { query = default(WebViewQuery); if (ParseParameter(ref query)) { return(loadView(query.left, query.right)); } } return(false); } } } namespace AutoCSer.TestCase.WebPerformance { internal partial class WebViewAsynchronous { protected override bool page(ref AutoCSer.WebView.Response _html_) { byte[][] htmls; htmls = loadHtml(@"WebViewAsynchronous.html", 2); if (htmls != null) { _html_.WriteNotNull(htmls[0]); _html_.Write(Return); _html_.WriteNotNull(htmls[1]); return(true); } return(false); } protected override void ajax(AutoCSer.Memory.CharStream _js_) { _js_.Write(@"{Return:"); { int _value1_ = Return; _js_.WriteWebViewJson((int)_value1_); } _js_.Write(@"}"); } [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Auto)] internal struct WebViewQuery { [AutoCSer.JsonDeSerializeMember(IsDefault = true)] public int left; public int right; } /// <summary> /// 查询参数 /// </summary> private WebViewQuery query; /// <summary> /// WEB视图加载 /// </summary> /// <returns>是否成功</returns> protected override bool loadView() { if (base.loadView()) { query = default(WebViewQuery); if (ParseParameter(ref query)) { return(loadView(query.left, query.right)); } } return(false); } } } namespace AutoCSer.TestCase.WebPerformance { /// <summary> /// WEB服务器 /// </summary> public partial class WebServer : AutoCSer.Net.HttpDomainServer.ViewServer <int> { protected override KeyValue <string[], string[]> rewrites { get { int count = 2 + 0 * 2; string[] names = new string[count]; string[] views = new string[count]; names[--count] = "/WebView"; views[count] = "/WebView.html"; names[--count] = "/WebViewAsynchronous"; views[count] = "/WebViewAsynchronous.html"; return(new KeyValue <string[], string[]>(names, views)); } } protected override string[] viewRewrites { get { string[] names = new string[2]; names[0] = "/WebView"; names[1] = "/WebViewAsynchronous"; return(names); } } protected override string[] views { get { string[] names = new string[2]; names[0] = "/WebView.html"; names[1] = "/WebViewAsynchronous.html"; return(names); } } protected override void request(int viewIndex, AutoCSer.Net.Http.SocketBase socket) { switch (viewIndex) { case 0: loadPage(socket, AutoCSer.TestCase.WebPerformance.WebView /**/.Pop() ?? new AutoCSer.TestCase.WebPerformance.WebView()); return; case 1: AutoCSer.TestCase.WebPerformance.WebViewAsynchronous _p1 = AutoCSer.TestCase.WebPerformance.WebViewAsynchronous /**/.Pop(); if (_p1 == null) { setPage(_p1 = new AutoCSer.TestCase.WebPerformance.WebViewAsynchronous(), true, false); } loadPage(socket, _p1); return; } } /// <summary> /// 网站生成配置 /// </summary> internal new static readonly AutoCSer.TestCase.WebPerformance.WebViewConfig WebConfig = new AutoCSer.TestCase.WebPerformance.WebViewConfig(); /// <summary> /// 网站生成配置 /// </summary> /// <returns>网站生成配置</returns> protected override AutoCSer.WebView.Config getWebConfig() { return(WebConfig); } static WebServer() { CompileQueryParse(new System.Type[] { typeof(AutoCSer.TestCase.WebPerformance.WebView /**/.WebViewQuery), typeof(AutoCSer.TestCase.WebPerformance.WebViewAsynchronous /**/.WebViewQuery), null }, new System.Type[] { typeof(_p1), null }); } } } namespace AutoCSer.TestCase.WebPerformance { /// <summary> /// AJAX函数调用 /// </summary> [AutoCSer.WebView.Call] [AutoCSer.WebView.ClearMember(IsIgnoreCurrent = true)] public sealed class AjaxLoader : AutoCSer.WebView.AjaxLoader <AjaxLoader> { [AutoCSer.WebView.CallMethod(FullName = "/Ajax")] [System.Runtime.CompilerServices.MethodImpl(AutoCSer.MethodImpl.AggressiveInlining)] public void Load() { load(); } protected override void loadView(AutoCSer.WebView.AjaxMethodInfo ajaxInfo) { switch (ajaxInfo.MethodIndex) { case 2: loadView(AutoCSer.TestCase.WebPerformance.WebView /**/.Pop() ?? new AutoCSer.TestCase.WebPerformance.WebView(), ajaxInfo); return; case 3: AutoCSer.TestCase.WebPerformance.WebViewAsynchronous _p3 = AutoCSer.TestCase.WebPerformance.WebViewAsynchronous /**/.Pop(); if (_p3 == null) { setPage(_p3 = new AutoCSer.TestCase.WebPerformance.WebViewAsynchronous(), true, false); } loadView(_p3, ajaxInfo); return; default: return; } } protected override void loadAjax(AutoCSer.WebView.AjaxMethodInfo ajaxInfo) { switch (ajaxInfo.MethodIndex) { case 0: loadAjax(AutoCSer.TestCase.WebPerformance.Ajax.Call /**/.Pop() ?? new AutoCSer.TestCase.WebPerformance.Ajax.Call(), ajaxInfo); return; case 1: loadAjax(AutoCSer.TestCase.WebPerformance.Ajax.Call /**/.Pop() ?? new AutoCSer.TestCase.WebPerformance.Ajax.Call(), ajaxInfo); return; case 5 - 1: pubError(); return; default: return; } }
protected void ajaxLoader <callType>(callType ajaxLoader, AutoCSer.Net.Http.SocketBase socket) where callType : AutoCSer.WebView.CallAsynchronous <callType> { ajaxLoader.LoadHeader(this, socket, ajaxLoader); }