using System; using System.Net.Http; using System.Net; using System.Threading.Tasks; namespace WelsonJS.Launcher.ResourceTools { public class CitiQuery : IResourceTool { private readonly ResourceServer Server; private readonly HttpClient _httpClient; private const string Prefix = "citi-query/"; public CitiQuery(ResourceServer server, HttpClient httpClient) { Server = server; _httpClient = httpClient; } public bool CanHandle(string path) { return path.StartsWith(Prefix, StringComparison.OrdinalIgnoreCase); } public async Task HandleAsync(HttpListenerContext context, string path) { try { string target = path.Substring(Prefix.Length).Trim(); string apiKey = Program.GetAppConfig("CitiApiKey"); if (string.IsNullOrEmpty(apiKey)) { Server.ServeResource(context, "Missing API key", "application/xml", 500); return; } string encoded = Uri.EscapeDataString(target); string apiPrefix = Program.GetAppConfig("CitiApiPrefix"); string url = $"{apiPrefix}asset/ip/report?ip={encoded}&full=true"; var request = new HttpRequestMessage(HttpMethod.Get, url); request.Headers.Add("x-api-key", apiKey); request.Headers.Add("User-Agent", context.Request.UserAgent); HttpResponseMessage response = await _httpClient.SendAsync(request); string content = await response.Content.ReadAsStringAsync(); context.Response.StatusCode = (int)response.StatusCode; Server.ServeResource(context, content, "application/json", (int)response.StatusCode); } catch (Exception ex) { Server.ServeResource(context, $"{ex.Message}", "application/xml", 500); } } } }