38 lines
1.3 KiB
C#
38 lines
1.3 KiB
C#
using System;
|
|
using System.Threading.Tasks;
|
|
using Tapeti.Config;
|
|
using Tapeti.Helpers;
|
|
|
|
namespace Tapeti.Default
|
|
{
|
|
/// <inheritdoc cref="IControllerMessageMiddleware"/> />
|
|
/// <summary>
|
|
/// Handles methods marked with the ResponseHandler attribute.
|
|
/// </summary>
|
|
internal class ResponseFilterMiddleware : IControllerFilterMiddleware//, IControllerMessageMiddleware
|
|
{
|
|
internal const string CorrelationIdRequestPrefix = "request|";
|
|
|
|
|
|
public async ValueTask Filter(IMessageContext context, Func<ValueTask> next)
|
|
{
|
|
if (!context.TryGet<ControllerMessageContextPayload>(out var controllerPayload))
|
|
return;
|
|
|
|
// If no CorrelationId is present, this could be a request-response in flight from a previous version of
|
|
// Tapeti so we should not filter the response handler.
|
|
if (!string.IsNullOrEmpty(context.Properties.CorrelationId))
|
|
{
|
|
if (!context.Properties.CorrelationId.StartsWith(CorrelationIdRequestPrefix))
|
|
return;
|
|
|
|
var methodName = context.Properties.CorrelationId[CorrelationIdRequestPrefix.Length..];
|
|
if (methodName != MethodSerializer.Serialize(controllerPayload.Binding.Method))
|
|
return;
|
|
}
|
|
|
|
await next();
|
|
}
|
|
}
|
|
}
|