DocSpace-client/common/ASC.Api.Core/Middleware/WebhooksMiddleware.cs

68 lines
2.0 KiB
C#
Raw Normal View History

2021-08-03 16:26:28 +00:00
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
2021-08-26 18:43:41 +00:00
using ASC.Webhooks.Core;
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-08-19 09:11:26 +00:00
public WebhooksMiddleware(RequestDelegate next, IWebhookPublisher webhookPublisher)
{
_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-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-08-19 09:11:26 +00:00
if (!methodList.Contains(method) || routePattern == null)
{
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
WebhookPublisher.Publish(eventName, responseContent);
}
}
public static class WebhooksMiddlewareExtensions
{
public static IApplicationBuilder UseWebhooksMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<WebhooksMiddleware>();
}
}
}