2021-08-03 16:26:28 +00:00
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.IO;
|
2021-07-28 10:10:14 +00:00
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
2021-08-26 18:43:41 +00:00
|
|
|
|
using ASC.Webhooks.Core;
|
2021-07-28 10:10:14 +00:00
|
|
|
|
|
|
|
|
|
using Microsoft.AspNetCore.Builder;
|
|
|
|
|
using Microsoft.AspNetCore.Http;
|
|
|
|
|
using Microsoft.AspNetCore.Routing;
|
|
|
|
|
|
|
|
|
|
namespace ASC.Api.Core.Middleware
|
|
|
|
|
{
|
|
|
|
|
public class WebhooksMiddleware
|
|
|
|
|
{
|
|
|
|
|
private readonly RequestDelegate _next;
|
2021-08-19 09:11:26 +00:00
|
|
|
|
private IWebhookPublisher WebhookPublisher { get; }
|
2021-07-28 10:10:14 +00:00
|
|
|
|
|
2021-08-19 09:11:26 +00:00
|
|
|
|
public WebhooksMiddleware(RequestDelegate next, IWebhookPublisher webhookPublisher)
|
2021-07-28 10:10:14 +00:00
|
|
|
|
{
|
|
|
|
|
_next = next;
|
|
|
|
|
WebhookPublisher = webhookPublisher;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task InvokeAsync(HttpContext context)
|
|
|
|
|
{
|
2021-08-03 16:26:28 +00:00
|
|
|
|
var methodList = new List<string> { "POST", "UPDATE", "DELETE" };
|
2021-07-28 10:10:14 +00:00
|
|
|
|
|
2021-08-03 16:26:28 +00:00
|
|
|
|
var method = context.Request.Method;
|
|
|
|
|
var endpoint = (RouteEndpoint)context.GetEndpoint();
|
2021-08-19 09:11:26 +00:00
|
|
|
|
var routePattern = endpoint?.RoutePattern.RawText;
|
2021-07-28 10:10:14 +00:00
|
|
|
|
|
2021-08-19 09:11:26 +00:00
|
|
|
|
if (!methodList.Contains(method) || routePattern == null)
|
2021-07-28 10:10:14 +00:00
|
|
|
|
{
|
|
|
|
|
await _next(context);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
string responseContent;
|
|
|
|
|
var originalResponseBody = context.Response.Body;
|
|
|
|
|
using (var ms = new MemoryStream())
|
|
|
|
|
{
|
|
|
|
|
context.Response.Body = ms;
|
|
|
|
|
await _next(context);
|
|
|
|
|
|
|
|
|
|
ms.Position = 0;
|
|
|
|
|
var responseReader = new StreamReader(ms);
|
|
|
|
|
|
|
|
|
|
responseContent = responseReader.ReadToEnd();
|
|
|
|
|
|
|
|
|
|
ms.Position = 0;
|
|
|
|
|
await ms.CopyToAsync(originalResponseBody);
|
|
|
|
|
context.Response.Body = originalResponseBody;
|
|
|
|
|
}
|
2021-08-19 09:11:26 +00:00
|
|
|
|
var eventName = $"method: {method}, route: {routePattern}";
|
2021-08-03 16:26:28 +00:00
|
|
|
|
|
2021-07-28 10:10:14 +00:00
|
|
|
|
WebhookPublisher.Publish(eventName, responseContent);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static class WebhooksMiddlewareExtensions
|
|
|
|
|
{
|
|
|
|
|
public static IApplicationBuilder UseWebhooksMiddleware(this IApplicationBuilder builder)
|
|
|
|
|
{
|
|
|
|
|
return builder.UseMiddleware<WebhooksMiddleware>();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|