From 2a27d4401132bd1290d456aa1d6f70bfde2812f3 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Tue, 3 Jul 2018 19:46:50 +0200 Subject: [PATCH] Got rid of code. --- .../Actions/FastlyActionHandler.cs | 43 ++++++--------- .../Actions/MediumActionHandler.cs | 54 ++++++++----------- .../HandleRules/Actions/SlackActionHandler.cs | 34 +++++------- .../HandleRules/Actions/Utils/HttpHelper.cs | 45 ++++++++++++++++ .../Actions/WebhookActionHandler.cs | 46 ++++++---------- .../HandleRules/HttpClientPool.cs | 25 --------- .../Contents/ContentVersionLoaderTests.cs | 1 - 7 files changed, 113 insertions(+), 135 deletions(-) create mode 100644 src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/Utils/HttpHelper.cs delete mode 100644 src/Squidex.Domain.Apps.Core.Operations/HandleRules/HttpClientPool.cs diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/FastlyActionHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/FastlyActionHandler.cs index 55bc26a8d..07ed03cf4 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/FastlyActionHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/FastlyActionHandler.cs @@ -8,10 +8,9 @@ using System; using System.Net.Http; using System.Threading.Tasks; +using Squidex.Domain.Apps.Core.HandleRules.Actions.Utils; using Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents; using Squidex.Domain.Apps.Core.Rules.Actions; -using Squidex.Infrastructure; -using Squidex.Infrastructure.Http; #pragma warning disable SA1649 // File name must match first type name @@ -29,6 +28,19 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions { private const string Description = "Purge key in fastly"; + private readonly ClientPool clients; + + public FastlyActionHandler() + { + clients = new ClientPool(key => + { + return new HttpClient + { + Timeout = TimeSpan.FromSeconds(2) + }; + }); + } + protected override (string Description, FastlyJob Data) CreateJob(EnrichedEvent @event, FastlyAction action) { var ruleJob = new FastlyJob @@ -43,32 +55,9 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions protected override async Task<(string Dump, Exception Exception)> ExecuteJobAsync(FastlyJob job) { - if (string.IsNullOrWhiteSpace(job.Key)) - { - return (null, new InvalidOperationException("The action cannot handle this event.")); - } - - var request = BuildRequest(job); - - HttpResponseMessage response = null; - - try - { - var valueWatch = ValueStopwatch.StartNew(); - - response = await HttpClientPool.GetHttpClient().SendAsync(request); - - var responseString = await response.Content.ReadAsStringAsync(); - var requestDump = DumpFormatter.BuildDump(request, response, null, responseString, TimeSpan.Zero, false); - - return (requestDump, null); - } - catch (Exception ex) - { - var requestDump = DumpFormatter.BuildDump(request, response, null, ex.ToString(), TimeSpan.Zero, false); + var httpClient = clients.GetClient(string.Empty); - return (requestDump, ex); - } + return await httpClient.OneWayRequestAsync(BuildRequest(job), null); } private static HttpRequestMessage BuildRequest(FastlyJob job) diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/MediumActionHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/MediumActionHandler.cs index 899736df2..fae881a2a 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/MediumActionHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/MediumActionHandler.cs @@ -13,6 +13,7 @@ using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using Squidex.Domain.Apps.Core.HandleRules.Actions.Utils; using Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents; using Squidex.Domain.Apps.Core.Rules.Actions; using Squidex.Infrastructure; @@ -32,12 +33,27 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions private const string Description = "Post to medium"; private readonly RuleEventFormatter formatter; + private readonly ClientPool clients; public MediumActionHandler(RuleEventFormatter formatter) { Guard.NotNull(formatter, nameof(formatter)); this.formatter = formatter; + + clients = new ClientPool(key => + { + var client = new HttpClient + { + Timeout = TimeSpan.FromSeconds(4) + }; + + client.DefaultRequestHeaders.Add("Accept", "application/json"); + client.DefaultRequestHeaders.Add("Accept-Charset", "utf-8"); + client.DefaultRequestHeaders.Add("User-Agent", "Squidex Headless CMS"); + + return client; + }); } protected override (string Description, MediumJob Data) CreateJob(EnrichedEvent @event, MediumAction action) @@ -79,6 +95,8 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions protected override async Task<(string Dump, Exception Exception)> ExecuteJobAsync(MediumJob job) { + var httpClient = clients.GetClient(string.Empty); + string id; HttpResponseMessage response = null; @@ -86,7 +104,7 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions var meRequest = BuildMeRequest(job); try { - response = await HttpClientPool.GetHttpClient().SendAsync(meRequest); + response = await httpClient.SendAsync(meRequest); var responseString = await response.Content.ReadAsStringAsync(); var responseJson = JToken.Parse(responseString); @@ -100,42 +118,16 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions return (requestDump, ex); } - var postRequestBody = job.RequestBody; - var postRequest = BuildPostRequest(job, postRequestBody, id); - - try - { - response = await HttpClientPool.GetHttpClient().SendAsync(postRequest); - - var responseString = await response.Content.ReadAsStringAsync(); - var requestDump = DumpFormatter.BuildDump(postRequest, response, postRequestBody, responseString); - - Exception ex = null; - - if (!response.IsSuccessStatusCode) - { - ex = new HttpRequestException($"Response code does not indicate success: {(int)response.StatusCode} ({response.StatusCode})."); - } - - return (requestDump, ex); - } - catch (Exception ex) - { - var requestDump = DumpFormatter.BuildDump(postRequest, response, postRequestBody, ex.ToString()); - - return (requestDump, ex); - } + return await httpClient.OneWayRequestAsync(BuildPostRequest(job, id), job.RequestBody); } - private static HttpRequestMessage BuildPostRequest(MediumJob job, string requestBody, string id) + private static HttpRequestMessage BuildPostRequest(MediumJob job, string id) { var request = new HttpRequestMessage(HttpMethod.Post, $"https://api.medium.com/v1/users/{id}/posts") { - Content = new StringContent(requestBody, Encoding.UTF8, "application/json") + Content = new StringContent(job.RequestBody, Encoding.UTF8, "application/json") }; - request.Headers.Add("Accept", "application/json"); - request.Headers.Add("Accept-Charset", "utf-8"); request.Headers.Add("Authorization", $"Bearer {job.AccessToken}"); return request; @@ -145,8 +137,6 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions { var request = new HttpRequestMessage(HttpMethod.Get, "https://api.medium.com/v1/me"); - request.Headers.Add("Accept", "application/json"); - request.Headers.Add("Accept-Charset", "utf-8"); request.Headers.Add("Authorization", $"Bearer {job.AccessToken}"); return request; diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/SlackActionHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/SlackActionHandler.cs index 4682e2fb7..e10d7f66f 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/SlackActionHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/SlackActionHandler.cs @@ -11,10 +11,10 @@ using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using Squidex.Domain.Apps.Core.HandleRules.Actions.Utils; using Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents; using Squidex.Domain.Apps.Core.Rules.Actions; using Squidex.Infrastructure; -using Squidex.Infrastructure.Http; #pragma warning disable SA1649 // File name must match first type name @@ -41,12 +41,21 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions private const string Description = "Send message to slack"; private readonly RuleEventFormatter formatter; + private readonly ClientPool clients; public SlackActionHandler(RuleEventFormatter formatter) { Guard.NotNull(formatter, nameof(formatter)); this.formatter = formatter; + + clients = new ClientPool(key => + { + return new HttpClient + { + Timeout = TimeSpan.FromSeconds(2) + }; + }); } protected override (string Description, SlackJob Data) CreateJob(EnrichedEvent @event, SlackAction action) @@ -64,28 +73,11 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions return (Description, ruleJob); } - protected override async Task<(string Dump, Exception Exception)> ExecuteJobAsync(SlackJob job) + protected override Task<(string Dump, Exception Exception)> ExecuteJobAsync(SlackJob job) { - var requestBody = job.Body; - var request = BuildRequest(job, requestBody); - - HttpResponseMessage response = null; - - try - { - response = await HttpClientPool.GetHttpClient().SendAsync(request); + var httpClient = clients.GetClient(string.Empty); - var responseString = await response.Content.ReadAsStringAsync(); - var requestDump = DumpFormatter.BuildDump(request, response, requestBody, responseString); - - return (requestDump, null); - } - catch (Exception ex) - { - var requestDump = DumpFormatter.BuildDump(request, response, requestBody, ex.ToString()); - - return (requestDump, ex); - } + return httpClient.OneWayRequestAsync(BuildRequest(job, job.Body), job.Body); } private static HttpRequestMessage BuildRequest(SlackJob job, string requestBody) diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/Utils/HttpHelper.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/Utils/HttpHelper.cs new file mode 100644 index 000000000..183f72066 --- /dev/null +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/Utils/HttpHelper.cs @@ -0,0 +1,45 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System; +using System.Net.Http; +using System.Threading.Tasks; +using Squidex.Infrastructure.Http; + +namespace Squidex.Domain.Apps.Core.HandleRules.Actions.Utils +{ + public static class HttpHelper + { + public static async Task<(string Dump, Exception Exception)> OneWayRequestAsync(this HttpClient client, HttpRequestMessage request, string requestBody = null) + { + HttpResponseMessage response = null; + try + { + response = await client.SendAsync(request); + + var responseString = await response.Content.ReadAsStringAsync(); + + var requestDump = DumpFormatter.BuildDump(request, response, requestBody, responseString); + + Exception ex = null; + + if (!response.IsSuccessStatusCode) + { + ex = new HttpRequestException($"Response code does not indicate success: {(int)response.StatusCode} ({response.StatusCode})."); + } + + return (requestDump, ex); + } + catch (Exception ex) + { + var requestDump = DumpFormatter.BuildDump(request, response, requestBody, ex.ToString()); + + return (requestDump, ex); + } + } + } +} diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/WebhookActionHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/WebhookActionHandler.cs index 47cd65ee7..ca7e9035b 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/WebhookActionHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/WebhookActionHandler.cs @@ -11,10 +11,10 @@ using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using Squidex.Domain.Apps.Core.HandleRules.Actions.Utils; using Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents; using Squidex.Domain.Apps.Core.Rules.Actions; using Squidex.Infrastructure; -using Squidex.Infrastructure.Http; #pragma warning disable SA1649 // File name must match first type name @@ -42,12 +42,25 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions public sealed class WebhookActionHandler : RuleActionHandler { private readonly RuleEventFormatter formatter; + private readonly ClientPool clients; public WebhookActionHandler(RuleEventFormatter formatter) { Guard.NotNull(formatter, nameof(formatter)); this.formatter = formatter; + + clients = new ClientPool(key => + { + var client = new HttpClient + { + Timeout = TimeSpan.FromSeconds(4) + }; + + client.DefaultRequestHeaders.Add("User-Agent", "Squidex Webhook"); + + return client; + }); } protected override (string Description, WebhookJob Data) CreateJob(EnrichedEvent @event, WebhookAction action) @@ -66,35 +79,11 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions return (ruleDescription, ruleJob); } - protected override async Task<(string Dump, Exception Exception)> ExecuteJobAsync(WebhookJob job) + protected override Task<(string Dump, Exception Exception)> ExecuteJobAsync(WebhookJob job) { - var requestBody = job.Body; - var request = BuildRequest(job, requestBody); - - HttpResponseMessage response = null; - - try - { - response = await HttpClientPool.GetHttpClient().SendAsync(request); + var httpClient = clients.GetClient(string.Empty); - var responseString = await response.Content.ReadAsStringAsync(); - var requestDump = DumpFormatter.BuildDump(request, response, requestBody, responseString); - - Exception ex = null; - - if (!response.IsSuccessStatusCode) - { - ex = new HttpRequestException($"Response code does not indicate success: {(int)response.StatusCode} ({response.StatusCode})."); - } - - return (requestDump, ex); - } - catch (Exception ex) - { - var requestDump = DumpFormatter.BuildDump(request, response, requestBody, ex.ToString()); - - return (requestDump, ex); - } + return httpClient.OneWayRequestAsync(BuildRequest(job, job.Body), job.Body); } private static HttpRequestMessage BuildRequest(WebhookJob job, string requestBody) @@ -105,7 +94,6 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions }; request.Headers.Add("X-Signature", job.RequestSignature); - request.Headers.Add("User-Agent", "Squidex Webhook"); return request; } diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/HttpClientPool.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/HttpClientPool.cs deleted file mode 100644 index 231920699..000000000 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/HttpClientPool.cs +++ /dev/null @@ -1,25 +0,0 @@ -// ========================================================================== -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex UG (haftungsbeschraenkt) -// All rights reserved. Licensed under the MIT license. -// ========================================================================== - -using System; -using System.Net.Http; - -namespace Squidex.Domain.Apps.Core.HandleRules -{ - public static class HttpClientPool - { - private static readonly ClientPool Pool = new ClientPool(key => - { - return new HttpClient { Timeout = TimeSpan.FromSeconds(2) }; - }); - - public static HttpClient GetHttpClient() - { - return Pool.GetClient(string.Empty); - } - } -} diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentVersionLoaderTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentVersionLoaderTests.cs index c35433c34..045120160 100644 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentVersionLoaderTests.cs +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentVersionLoaderTests.cs @@ -12,7 +12,6 @@ using Orleans; using Squidex.Domain.Apps.Core.Schemas; using Squidex.Infrastructure; using Squidex.Infrastructure.Orleans; -using Squidex.Infrastructure.States; using Xunit; namespace Squidex.Domain.Apps.Entities.Contents