using System.Collections.Frozen; using System.Net; using System.Net.Sockets; using SPTarkov.DI.Annotations; using SPTarkov.Server.Core.Models.Spt.Config; using SPTarkov.Server.Core.Servers; namespace SPTarkov.Server.Core.Helpers; [Injectable(InjectionType.Singleton)] public class HttpServerHelper(ConfigServer configServer) { protected readonly HttpConfig _httpConfig = configServer.GetConfig(); protected readonly FrozenDictionary mime = new Dictionary { { "css", "text/css" }, { "bin", "application/octet-stream" }, { "html", "text/html" }, { "jpg", "image/jpeg" }, { "js", "text/javascript" }, { "json", "application/json" }, { "png", "image/png" }, { "svg", "image/svg+xml" }, { "txt", "text/plain" }, }.ToFrozenDictionary(); public string? GetMimeText(string key) { return mime.GetValueOrDefault(key); } /// /// Combine ip and port into address /// /// URI public string BuildUrl() { return $"{_httpConfig.BackendIp}:{_httpConfig.BackendPort}"; } /// /// Prepend http to the url:port /// /// URI public string GetBackendUrl() { return $"https://{BuildUrl()}"; } /// /// Get websocket url + port /// /// wss:// address public string GetWebsocketUrl() { return $"wss://{BuildUrl()}"; } /// /// Method to determine if another version of the server is already running /// /// bool isAlreadyRunning public bool IsAlreadyRunning() { TcpListener? listener = null; try { listener = new(IPAddress.Parse(_httpConfig.Ip), _httpConfig.Port); listener.Start(); return false; } catch (Exception) { return true; } finally { listener?.Stop(); } } public void SendTextJson(HttpResponse resp, object output) { resp.Headers.Append("Content-Type", mime["json"]); resp.StatusCode = 200; /* TODO: figure this one out resp.writeHead(200, "OK", { "Content-Type": this.mime.json }); resp.end(output); */ } }