mirror of
				https://github.com/nsnail/Ocelot.git
				synced 2025-11-04 12:10:50 +08:00 
			
		
		
		
	Feature/re route specific handlers (#269)
* #264 added handlers to config * #264 added global handlers object and defaut param for method, not sure this is correct api for users yet * #264 Can now add all sorts of delegating handlers in all sorts of ways * +semver: breaking #264
This commit is contained in:
		@@ -19,18 +19,179 @@ namespace Ocelot.UnitTests.Requester
 | 
			
		||||
    public class DelegatingHandlerHandlerProviderFactoryTests
 | 
			
		||||
    {
 | 
			
		||||
        private DelegatingHandlerHandlerFactory _factory;
 | 
			
		||||
        private Mock<IOcelotLoggerFactory> _loggerFactory;
 | 
			
		||||
        private readonly Mock<IOcelotLoggerFactory> _loggerFactory;
 | 
			
		||||
        private DownstreamReRoute _request;
 | 
			
		||||
        private Response<List<Func<DelegatingHandler>>> _provider;
 | 
			
		||||
        private Response<List<Func<DelegatingHandler>>> _result;
 | 
			
		||||
        private readonly Mock<IQosProviderHouse> _qosProviderHouse;
 | 
			
		||||
        private readonly Mock<ITracingHandlerFactory> _tracingFactory;
 | 
			
		||||
        private IServiceProvider _serviceProvider;
 | 
			
		||||
        private readonly IServiceCollection _services;
 | 
			
		||||
 | 
			
		||||
        public DelegatingHandlerHandlerProviderFactoryTests()
 | 
			
		||||
        {
 | 
			
		||||
            _tracingFactory = new Mock<ITracingHandlerFactory>();
 | 
			
		||||
            _qosProviderHouse = new Mock<IQosProviderHouse>();
 | 
			
		||||
            _loggerFactory = new Mock<IOcelotLoggerFactory>();
 | 
			
		||||
            _services = new ServiceCollection();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_follow_ordering_add_specifics()
 | 
			
		||||
        {
 | 
			
		||||
            var reRoute = new DownstreamReRouteBuilder().WithIsQos(true)
 | 
			
		||||
                .WithHttpHandlerOptions(new HttpHandlerOptions(true, true, true))
 | 
			
		||||
                .WithDelegatingHandlers(new List<string>
 | 
			
		||||
                {
 | 
			
		||||
                    "FakeDelegatingHandler",
 | 
			
		||||
                    "FakeDelegatingHandlerTwo"
 | 
			
		||||
                })
 | 
			
		||||
                .WithReRouteKey("")
 | 
			
		||||
                .Build();
 | 
			
		||||
 | 
			
		||||
            this.Given(x => GivenTheFollowingRequest(reRoute))
 | 
			
		||||
                .And(x => GivenTheTracingFactoryReturns())
 | 
			
		||||
                .And(x => GivenTheQosProviderHouseReturns(new OkResponse<IQoSProvider>(It.IsAny<PollyQoSProvider>())))
 | 
			
		||||
                .And(x => GivenTheServiceProviderReturnsGlobalDelegatingHandlers<FakeDelegatingHandlerThree, FakeDelegatingHandlerFour>())
 | 
			
		||||
                .And(x => GivenTheServiceProviderReturnsSpecificDelegatingHandlers<FakeDelegatingHandler, FakeDelegatingHandlerTwo>())
 | 
			
		||||
                .When(x => WhenIGet())
 | 
			
		||||
                .Then(x => ThenThereIsDelegatesInProvider(6))
 | 
			
		||||
                .And(x => ThenHandlerAtPositionIs<FakeDelegatingHandlerThree>(0))
 | 
			
		||||
                .And(x => ThenHandlerAtPositionIs<FakeDelegatingHandlerFour>(1))
 | 
			
		||||
                .And(x => ThenHandlerAtPositionIs<FakeDelegatingHandler>(2))
 | 
			
		||||
                .And(x => ThenHandlerAtPositionIs<FakeDelegatingHandlerTwo>(3))
 | 
			
		||||
                .And(x => ThenHandlerAtPositionIs<FakeTracingHandler>(4))
 | 
			
		||||
                .And(x => ThenHandlerAtPositionIs<PollyCircuitBreakingDelegatingHandler>(5))
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_follow_ordering_order_specifics_and_globals()
 | 
			
		||||
        {
 | 
			
		||||
            var reRoute = new DownstreamReRouteBuilder().WithIsQos(true)
 | 
			
		||||
                .WithHttpHandlerOptions(new HttpHandlerOptions(true, true, true))
 | 
			
		||||
                .WithDelegatingHandlers(new List<string>
 | 
			
		||||
                {
 | 
			
		||||
                    "FakeDelegatingHandlerTwo",
 | 
			
		||||
                    "FakeDelegatingHandler",
 | 
			
		||||
                    "FakeDelegatingHandlerFour"
 | 
			
		||||
                })
 | 
			
		||||
                .WithReRouteKey("")
 | 
			
		||||
                .Build();
 | 
			
		||||
 | 
			
		||||
            this.Given(x => GivenTheFollowingRequest(reRoute))
 | 
			
		||||
                .And(x => GivenTheTracingFactoryReturns())
 | 
			
		||||
                .And(x => GivenTheQosProviderHouseReturns(new OkResponse<IQoSProvider>(It.IsAny<PollyQoSProvider>())))
 | 
			
		||||
                .And(x => GivenTheServiceProviderReturnsGlobalDelegatingHandlers<FakeDelegatingHandlerFour, FakeDelegatingHandlerThree>())
 | 
			
		||||
                .And(x => GivenTheServiceProviderReturnsSpecificDelegatingHandlers<FakeDelegatingHandler, FakeDelegatingHandlerTwo>())
 | 
			
		||||
                .When(x => WhenIGet())
 | 
			
		||||
                .Then(x => ThenThereIsDelegatesInProvider(6))
 | 
			
		||||
                .And(x => ThenHandlerAtPositionIs<FakeDelegatingHandlerThree>(0)) //first because global not in config
 | 
			
		||||
                .And(x => ThenHandlerAtPositionIs<FakeDelegatingHandlerTwo>(1)) //first from config
 | 
			
		||||
                .And(x => ThenHandlerAtPositionIs<FakeDelegatingHandler>(2)) //second from config
 | 
			
		||||
                .And(x => ThenHandlerAtPositionIs<FakeDelegatingHandlerFour>(3)) //third from config (global)
 | 
			
		||||
                .And(x => ThenHandlerAtPositionIs<FakeTracingHandler>(4))
 | 
			
		||||
                .And(x => ThenHandlerAtPositionIs<PollyCircuitBreakingDelegatingHandler>(5))
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_follow_ordering_order_specifics()
 | 
			
		||||
        {
 | 
			
		||||
            var reRoute = new DownstreamReRouteBuilder().WithIsQos(true)
 | 
			
		||||
                .WithHttpHandlerOptions(new HttpHandlerOptions(true, true, true))
 | 
			
		||||
                .WithDelegatingHandlers(new List<string>
 | 
			
		||||
                {
 | 
			
		||||
                    "FakeDelegatingHandlerTwo",
 | 
			
		||||
                    "FakeDelegatingHandler"
 | 
			
		||||
                })
 | 
			
		||||
                .WithReRouteKey("")
 | 
			
		||||
                .Build();
 | 
			
		||||
 | 
			
		||||
            this.Given(x => GivenTheFollowingRequest(reRoute))
 | 
			
		||||
                .And(x => GivenTheTracingFactoryReturns())
 | 
			
		||||
                .And(x => GivenTheQosProviderHouseReturns(new OkResponse<IQoSProvider>(It.IsAny<PollyQoSProvider>())))
 | 
			
		||||
                .And(x => GivenTheServiceProviderReturnsGlobalDelegatingHandlers<FakeDelegatingHandlerThree, FakeDelegatingHandlerFour>())
 | 
			
		||||
                .And(x => GivenTheServiceProviderReturnsSpecificDelegatingHandlers<FakeDelegatingHandler, FakeDelegatingHandlerTwo>())
 | 
			
		||||
                .When(x => WhenIGet())
 | 
			
		||||
                .Then(x => ThenThereIsDelegatesInProvider(6))
 | 
			
		||||
                .And(x => ThenHandlerAtPositionIs<FakeDelegatingHandlerThree>(0))
 | 
			
		||||
                .And(x => ThenHandlerAtPositionIs<FakeDelegatingHandlerFour>(1))
 | 
			
		||||
                .And(x => ThenHandlerAtPositionIs<FakeDelegatingHandlerTwo>(2))
 | 
			
		||||
                .And(x => ThenHandlerAtPositionIs<FakeDelegatingHandler>(3))
 | 
			
		||||
                .And(x => ThenHandlerAtPositionIs<FakeTracingHandler>(4))
 | 
			
		||||
                .And(x => ThenHandlerAtPositionIs<PollyCircuitBreakingDelegatingHandler>(5))
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_follow_ordering_order_and_only_add_specifics_in_config()
 | 
			
		||||
        {
 | 
			
		||||
            var reRoute = new DownstreamReRouteBuilder().WithIsQos(true)
 | 
			
		||||
                .WithHttpHandlerOptions(new HttpHandlerOptions(true, true, true))
 | 
			
		||||
                .WithDelegatingHandlers(new List<string>
 | 
			
		||||
                {
 | 
			
		||||
                    "FakeDelegatingHandler",
 | 
			
		||||
                })
 | 
			
		||||
                .WithReRouteKey("")
 | 
			
		||||
                .Build();
 | 
			
		||||
 | 
			
		||||
            this.Given(x => GivenTheFollowingRequest(reRoute))
 | 
			
		||||
                .And(x => GivenTheTracingFactoryReturns())
 | 
			
		||||
                .And(x => GivenTheQosProviderHouseReturns(new OkResponse<IQoSProvider>(It.IsAny<PollyQoSProvider>())))
 | 
			
		||||
                .And(x => GivenTheServiceProviderReturnsGlobalDelegatingHandlers<FakeDelegatingHandlerThree, FakeDelegatingHandlerFour>())
 | 
			
		||||
                .And(x => GivenTheServiceProviderReturnsSpecificDelegatingHandlers<FakeDelegatingHandler, FakeDelegatingHandlerTwo>())
 | 
			
		||||
                .When(x => WhenIGet())
 | 
			
		||||
                .Then(x => ThenThereIsDelegatesInProvider(5))
 | 
			
		||||
                .And(x => ThenHandlerAtPositionIs<FakeDelegatingHandlerThree>(0))
 | 
			
		||||
                .And(x => ThenHandlerAtPositionIs<FakeDelegatingHandlerFour>(1))
 | 
			
		||||
                .And(x => ThenHandlerAtPositionIs<FakeDelegatingHandler>(2))
 | 
			
		||||
                .And(x => ThenHandlerAtPositionIs<FakeTracingHandler>(3))
 | 
			
		||||
                .And(x => ThenHandlerAtPositionIs<PollyCircuitBreakingDelegatingHandler>(4))
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_follow_ordering_dont_add_specifics()
 | 
			
		||||
        {
 | 
			
		||||
            var reRoute = new DownstreamReRouteBuilder().WithIsQos(true)
 | 
			
		||||
                .WithHttpHandlerOptions(new HttpHandlerOptions(true, true, true))
 | 
			
		||||
                .WithReRouteKey("")
 | 
			
		||||
                .Build();
 | 
			
		||||
 | 
			
		||||
            this.Given(x => GivenTheFollowingRequest(reRoute))
 | 
			
		||||
                .And(x => GivenTheTracingFactoryReturns())
 | 
			
		||||
                .And(x => GivenTheQosProviderHouseReturns(new OkResponse<IQoSProvider>(It.IsAny<PollyQoSProvider>())))
 | 
			
		||||
                .And(x => GivenTheServiceProviderReturnsGlobalDelegatingHandlers<FakeDelegatingHandler, FakeDelegatingHandlerTwo>())
 | 
			
		||||
                .And(x => GivenTheServiceProviderReturnsSpecificDelegatingHandlers<FakeDelegatingHandler, FakeDelegatingHandlerTwo>())
 | 
			
		||||
                .When(x => WhenIGet())
 | 
			
		||||
                .Then(x => ThenThereIsDelegatesInProvider(4))
 | 
			
		||||
                .And(x => ThenHandlerAtPositionIs<FakeDelegatingHandler>(0))
 | 
			
		||||
                .And(x => ThenHandlerAtPositionIs<FakeDelegatingHandlerTwo>(1))
 | 
			
		||||
                .And(x => ThenHandlerAtPositionIs<FakeTracingHandler>(2))
 | 
			
		||||
                .And(x => ThenHandlerAtPositionIs<PollyCircuitBreakingDelegatingHandler>(3))
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_apply_re_route_specific()
 | 
			
		||||
        {
 | 
			
		||||
            var reRoute = new DownstreamReRouteBuilder()
 | 
			
		||||
                .WithHttpHandlerOptions(new HttpHandlerOptions(true, true, false))
 | 
			
		||||
                .WithDelegatingHandlers(new List<string>
 | 
			
		||||
                {
 | 
			
		||||
                    "FakeDelegatingHandler",
 | 
			
		||||
                    "FakeDelegatingHandlerTwo"
 | 
			
		||||
                })
 | 
			
		||||
                .WithReRouteKey("")
 | 
			
		||||
                .Build();
 | 
			
		||||
 | 
			
		||||
            this.Given(x => GivenTheFollowingRequest(reRoute))
 | 
			
		||||
                .And(x => GivenTheQosProviderHouseReturns(new OkResponse<IQoSProvider>(It.IsAny<PollyQoSProvider>())))
 | 
			
		||||
                .And(x => GivenTheServiceProviderReturnsSpecificDelegatingHandlers<FakeDelegatingHandler, FakeDelegatingHandlerTwo>())
 | 
			
		||||
                .When(x => WhenIGet())
 | 
			
		||||
                .Then(x => ThenThereIsDelegatesInProvider(2))
 | 
			
		||||
                .And(x => ThenTheDelegatesAreAddedCorrectly())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
@@ -41,7 +202,7 @@ namespace Ocelot.UnitTests.Requester
 | 
			
		||||
 | 
			
		||||
            this.Given(x => GivenTheFollowingRequest(reRoute))
 | 
			
		||||
                .And(x => GivenTheQosProviderHouseReturns(new OkResponse<IQoSProvider>(It.IsAny<PollyQoSProvider>())))
 | 
			
		||||
                .And(x => GivenTheServiceProviderReturns<FakeDelegatingHandler, FakeDelegatingHandlerTwo>())
 | 
			
		||||
                .And(x => GivenTheServiceProviderReturnsGlobalDelegatingHandlers<FakeDelegatingHandler, FakeDelegatingHandlerTwo>())
 | 
			
		||||
                .When(x => WhenIGet())
 | 
			
		||||
                .Then(x => ThenThereIsDelegatesInProvider(3))
 | 
			
		||||
                .And(x => ThenTheDelegatesAreAddedCorrectly())
 | 
			
		||||
@@ -91,30 +252,58 @@ namespace Ocelot.UnitTests.Requester
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void GivenTheServiceProviderReturns<TOne, TTwo>() 
 | 
			
		||||
        private void ThenHandlerAtPositionIs<T>(int pos)
 | 
			
		||||
            where T : DelegatingHandler
 | 
			
		||||
        {
 | 
			
		||||
            var delegates = _result.Data;
 | 
			
		||||
            var del = delegates[pos].Invoke();
 | 
			
		||||
            del.ShouldBeOfType<T>();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void GivenTheTracingFactoryReturns()
 | 
			
		||||
        {
 | 
			
		||||
            _tracingFactory
 | 
			
		||||
                .Setup(x => x.Get())
 | 
			
		||||
                .Returns(new FakeTracingHandler());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void GivenTheServiceProviderReturnsGlobalDelegatingHandlers<TOne, TTwo>() 
 | 
			
		||||
            where TOne : DelegatingHandler
 | 
			
		||||
            where TTwo : DelegatingHandler
 | 
			
		||||
        {
 | 
			
		||||
            IServiceCollection services = new ServiceCollection();
 | 
			
		||||
            services.AddSingleton<DelegatingHandler, TOne>();
 | 
			
		||||
            services.AddSingleton<DelegatingHandler, TTwo>();
 | 
			
		||||
            _serviceProvider = services.BuildServiceProvider();
 | 
			
		||||
            _services.AddTransient<TOne>();
 | 
			
		||||
            _services.AddTransient<GlobalDelegatingHandler>(s => {
 | 
			
		||||
                var service = s.GetService<TOne>();
 | 
			
		||||
                return new GlobalDelegatingHandler(service);
 | 
			
		||||
            });
 | 
			
		||||
            _services.AddTransient<TTwo>();
 | 
			
		||||
            _services.AddTransient<GlobalDelegatingHandler>(s => {
 | 
			
		||||
                var service = s.GetService<TTwo>();
 | 
			
		||||
                return new GlobalDelegatingHandler(service);
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
         private void GivenTheServiceProviderReturnsNothing()
 | 
			
		||||
        private void GivenTheServiceProviderReturnsSpecificDelegatingHandlers<TOne, TTwo>()
 | 
			
		||||
            where TOne : DelegatingHandler
 | 
			
		||||
            where TTwo : DelegatingHandler
 | 
			
		||||
        {
 | 
			
		||||
            IServiceCollection services = new ServiceCollection();
 | 
			
		||||
            _serviceProvider = services.BuildServiceProvider();
 | 
			
		||||
            _services.AddTransient<DelegatingHandler, TOne>();
 | 
			
		||||
            _services.AddTransient<DelegatingHandler, TTwo>();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void GivenTheServiceProviderReturnsNothing()
 | 
			
		||||
        {
 | 
			
		||||
            _serviceProvider = _services.BuildServiceProvider();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenAnErrorIsReturned()
 | 
			
		||||
        {
 | 
			
		||||
            _provider.IsError.ShouldBeTrue();
 | 
			
		||||
            _result.IsError.ShouldBeTrue();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheDelegatesAreAddedCorrectly()
 | 
			
		||||
        {
 | 
			
		||||
            var delegates = _provider.Data;
 | 
			
		||||
            var delegates = _result.Data;
 | 
			
		||||
 | 
			
		||||
            var del = delegates[0].Invoke();
 | 
			
		||||
            var handler = (FakeDelegatingHandler) del;
 | 
			
		||||
@@ -134,15 +323,15 @@ namespace Ocelot.UnitTests.Requester
 | 
			
		||||
 | 
			
		||||
        private void ThenItIsPolly(int i)
 | 
			
		||||
        {
 | 
			
		||||
            var delegates = _provider.Data;
 | 
			
		||||
            var delegates = _result.Data;
 | 
			
		||||
            var del = delegates[i].Invoke();
 | 
			
		||||
            del.ShouldBeOfType<PollyCircuitBreakingDelegatingHandler>();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenThereIsDelegatesInProvider(int count)
 | 
			
		||||
        {
 | 
			
		||||
            _provider.ShouldNotBeNull();
 | 
			
		||||
            _provider.Data.Count.ShouldBe(count);
 | 
			
		||||
            _result.ShouldNotBeNull();
 | 
			
		||||
            _result.Data.Count.ShouldBe(count);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void GivenTheFollowingRequest(DownstreamReRoute request)
 | 
			
		||||
@@ -152,14 +341,19 @@ namespace Ocelot.UnitTests.Requester
 | 
			
		||||
 | 
			
		||||
        private void WhenIGet()
 | 
			
		||||
        {
 | 
			
		||||
            _serviceProvider = _services.BuildServiceProvider();
 | 
			
		||||
            _factory = new DelegatingHandlerHandlerFactory(_loggerFactory.Object, _tracingFactory.Object, _qosProviderHouse.Object, _serviceProvider);
 | 
			
		||||
            _provider = _factory.Get(_request);
 | 
			
		||||
            _result = _factory.Get(_request);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenNoDelegatesAreInTheProvider()
 | 
			
		||||
        {
 | 
			
		||||
            _provider.ShouldNotBeNull();
 | 
			
		||||
            _provider.Data.Count.ShouldBe(0);
 | 
			
		||||
            _result.ShouldNotBeNull();
 | 
			
		||||
            _result.Data.Count.ShouldBe(0);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    internal class FakeTracingHandler : DelegatingHandler, ITracingHandler
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -28,6 +28,42 @@ namespace Ocelot.UnitTests.Requester
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class FakeDelegatingHandlerThree : DelegatingHandler
 | 
			
		||||
    {
 | 
			
		||||
        public FakeDelegatingHandlerThree()
 | 
			
		||||
        {
 | 
			
		||||
            Order = 3;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public int Order { get; private set; }
 | 
			
		||||
 | 
			
		||||
        public DateTime TimeCalled { get; private set; }
 | 
			
		||||
 | 
			
		||||
        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
 | 
			
		||||
        {
 | 
			
		||||
            TimeCalled = DateTime.Now;
 | 
			
		||||
            return Task.FromResult(new HttpResponseMessage());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class FakeDelegatingHandlerFour : DelegatingHandler
 | 
			
		||||
    {
 | 
			
		||||
        public FakeDelegatingHandlerFour()
 | 
			
		||||
        {
 | 
			
		||||
            Order = 4;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public int Order { get; private set; }
 | 
			
		||||
 | 
			
		||||
        public DateTime TimeCalled { get; private set; }
 | 
			
		||||
 | 
			
		||||
        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
 | 
			
		||||
        {
 | 
			
		||||
            TimeCalled = DateTime.Now;
 | 
			
		||||
            return Task.FromResult(new HttpResponseMessage());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class FakeDelegatingHandlerTwo : DelegatingHandler
 | 
			
		||||
    {
 | 
			
		||||
        public FakeDelegatingHandlerTwo()
 | 
			
		||||
@@ -36,12 +72,13 @@ namespace Ocelot.UnitTests.Requester
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public int Order {get;private set;}
 | 
			
		||||
 | 
			
		||||
        public DateTime TimeCalled {get;private set;}
 | 
			
		||||
 | 
			
		||||
        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
 | 
			
		||||
        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
 | 
			
		||||
        {
 | 
			
		||||
            TimeCalled = DateTime.Now;
 | 
			
		||||
            return new HttpResponseMessage();
 | 
			
		||||
            return Task.FromResult(new HttpResponseMessage());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user