private void ServerWork(IAsyncResult result) { HttpListenerContext context; try { context = httpServer.EndGetContext(result); } catch (Exception) { return; } HttpListenerRequest request = context.Request; using (HttpListenerResponse response = context.Response) { var remoteIP = request.RemoteEndPoint.Address; if ((!request.IsLocal && httpServerConfig.LocalOnly) || Array.Exists(httpServerConfig.BlacklistedIPs, (e) => e == remoteIP.ToString())) { return; } if (!fr.AccessPermitted(remoteIP)) { response.StatusCode = 403; WriteToRemote(request, response, new byte[0]); return; } response.Headers["Server"] = httpServerConfig.ServerHeader; if (!rl.IsAllowed(remoteIP)) { response.AddHeader("Retry-After", httpServerConfig.RateLimitWaitTime.ToString()); response.StatusCode = 429; WriteToRemote(request, response, rateLimited); return; } string item = request.RawUrl; if (item == "/") { item = "/index.html"; } byte[] buffer = sFM.GetStaticItem(item); DataReceiveArgs eventArgs = new DataReceiveArgs() { ContentType = request.ContentType, Cookies = request.Cookies, HostName = request.UserHostName, Local = request.IsLocal, Referer = request.UrlReferrer, RemoteIP = request.RemoteEndPoint, URL = request.RawUrl, UserAgent = request.UserAgent, Method = request.HttpMethod, Headers = request.Headers.AllKeys }; ResponseMethod output = Tools.FireEvent(OnDataReceiveEvent, this, eventArgs); if (output.cancelExecution && output.Status != 200) { string errorString = $"<html><head><title>{output.Status} {respStatus[output.Status]}</title></head><body bgcolor=\"white\"><center><h1>{output.Status} {respStatus[output.Status]}</h1></center><hr><center>nginx/1.10.3</center></body></html>"; return; } if (output.cancelExecution) { return; } if (buffer.Length > 1 && Tools.FireEvent(OnDataStaticSentEvent, this, eventArgs)) { WriteToRemote(request, response, buffer); return; } buffer = Encoding.UTF8.GetBytes(output.response); WriteToRemote(request, response, buffer); } }