Files
se-launcher/PluginLoader/Tools/SimpleHttpClient.cs
zznty 9fb29d2011
All checks were successful
Build / Build Launcher (push) Successful in 2m31s
update logging and add pl splash as the main one
2024-05-31 17:12:08 +07:00

190 lines
5.9 KiB
C#

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<TV>(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<TV>(streamReader.ReadToEnd());
}
catch (WebException e)
{
LogFile.Log.Info($"REST API request failed: GET {url} [{e.Message}]");
return null;
}
}
public static TV Get<TV>(string url, Dictionary<string, string> 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<TV>(streamReader.ReadToEnd());
}
catch (WebException e)
{
LogFile.Log.Info($"REST API request failed: GET {uri} [{e.Message}]");
return null;
}
}
public static TV Post<TV>(string url)
where TV : class, new()
{
try
{
var request = CreateRequest(HttpMethod.Post, url);
request.ContentLength = 0L;
return PostRequest<TV>(request);
}
catch (WebException e)
{
LogFile.Log.Info($"REST API request failed: POST {url} [{e.Message}]");
return null;
}
}
public static TV Post<TV>(string url, Dictionary<string, string> 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<TV>(request);
}
catch (WebException e)
{
LogFile.Log.Info($"REST API request failed: POST {uri} [{e.Message}]");
return null;
}
}
public static TV Post<TV, TR>(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<TV>(request, requestBytes);
}
catch (WebException e)
{
LogFile.Log.Info($"REST API request failed: POST {url} [{e.Message}]");
return null;
}
}
public static bool Post<TR>(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<TV>(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<TV>(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<string, string> 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));
}
}
}