private async void EndGetRequest(HttpListenerContext context, System.Net.Http.HttpListener listener) { try { using (context.Response) HandleRequest(context); } catch (Exception ex) { Console.Write("Exception in listener: {0}{1}", Environment.NewLine, ex); } finally { try { if (listener.IsListening) { context = await listener.GetContextAsync(); EndGetRequest(context, listener); } } catch { Stop(); } } }
public void Dispose() { if (_httpListener != null) { _httpListener.Dispose(); _httpListener = null; } }
/// <summary> /// Stops listening for incoming connections /// </summary> public override void Stop() { if (!Running) { return; } IDisposable d = (IDisposable)listener; listener = null; d.Dispose(); }
private System.Net.Http.HttpListener StartHttpListener(int port, EventHandler <HttpListenerRequestEventArgs> requestHandler = null) { address = "127.0.0.1"; url = (new UriBuilder($"http://{address}:{port}/test")).Uri; var listener = new System.Net.Http.HttpListener(IPAddress.Parse(address), port); if (requestHandler != null) { listener.Request += requestHandler; } listener.Start(); return(listener); }
public Task Launch() { if (_cancellationToken.IsCancellationRequested) { throw new OperationCanceledException(); } if (_httpListener == null) { _logger.Info($"Starting server on {_endPoint.ToString()}"); _httpListener = new System.Net.Http.HttpListener(_endPoint, this, _cancellationToken); return(_httpListener.GetListenerTask()); } throw new InvalidOperationException("RestServerServer already running."); }
/// <summary> /// Starts listening for incoming connections /// </summary> public async override void Start() { if (Running) { return; } #if NETSTANDARD1_5 listener = new System.Net.Http.HttpListener(address, port); listener.Start(); var context = await listener.GetContextAsync(); EndGetRequest(context, listener); #else listener = new System.Net.HttpListener(); listener.Prefixes.Add(prefix); listener.Start(); listener.BeginGetContext(EndGetRequest, listener); #endif }
public HttpServer() { #region 初始化串口 int baudRate = 38400; string portName = "COM1"; try { baudRate = Convert.ToInt32(ConfigurationManager.AppSettings["BaudRate"]); } catch (Exception) { Console.WriteLine("波特率获取失败"); return; } if (Environment.OSVersion.Platform.ToString().StartsWith("Win")) { portName = ConfigurationManager.AppSettings["WinPortName"]; } else { portName = ConfigurationManager.AppSettings["LinuxPortName"]; } if (string.IsNullOrWhiteSpace(portName)) { Console.WriteLine("串口获取失败"); return; } serialPortInput.ConnectionStatusChanged += SerialPortInput_ConnectionStatusChanged; serialPortInput.MessageReceived += SerialPortInput_MessageReceived; serialPortInput.SetPort(portName, baudRate); serialPortInput.Connect(); Console.Write($"等待串口{portName}连接"); while (!serialPortInput.IsConnected) { Console.Write("."); Thread.Sleep(1000); } Console.WriteLine($"\n串口{portName}连接成功"); serialPortInput.SendMessage(new byte[] { 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0A, 0x00, 0x01, 0x00 }); #endregion #region 初始化服务器 var listener = new System.Net.Http.HttpListener(IPAddress.Any, 8081); try { listener.Request += async(sender, context) => { var request = context.Request; var response = context.Response; //如果是GET请求 if (request.HttpMethod == HttpMethods.Get) { string content = @"<h2>提供POST方法测试</h2> <form method=""POST"" action=""http://192.168.123.166:8081/login""> <input name=""data""></input> <button type=""submit"">Send</button> </form>"; await response.WriteContentAsync(MakeDocument(content)); } //如果是POST请求 else if (request.HttpMethod == HttpMethods.Post) { var data = await request.ReadUrlEncodedContentAsync(); //登录 if (request.Url.LocalPath.ToLower().Contains("login")) { ProcessLogin(data, response); } //获取数据 else if (request.Url.LocalPath.ToLower().Contains("getdata")) { ProcessGetData(data, response); } //控制开关 else if (request.Url.LocalPath.ToLower().Contains("control")) { ProcessControl(data, response); } //登出 else if (request.Url.LocalPath.ToLower().Contains("logout")) { ProcessLogOut(data, response); } else { //请求出错 } } else { response.MethodNotAllowed(); } response.Close(); }; listener.Start(); Console.WriteLine("服务器已启动..."); } catch (Exception exc) { Console.WriteLine(exc.ToString()); listener.Close(); } #endregion }
public override async Task Run(object prm) { if (!Settings.Config.ModuleWebServer) { return; } if (Settings.WebServerModule.ServerStatusPort > 0 && (_statusListener == null || !_statusListener.IsListening)) { await LogHelper.LogInfo("Starting Web Server - Status Reporter", Category); try { _statusListener?.Dispose(); } catch (Exception ex) { } var ip = "0.0.0.0"; _statusListener = new HttpListener(IPAddress.Parse(ip), Settings.WebServerModule.ServerStatusPort); _statusListener.Request += async(sender, context) => { try { if (_statusQueries.Count > 10) { return; } _statusQueries.Enqueue(DateTime.Now); // var request = context.Request; var response = context.Response; //OK, NO_ESI, NO_CONNECTION, NO_DISCORD var value = "OK"; if (TickManager.IsESIUnreachable) { value = "NO_ESI"; } if (TickManager.IsNoConnection) { value = "NO_CONNECTION"; } if (!APIHelper.DiscordAPI.IsAvailable) { if (Settings.WebServerModule.NoStatusResponseOnDiscordDisconnection) { return; } value = "NO_DISCORD"; } await response.WriteContentAsync(value); } catch (Exception ex) { await LogHelper.LogEx(ex.Message, ex, Category); } finally { try { context.Response.Close(); } catch { //ignore } } }; _statusListener.Start(); } if (_listener == null || !_listener.IsListening) { await LogHelper.LogInfo("Starting Web Server", Category); try { _listener?.Dispose(); } catch (Exception ex) { } //TODO cleanup all occurences in modules in some of the following releases var extPort = Settings.WebServerModule.WebExternalPort; var ip = "0.0.0.0"; _listener = new System.Net.Http.HttpListener(IPAddress.Parse(ip), extPort); _listener.Request += async(sender, context) => { try { var request = context.Request; var response = context.Response; if (request.Url.LocalPath.EndsWith(".js") || request.Url.LocalPath.EndsWith(".less") || request.Url.LocalPath.EndsWith(".css")) { var path = Path.Combine(SettingsManager.RootDirectory, "Content", "scripts", Path.GetFileName(request.Url.LocalPath)); if (request.Url.LocalPath.Contains("moments")) { path = Path.Combine(SettingsManager.RootDirectory, "Content", "scripts", "moments", Path.GetFileName(request.Url.LocalPath)); } if (!File.Exists(path)) { return; } if (request.Url.LocalPath.EndsWith(".less") || request.Url.LocalPath.EndsWith(".css")) { response.Headers.ContentType.Add("text/css"); } if (request.Url.LocalPath.EndsWith(".js")) { response.Headers.ContentType.Add("text/javascript"); } await response.WriteContentAsync(File.ReadAllText(path)); return; } if (request.Url.LocalPath == "/favicon.ico") { var path = Path.Combine(SettingsManager.RootDirectory, Path.GetFileName(request.Url.LocalPath)); if (!File.Exists(path)) { return; } await response.WriteContentAsync(File.ReadAllText(path)); return; } if (request.Url.LocalPath == "/" || request.Url.LocalPath == $"{extPort}/") { // var extIp = Settings.WebServerModule.WebExternalIP; var text = File.ReadAllText(SettingsManager.FileTemplateMain) .Replace("{headerContent}", GetHtmlResourceDefault(false)) .Replace("{header}", LM.Get("authTemplateHeader")) .Replace("{webWelcomeHeader}", LM.Get("webWelcomeHeader")) .Replace("{authButtonText}", LM.Get("butGeneralAuthPage")); //managecontrols var manageText = new StringBuilder(); //timers if (Settings.Config.ModuleTimers) { var authNurl = GetTimersURL(); manageText.Append($"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{LM.Get("authButtonTimersText")}</a>"); } if (Settings.Config.ModuleHRM) { var authNurl = GetHRMAuthURL(); manageText.Append($"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{LM.Get("authButtonHRMText")}</a>"); } if (Settings.Config.ModuleWebConfigEditor) { var authNurl = GetWebConfigAuthURL(); manageText.Append($"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{LM.Get("buttonSettingsText")}</a>"); } text = text.Replace("{manageControls}", manageText.ToString()); await WriteResponce(text, response); return; } if (request.Url.LocalPath == "/authPage.html" || request.Url.LocalPath == $"{extPort}/authPage.html") { var extIp = Settings.WebServerModule.WebExternalIP; var authUrl = $"{GetWebSiteUrl()}/auth"; var text = File.ReadAllText(SettingsManager.FileTemplateAuthPage) .Replace("{headerContent}", GetHtmlResourceDefault(false)) .Replace("{header}", LM.Get("authTemplateHeader")) .Replace("{backText}", LM.Get("backText")); //auth controls var authText = new StringBuilder(); if (Settings.Config.ModuleAuthWeb && SettingsManager.Settings.WebAuthModule.AuthGroups.Count > 0) { authText.Append($"<h2>{LM.Get("authWebDiscordHeader")}</h4>{LM.Get("authPageGeneralAuthHeader")}"); } var groupsForCycle = Settings.WebAuthModule.UseOneAuthButton ? Settings.WebAuthModule.AuthGroups.Where(a => a.Value.ExcludeFromOneButtonMode || a.Value.BindToMainCharacter) : Settings.WebAuthModule.AuthGroups; if (Settings.WebAuthModule.UseOneAuthButton) { if (Settings.Config.ModuleAuthWeb) { var url = $"{authUrl}?group={HttpUtility.UrlEncode(WebAuthModule.DEF_NOGROUP_NAME)}"; authText.Append($"\n<a href=\"{url}\" class=\"btn btn-info btn-block\" role=\"button\">{LM.Get("authButtonDiscordText")}</a>"); } } //stands auth if (Settings.Config.ModuleAuthWeb) { foreach (var groupPair in groupsForCycle.Where(a => a.Value.StandingsAuth != null)) { var group = groupPair.Value; var url = $"{authUrl}?group={HttpUtility.UrlEncode(groupPair.Key)}"; authText.Append($"\n<a href=\"{url}\" class=\"btn btn-info btn-block\" role=\"button\">{group.CustomButtonText}</a>"); } } //auth if (Settings.Config.ModuleAuthWeb) { foreach (var @group in groupsForCycle.Where(a => a.Value.StandingsAuth == null)) { var url = $"{authUrl}?group={HttpUtility.UrlEncode(group.Value.BindToMainCharacter ? WebAuthModule.DEF_ALTREGGROUP_NAME : group.Key)}"; var bText = group.Value.CustomButtonText ?? $"{LM.Get("authButtonDiscordText")} - {group.Key}"; authText.Append($"<a href=\"{url}\" class=\"btn btn-info btn-block\" role=\"button\">{bText}</a>"); } } var len = authText.Length; var smth = false; //stands auth if (Settings.Config.ModuleAuthWeb) { foreach (var groupPair in Settings.WebAuthModule.AuthGroups.Where(a => a.Value.StandingsAuth != null)) { var group = groupPair.Value; var url = GetStandsAuthURL(); authText.Append($"\n<a href=\"{url}\" class=\"btn btn-info btn-block\" role=\"button\">{group.StandingsAuth.WebAdminButtonText}</a>"); } smth = true; } //notifications if (Settings.Config.ModuleNotificationFeed) { var authNurl = GetAuthNotifyURL(); authText.Append($"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{LM.Get("authButtonNotifyText")}</a>"); smth = true; } //mail if (Settings.Config.ModuleMail) { var authNurl = GetMailAuthURL(); authText.Append($"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{LM.Get("authButtonMailText")}</a>"); smth = true; } if (Settings.Config.ModuleContractNotifications) { foreach (var notifyGroup in Settings.ContractNotificationsModule.Groups) { var group = notifyGroup.Value; var authNurl = GetContractsAuthURL(group.FeedPersonalContracts, group.FeedCorporateContracts, notifyGroup.Key); authText.Append($"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{group.ButtonText}</a>"); } smth = true; } if (Settings.Config.ModuleIndustrialJobs) { foreach (var(key, group) in Settings.IndustrialJobsModule.Groups) { var authNurl = GetIndustryJobsAuthURL(group.Filters.Any(a => a.Value.FeedPersonalJobs), group.Filters.Any(a => a.Value.FeedCorporateJobs), key); authText.Append($"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{group.ButtonText ?? key}</a>"); } smth = true; } if (smth) { authText.Insert(len, $"<h2>{LM.Get("authWebSystemHeader")}</h2>{LM.Get("authPageSystemAuthHeader")}"); } text = text.Replace("{authControls}", authText.ToString()).Replace("{authHeaderText}", LM.Get("authPageHeaderText")); await WriteResponce(text, response); return; } var result = false; foreach (var method in ModuleConnectors.Values) { try { result = await method(context); if (result) { break; } } catch (Exception ex) { await LogHelper.LogEx($"Module method {method.Method.Name} throws ex!", ex, Category); } } if (!result) { await WriteResponce(Get404Page(), response); } } catch (Exception ex) { await LogHelper.LogEx(ex.Message, ex, Category); } finally { try { context.Response.Close(); } catch { //ignore } } }; _listener.Start(); } }
public override async Task Run(object prm) { if (!SettingsManager.GetBool("config", "moduleWebServer")) { return; } if (_listener == null || !_listener.IsListening) { await LogHelper.LogInfo("Starting Web Server", Category); _listener?.Dispose(); var port = SettingsManager.GetInt("webServerModule", "webListenPort"); var extPort = SettingsManager.Get("webServerModule", "webExternalPort"); var ip = SettingsManager.Get("webServerModule", "webListenIP"); _listener = new System.Net.Http.HttpListener(IPAddress.Parse(ip), port); _listener.Request += async(sender, context) => { try { var request = context.Request; var response = context.Response; if (request.Url.LocalPath.EndsWith(".js") || request.Url.LocalPath.EndsWith(".less") || request.Url.LocalPath.EndsWith(".css")) { var path = Path.Combine(SettingsManager.RootDirectory, "Content", "scripts", Path.GetFileName(request.Url.LocalPath)); if (request.Url.LocalPath.Contains("moments")) { path = Path.Combine(SettingsManager.RootDirectory, "Content", "scripts", "moments", Path.GetFileName(request.Url.LocalPath)); } if (!File.Exists(path)) { return; } if (request.Url.LocalPath.EndsWith(".less") || request.Url.LocalPath.EndsWith(".css")) { response.Headers.ContentType.Add("text/css"); } if (request.Url.LocalPath.EndsWith(".js")) { response.Headers.ContentType.Add("text/javascript"); } await response.WriteContentAsync(File.ReadAllText(path)); return; } if (request.Url.LocalPath == "/" || request.Url.LocalPath == $"{port}/" || request.Url.LocalPath == $"{extPort}/") { var extIp = SettingsManager.Get("webServerModule", "webExternalIP"); var authUrl = $"http://{extIp}:{extPort}/auth.php"; var authNurl = GetAuthNotifyURL(); response.Headers.ContentEncoding.Add("utf-8"); response.Headers.ContentType.Add("text/html;charset=utf-8"); var text = File.ReadAllText(SettingsManager.FileTemplateMain).Replace("{authUrl}", authUrl) .Replace("{authNotifyUrl}", authNurl).Replace("{header}", LM.Get("authTemplateHeader")) .Replace("{timersUrl}", GetTimersURL()) .Replace("{authButtonDiscordText}", LM.Get("authButtonDiscordText")) .Replace("{authButtonNotifyText}", LM.Get("authButtonNotifyText")) .Replace("{authButtonTimersText}", LM.Get("authButtonTimersText")) .Replace("{authMailUrl}", GetMailAuthURL()) .Replace("{authButtonMailText}", LM.Get("authButtonMailText")) .Replace("{webAuthHeader}", LM.Get("webAuthHeader")) .Replace("{webWelcomeHeader}", LM.Get("webWelcomeHeader")) ; text = text.Replace("{disableWebAuth}", !SettingsManager.GetBool("config", "moduleAuthWeb") ? "disabled" : ""); text = text.Replace("{disableWebNotify}", !SettingsManager.GetBool("config", "moduleNotificationFeed") ? "disabled" : ""); text = text.Replace("{disableWebTimers}", !SettingsManager.GetBool("config", "moduleTimers") ? "disabled" : ""); text = text.Replace("{disableMailNotify}", !SettingsManager.GetBool("config", "moduleMail") ? "disabled" : ""); await response.WriteContentAsync(text); return; } var result = false; foreach (var method in ModuleConnectors.Values) { try { result = await method(context); if (result) { break; } } catch (Exception ex) { await LogHelper.LogEx($"Module method {method.Method.Name} throws ex!", ex, Category); } } if (!result) { response.Headers.ContentEncoding.Add("utf-8"); response.Headers.ContentType.Add("text/html;charset=utf-8"); await response.WriteContentAsync(File.ReadAllText(SettingsManager.FileTemplateAuth3).Replace("{message}", "404 Not Found!") .Replace("{header}", LM.Get("authTemplateHeader")) .Replace("{body}", LM.Get("WebRequestUnexpected")) ); } } catch (Exception ex) { await LogHelper.LogEx(ex.Message, ex, Category); } finally { try { context.Response.Close(); } catch { //ignore } } }; _listener.Start(); } }
public override async Task Run(object prm) { if (!Settings.Config.ModuleWebServer) { return; } if (_listener == null || !_listener.IsListening) { await LogHelper.LogInfo("Starting Web Server", Category); _listener?.Dispose(); var port = Settings.WebServerModule.WebListenPort; var extPort = Settings.WebServerModule.WebExternalPort; var ip = Settings.WebServerModule.WebListenIP; _listener = new System.Net.Http.HttpListener(IPAddress.Parse(ip), port); _listener.Request += async(sender, context) => { try { var request = context.Request; var response = context.Response; if (request.Url.LocalPath.EndsWith(".js") || request.Url.LocalPath.EndsWith(".less") || request.Url.LocalPath.EndsWith(".css")) { var path = Path.Combine(SettingsManager.RootDirectory, "Content", "scripts", Path.GetFileName(request.Url.LocalPath)); if (request.Url.LocalPath.Contains("moments")) { path = Path.Combine(SettingsManager.RootDirectory, "Content", "scripts", "moments", Path.GetFileName(request.Url.LocalPath)); } if (!File.Exists(path)) { return; } if (request.Url.LocalPath.EndsWith(".less") || request.Url.LocalPath.EndsWith(".css")) { response.Headers.ContentType.Add("text/css"); } if (request.Url.LocalPath.EndsWith(".js")) { response.Headers.ContentType.Add("text/javascript"); } await response.WriteContentAsync(File.ReadAllText(path)); return; } if (request.Url.LocalPath == "/favicon.ico") { var path = Path.Combine(SettingsManager.RootDirectory, Path.GetFileName(request.Url.LocalPath)); if (!File.Exists(path)) { return; } await response.WriteContentAsync(File.ReadAllText(path)); return; } if (request.Url.LocalPath == "/" || request.Url.LocalPath == $"{port}/" || request.Url.LocalPath == $"{extPort}/") { var extIp = Settings.WebServerModule.WebExternalIP; var authUrl = $"http://{extIp}:{extPort}/auth.php"; var text = File.ReadAllText(SettingsManager.FileTemplateMain) .Replace("{header}", LM.Get("authTemplateHeader")) .Replace("{webAuthHeader}", LM.Get("webAuthHeader")) .Replace("{webWelcomeHeader}", LM.Get("webWelcomeHeader")); //auth controls var authText = string.Empty; //auth if (SettingsManager.Settings.Config.ModuleAuthWeb) { var groups = SettingsManager.Settings.WebAuthModule.AuthGroups.Where(a => a.Value.PreliminaryAuthMode || a.Value.ESICustomAuthRoles.Any()).ToList(); //no default auth if there are no default groups if (groups.Count != SettingsManager.Settings.WebAuthModule.AuthGroups.Count) { authText = $"<a href=\"{authUrl}\" class=\"btn btn-info btn-block {(!Settings.Config.ModuleAuthWeb ? "disabled" : "")}\" role=\"button\">{LM.Get("authButtonDiscordText")}</a>"; } foreach (var @group in groups) { var customAuthString = GetCustomAuthUrl(group.Value.ESICustomAuthRoles, group.Key); var bText = group.Value.CustomButtonText ?? $"{LM.Get("authButtonDiscordText")} - {group.Key}"; authText += $"\n<a href=\"{customAuthString}\" class=\"btn btn-info btn-block\" role=\"button\">{bText}</a>"; } } //notifications if (Settings.Config.ModuleNotificationFeed) { var authNurl = GetAuthNotifyURL(); authText += $"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{LM.Get("authButtonNotifyText")}</a>"; } //mail if (Settings.Config.ModuleMail) { var authNurl = GetMailAuthURL(); authText += $"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{LM.Get("authButtonMailText")}</a>"; } text = text.Replace("{authControls}", authText); //managecontrols var manageText = string.Empty; //timers if (Settings.Config.ModuleTimers) { var authNurl = GetTimersURL(); manageText += $"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{LM.Get("authButtonTimersText")}</a>"; } if (Settings.Config.ModuleHRM) { var authNurl = GetHRMAuthURL(); manageText += $"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{LM.Get("authButtonHRMText")}</a>"; } text = text.Replace("{manageControls}", manageText); await WriteResponce(text, response); return; } var result = false; foreach (var method in ModuleConnectors.Values) { try { result = await method(context); if (result) { break; } } catch (Exception ex) { await LogHelper.LogEx($"Module method {method.Method.Name} throws ex!", ex, Category); } } if (!result) { await WriteResponce(File.ReadAllText(SettingsManager.FileTemplateAuth3).Replace("{message}", "404 Not Found!") .Replace("{header}", LM.Get("authTemplateHeader")) .Replace("{body}", LM.Get("WebRequestUnexpected")) .Replace("{backText}", LM.Get("backText")), response); } } catch (Exception ex) { await LogHelper.LogEx(ex.Message, ex, Category); } finally { try { context.Response.Close(); } catch { //ignore } } }; _listener.Start(); } }