blob: e76fc3329015ee7614a6e0a5a21f0ce1b053ff61 [file] [log] [blame]
using BaSys40.Utils.ResultHandling;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
namespace BaSys40.Utils.Client.Http
{
public abstract class SimpleHttpClient
{
public static HttpClient HttpClient { get; }
public static HttpClientHandler HttpClientHandler { get; }
public JsonSerializerSettings JsonSerializerSettings { get; protected set; }
static SimpleHttpClient()
{
HttpClientHandler = new HttpClientHandler() { MaxConnectionsPerServer = 100 };
HttpClient = new HttpClient(HttpClientHandler);
}
protected SimpleHttpClient()
{
JsonSerializerSettings = new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.Indented };
}
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 new HttpRequestMessage(method, uri);
}
protected virtual HttpRequestMessage CreateRequest(Uri uri, HttpMethod method, HttpContent content)
{
var message = CreateRequest(uri, method);
if (content != null)
message.Content = content;
return message;
}
protected virtual HttpRequestMessage CreateJsonContentRequest(Uri uri, HttpMethod method, object content)
{
var message = CreateRequest(uri, method, () =>
{
var serialized = JsonConvert.SerializeObject(content, JsonSerializerSettings);
return new StringContent(serialized, Encoding.Default, "application/json");
});
return message;
}
protected virtual HttpRequestMessage CreateRequest(Uri uri, HttpMethod method, Func<HttpContent> content)
{
var message = CreateRequest(uri, method);
if (content != null)
message.Content = content.Invoke();
return message;
}
protected virtual IResult EvaluateResponse(IResult result, HttpResponseMessage response)
{
var messageList = new List<IMessage>();
messageList.AddRange(result.Messages);
if (response != null)
{
var responseString = response.Content.ReadAsStringAsync().Result;
if (response.IsSuccessStatusCode)
{
messageList.Add(new Message(MessageType.Information, response.ReasonPhrase, ((int)response.StatusCode).ToString()));
return new Result(true, messageList);
}
else
{
messageList.Add(new Message(MessageType.Error, response.ReasonPhrase + "| " + responseString, ((int)response.StatusCode).ToString()));
return new Result(false, messageList);
}
}
messageList.Add(new Message(MessageType.Error, "Evaluation of response failed - Response from host is null", null));
return new Result(false, messageList);
}
protected virtual IResult<T> EvaluateResponse<T>(IResult result, HttpResponseMessage response)
{
var messageList = new List<IMessage>();
messageList.AddRange(result.Messages);
if (response != null)
{
var responseString = response.Content.ReadAsStringAsync().Result;
if (response.IsSuccessStatusCode)
{
try
{
responseString = CheckAndExtractResultContruct(responseString);
var requestResult = JsonConvert.DeserializeObject<T>(responseString, JsonSerializerSettings);
messageList.Add(new Message(MessageType.Information, response.ReasonPhrase, ((int)response.StatusCode).ToString()));
return new Result<T>(true, requestResult, messageList);
}
catch (Exception e)
{
messageList.Add(new Message(MessageType.Error, e.Message, e.HelpLink));
return new Result<T>(false, messageList);
}
}
else
{
messageList.Add(new Message(MessageType.Error, response.ReasonPhrase + "| " + responseString, ((int)response.StatusCode).ToString()));
return new Result<T>(false, messageList);
}
}
messageList.Add(new Message(MessageType.Error, "Evaluation of response failed - Response from host is null", null));
return new Result<T>(false, messageList);
}
private string CheckAndExtractResultContruct(string responseString)
{
if (responseString == null)
return null;
try
{
JObject jObj = JObject.Parse(responseString);
var jEntity = jObj.SelectToken("entity");
if (jEntity != null)
return jEntity.ToString();
else
return responseString;
}
catch
{
return responseString;
}
}
}
}