embed plugin loader directly into the launcher
This commit is contained in:
190
PluginLoader/Tools/SimpleHttpClient.cs
Normal file
190
PluginLoader/Tools/SimpleHttpClient.cs
Normal file
@@ -0,0 +1,190 @@
|
||||
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.WriteGameLog($"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.WriteGameLog($"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.WriteGameLog($"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.WriteGameLog($"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.WriteGameLog($"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.WriteGameLog($"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));
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user