blob: 72cf7e3c239a8193828767d06457f490294e72dd [file] [log] [blame]
using BaSys40.Utils.ResultHandling;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
namespace BaSys40.Utils.Client
{
public abstract class SimpleHttpClient
{
public static HttpClient HttpClient { get; }
public static HttpClientHandler HttpClientHandler { get; }
public static JsonSerializerSettings JsonSerializerSettings { get; }
static SimpleHttpClient()
{
JsonSerializerSettings = new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.Indented };
HttpClientHandler = new HttpClientHandler() { MaxConnectionsPerServer = 100 };
HttpClient = new HttpClient(HttpClientHandler);
}
protected virtual IResult<HttpResponseMessage> SendRequest(HttpRequestMessage message, int timeout)
{
try
{
var task = HttpClient.SendAsync(message);
if (Task.WhenAny(task, Task.Delay(timeout)).Result == task)
{
return new Result<HttpResponseMessage>(true, task.Result);
}
else
{
return new Result<HttpResponseMessage>(false, new List<IMessage> { new Message(MessageType.Error, "Error while sending the request: timeout") });
}
}
catch (Exception e)
{
return new Result<HttpResponseMessage>(e);
}
}
protected virtual HttpRequestMessage CreateRequest(Uri uri, HttpMethod method)
{
return CreateRequest(uri, method, null);
}
protected virtual HttpRequestMessage CreateRequest(Uri uri, HttpMethod method, object content)
{
HttpRequestMessage message = new HttpRequestMessage(method, uri);
if (content != null)
message.Content = new StringContent(JsonConvert.SerializeObject(content, JsonSerializerSettings), Encoding.Default, "application/json");
return message;
}
protected virtual IResult EvaluateResponse(HttpResponseMessage response)
{
if (response != null)
{
var responseString = response.Content.ReadAsStringAsync().Result;
if (response.IsSuccessStatusCode)
return new Result(true, new List<IMessage> { new Message(MessageType.Information, response.ReasonPhrase, ((int)response.StatusCode).ToString()) });
else
return new Result(false, new List<IMessage> { new Message(MessageType.Error, response.ReasonPhrase + "| " + responseString, ((int)response.StatusCode).ToString()) });
}
return new Result(false, new List<IMessage> { new Message(MessageType.Error, "Response from host is null", null) });
}
protected virtual IResult<T> EvaluateResponse<T>(HttpResponseMessage response)
{
if (response != null)
{
var responseString = response.Content.ReadAsStringAsync().Result;
if (response.IsSuccessStatusCode)
{
try
{
var requestResult = JsonConvert.DeserializeObject<T>(responseString);
return new Result<T>(true, requestResult, new List<IMessage> { new Message(MessageType.Information, response.ReasonPhrase, ((int)response.StatusCode).ToString()) });
}
catch (Exception e)
{
return new Result<T>(false, new List<IMessage> { new Message(MessageType.Error, e.Message, e.HelpLink) });
}
}
else
return new Result<T>(false, new List<IMessage> { new Message(MessageType.Error, response.ReasonPhrase + "| " + responseString, ((int)response.StatusCode).ToString()) });
}
return new Result<T>(false, new List<IMessage> { new Message(MessageType.Error, "Response from host is null", null) });
}
}
}