public virtual WSClientAdapter GetAdapter(Gateway gateway, BeetleX.FastHttpApi.HttpRequest request, UrlRouteAgent urlRouteAgent, DataFrame frame) { WSClientAdapter result = (WSClientAdapter)request.Session["__ws_agent_adapter"]; if (result == null) { result = CreateAdapter(); result.Request = request; result.Gateway = gateway; result.Init(urlRouteAgent); request.Session["__ws_agent_adapter"] = result; } return(result); }
public void Add(int code, long time, Servers.ServerAgent server, BeetleX.FastHttpApi.HttpRequest request) { var stats = GetStatistics(request, code); stats?.Add(code, time, server, request); }
public virtual UrlRoute GetRouteAgent(Gateway gateway, BeetleX.FastHttpApi.HttpRequest request, UrlRouteAgent urlRouteAgent) { return(urlRouteAgent.UrlRoute); }
private void OnHttpDecode(ISession session, PipeStream pstream) { mReceives++; if (mRequest == null) { mRequest = mServer.CreateRequest(session); mRequest.ID = HttpRequest.GetID(); } if (mRequest.Read(pstream) == LoadedState.Completed) { try { Completed?.Invoke(this, mCompletedArgs.SetInfo(session, mRequest)); } finally { mRequest = null; mReceives = 0; } return; } else { HttpToken token = (HttpToken)session.Tag; if (session.Server.EnableLog(LogType.Info)) { session.Server.Log(LogType.Info, session, $"HTTP {mRequest.ID} {session.RemoteEndPoint} request from multi receive"); } if (mRequest.State == LoadedState.None) { if (mReceives > 3) { if (session.Server.EnableLog(LogType.Warring)) { session.Server.Log(LogType.Warring, session, $"HTTP {mRequest.ID} {session.RemoteEndPoint} receive data error!"); } token.KeepAlive = false; var response = mRequest.CreateResponse(); InnerErrorResult innerErrorResult = new InnerErrorResult("400", "Request http receive data error!"); response.Result(innerErrorResult); return; } if (pstream.FirstBuffer.Length > 10) { var span = pstream.FirstBuffer.Memory.Slice(0, 10).Span; var method = Encoding.ASCII.GetString(span.ToArray()); bool ismethod = method.IndexOf("GET") == 0 || method.IndexOf("POST") == 0 || method.IndexOf("HEAD") == 0 || method.IndexOf("PUT") == 0 || method.IndexOf("DELETE") == 0 || method.IndexOf("CONNECT") == 0 || method.IndexOf("OPTIONS") == 0 || method.IndexOf("TRACE") == 0; if (!ismethod) { if (session.Server.EnableLog(LogType.Warring)) { session.Server.Log(LogType.Warring, session, $"HTTP {mRequest.ID} {session.RemoteEndPoint} protocol data error!"); } token.KeepAlive = false; var response = mRequest.CreateResponse(); InnerErrorResult innerErrorResult = new InnerErrorResult("400", "Request http protocol data error!"); response.Result(innerErrorResult); return; } } } if ((int)mRequest.State < (int)LoadedState.Header && (pstream.Length > 1024 * 4 || mReceives > 20)) { if (session.Server.EnableLog(LogType.Warring)) { session.Server.Log(LogType.Warring, session, $"HTTP {mRequest.ID} {session.RemoteEndPoint} header too long!"); } token.KeepAlive = false; var response = mRequest.CreateResponse(); InnerErrorResult innerErrorResult = new InnerErrorResult("400", "Request header too large"); response.Result(innerErrorResult); } else if (mRequest.Length > mServerConfig.MaxBodyLength) { if (session.Server.EnableLog(LogType.Warring)) { session.Server.Log(LogType.Warring, session, $"HTTP {mRequest.ID} {session.RemoteEndPoint} body too long!"); } token.KeepAlive = false; var response = mRequest.CreateResponse(); InnerErrorResult innerErrorResult = new InnerErrorResult("400", "Request entity too large"); response.Result(innerErrorResult); return; } if (mReceives > 10 & pstream.Length < mReceives * 256) { if (session.Server.EnableLog(LogType.Warring)) { session.Server.Log(LogType.Warring, session, $"HTTP {mRequest.ID} {session.RemoteEndPoint} protocol data commit exception!"); } token.KeepAlive = false; var response = mRequest.CreateResponse(); InnerErrorResult innerErrorResult = new InnerErrorResult("400", "protocol data commit exception"); response.Result(innerErrorResult); } return; } }