using System.Net; using System.Text; using LitJson; namespace PluginLoader.Tools; public static class SimpleHttpClient { // REST API request timeout in milliseconds private const int TimeoutMs = 3000; public static TV Get(string url) where TV : class, new() { try { using var response = (HttpWebResponse)CreateRequest(HttpMethod.Get, url).GetResponse(); using var responseStream = response.GetResponseStream(); if (responseStream == null) return null; using var streamReader = new StreamReader(responseStream, Encoding.UTF8); return JsonMapper.ToObject(streamReader.ReadToEnd()); } catch (WebException e) { LogFile.Log.Info($"REST API request failed: GET {url} [{e.Message}]"); return null; } } public static TV Get(string url, Dictionary parameters) where TV : class, new() { var uriBuilder = new StringBuilder(url); AppendQueryParameters(uriBuilder, parameters); var uri = uriBuilder.ToString(); try { using var response = (HttpWebResponse)CreateRequest(HttpMethod.Get, uri).GetResponse(); using var responseStream = response.GetResponseStream(); if (responseStream == null) return null; using var streamReader = new StreamReader(responseStream, Encoding.UTF8); return JsonMapper.ToObject(streamReader.ReadToEnd()); } catch (WebException e) { LogFile.Log.Info($"REST API request failed: GET {uri} [{e.Message}]"); return null; } } public static TV Post(string url) where TV : class, new() { try { var request = CreateRequest(HttpMethod.Post, url); request.ContentLength = 0L; return PostRequest(request); } catch (WebException e) { LogFile.Log.Info($"REST API request failed: POST {url} [{e.Message}]"); return null; } } public static TV Post(string url, Dictionary parameters) where TV : class, new() { var uriBuilder = new StringBuilder(url); AppendQueryParameters(uriBuilder, parameters); var uri = uriBuilder.ToString(); try { var request = CreateRequest(HttpMethod.Post, uri); request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = 0; return PostRequest(request); } catch (WebException e) { LogFile.Log.Info($"REST API request failed: POST {uri} [{e.Message}]"); return null; } } public static TV Post(string url, TR body) where TR : class, new() where TV : class, new() { try { var request = CreateRequest(HttpMethod.Post, url); var requestJson = JsonMapper.ToJson(body); var requestBytes = Encoding.UTF8.GetBytes(requestJson); request.ContentType = "application/json"; request.ContentLength = requestBytes.Length; return PostRequest(request, requestBytes); } catch (WebException e) { LogFile.Log.Info($"REST API request failed: POST {url} [{e.Message}]"); return null; } } public static bool Post(string url, TR body) where TR : class, new() { try { var request = CreateRequest(HttpMethod.Post, url); var requestJson = JsonMapper.ToJson(body); var requestBytes = Encoding.UTF8.GetBytes(requestJson); request.ContentType = "application/json"; request.ContentLength = requestBytes.Length; return PostRequest(request, requestBytes); } catch (WebException e) { LogFile.Log.Info($"REST API request failed: POST {url} [{e.Message}]"); return false; } } private static TV PostRequest(HttpWebRequest request, byte[] body = null) where TV : class, new() { if (body != null) { using var requestStream = request.GetRequestStream(); requestStream.Write(body, 0, body.Length); requestStream.Close(); } using var response = (HttpWebResponse)request.GetResponse(); using var responseStream = response.GetResponseStream(); if (responseStream == null) return null; using var streamReader = new StreamReader(responseStream, Encoding.UTF8); var data = JsonMapper.ToObject(streamReader.ReadToEnd()); return data; } private static bool PostRequest(HttpWebRequest request, byte[] body = null) { if (body != null) { using var requestStream = request.GetRequestStream(); requestStream.Write(body, 0, body.Length); requestStream.Close(); } using var response = (HttpWebResponse)request.GetResponse(); return response.StatusCode == HttpStatusCode.OK; } private static HttpWebRequest CreateRequest(HttpMethod method, string url) { var http = WebRequest.CreateHttp(url); http.Method = method.ToString().ToUpper(); http.Timeout = TimeoutMs; return http; } private static void AppendQueryParameters(StringBuilder stringBuilder, Dictionary parameters) { if (parameters == null || parameters.Count == 0) return; var first = true; foreach (var p in parameters) { stringBuilder.Append(first ? '?' : '&'); first = false; stringBuilder.Append(Uri.EscapeDataString(p.Key)); stringBuilder.Append('='); stringBuilder.Append(Uri.EscapeDataString(p.Value)); } } }