public void AffinitizeRequest_AffinityDisabled_DoNothing()
        {
            var dataProtector = GetDataProtector();
            var provider      = new ProviderStub(dataProtector.Object, AffinityTestHelper.GetLogger <BaseSessionAffinityPolicy <string> >().Object);

            Assert.Throws <InvalidOperationException>(() => provider.AffinitizeResponse(new DefaultHttpContext(), new ClusterState("cluster"), new SessionAffinityConfig(), new DestinationState("id")));
        }
        public void AffinitizeRequest_RequestIsAffinitized_DoNothing()
        {
            var dataProtector = GetDataProtector();
            var provider      = new ProviderStub(dataProtector.Object, AffinityTestHelper.GetLogger <BaseSessionAffinityPolicy <string> >().Object);
            var context       = new DefaultHttpContext();

            provider.DirectlySetExtractedKeyOnContext(context, "ExtractedKey");
            provider.AffinitizeResponse(context, new ClusterState("cluster"), _defaultOptions, new DestinationState("id"));
            Assert.Null(provider.LastSetEncryptedKey);
            dataProtector.Verify(p => p.Protect(It.IsAny <byte[]>()), Times.Never);
        }
        public void AffinitizeRequest_RequestIsNotAffinitized_SetAffinityKey()
        {
            var dataProtector = GetDataProtector();
            var provider      = new ProviderStub(dataProtector.Object, AffinityTestHelper.GetLogger <BaseSessionAffinityPolicy <string> >().Object);
            var destination   = new DestinationState("dest-A");

            provider.AffinitizeResponse(new DefaultHttpContext(), new ClusterState("cluster"), _defaultOptions, destination);
            Assert.Equal("ZGVzdC1B", provider.LastSetEncryptedKey);
            var keyBytes = Encoding.UTF8.GetBytes(destination.DestinationId);

            dataProtector.Verify(p => p.Protect(It.Is <byte[]>(b => b.SequenceEqual(keyBytes))), Times.Once);
        }
        public void AffinitizeRequest_CookieConfigSpecified_UseIt()
        {
            var policy = new CookieSessionAffinityPolicy(
                AffinityTestHelper.GetDataProtector().Object,
                new ManualClock(),
                AffinityTestHelper.GetLogger <CookieSessionAffinityPolicy>().Object);
            var context = new DefaultHttpContext();

            policy.AffinitizeResponse(context, new ClusterState("cluster"), _config, _destinations[1]);

            var affinityCookieHeader = context.Response.Headers["Set-Cookie"];

            Assert.Equal("My.Affinity=ZGVzdC1C; max-age=3600; domain=mydomain.my; path=/some; secure; samesite=lax", affinityCookieHeader);
        }
        public void FindAffinitizedDestination_AffinityDisabledOnCluster_ReturnsAffinityDisabled()
        {
            var provider = new ProviderStub(GetDataProtector().Object, AffinityTestHelper.GetLogger <BaseSessionAffinityPolicy <string> >().Object);
            var options  = new SessionAffinityConfig
            {
                Enabled         = false,
                Policy          = _defaultOptions.Policy,
                FailurePolicy   = _defaultOptions.FailurePolicy,
                AffinityKeyName = _defaultOptions.AffinityKeyName
            };
            var cluster = new ClusterState("cluster");

            Assert.Throws <InvalidOperationException>(() => provider.FindAffinitizedDestinations(new DefaultHttpContext(), cluster, options, new[] { new DestinationState("1") }));
        }
        public void FindAffinitizedDestination_AffinityKeyIsSetOnRequest_Success()
        {
            var policy = new CookieSessionAffinityPolicy(
                AffinityTestHelper.GetDataProtector().Object,
                new ManualClock(),
                AffinityTestHelper.GetLogger <CookieSessionAffinityPolicy>().Object);
            var context = new DefaultHttpContext();
            var affinitizedDestination = _destinations[1];

            context.Request.Headers["Cookie"] = GetCookieWithAffinity(affinitizedDestination);
            var cluster = new ClusterState("cluster");

            var affinityResult = policy.FindAffinitizedDestinations(context, cluster, _config, _destinations);

            Assert.Equal(AffinityStatus.OK, affinityResult.Status);
            Assert.Equal(1, affinityResult.Destinations.Count);
            Assert.Same(affinitizedDestination, affinityResult.Destinations[0]);
        }
        public void FindAffinitizedDestination_AffinityKeyIsNotSetOnRequest_ReturnKeyNotSet()
        {
            var policy = new CookieSessionAffinityPolicy(
                AffinityTestHelper.GetDataProtector().Object,
                new ManualClock(),
                AffinityTestHelper.GetLogger <CookieSessionAffinityPolicy>().Object);

            Assert.Equal(SessionAffinityConstants.Policies.Cookie, policy.Name);

            var context = new DefaultHttpContext();

            context.Request.Headers["Cookie"] = new[] { $"Some-Cookie=ZZZ" };
            var cluster = new ClusterState("cluster");

            var affinityResult = policy.FindAffinitizedDestinations(context, cluster, _config, _destinations);

            Assert.Equal(AffinityStatus.AffinityKeyNotSet, affinityResult.Status);
            Assert.Null(affinityResult.Destinations);
        }
        public void AffinitizedRequest_AffinityKeyIsExtracted_DoNothing()
        {
            var policy = new CookieSessionAffinityPolicy(
                AffinityTestHelper.GetDataProtector().Object,
                new ManualClock(),
                AffinityTestHelper.GetLogger <CookieSessionAffinityPolicy>().Object);
            var context = new DefaultHttpContext();
            var affinitizedDestination = _destinations[0];

            context.Request.Headers["Cookie"] = GetCookieWithAffinity(affinitizedDestination);
            var cluster = new ClusterState("cluster");

            var affinityResult = policy.FindAffinitizedDestinations(context, cluster, _config, _destinations);

            Assert.Equal(AffinityStatus.OK, affinityResult.Status);

            policy.AffinitizeResponse(context, cluster, _config, affinitizedDestination);

            Assert.False(context.Response.Headers.ContainsKey("Cookie"));
        }
        public void Request_FindAffinitizedDestinations(
            HttpContext context,
            DestinationState[] allDestinations,
            AffinityStatus expectedStatus,
            DestinationState expectedDestination,
            byte[] expectedEncryptedKey,
            bool unprotectCalled,
            LogLevel?expectedLogLevel,
            EventId expectedEventId)
        {
            var dataProtector  = GetDataProtector();
            var logger         = AffinityTestHelper.GetLogger <BaseSessionAffinityPolicy <string> >();
            var provider       = new ProviderStub(dataProtector.Object, logger.Object);
            var cluster        = new ClusterState("cluster");
            var affinityResult = provider.FindAffinitizedDestinations(context, cluster, _defaultOptions, allDestinations);

            if (unprotectCalled)
            {
                dataProtector.Verify(p => p.Unprotect(It.Is <byte[]>(b => b.SequenceEqual(expectedEncryptedKey))), Times.Once);
            }

            Assert.Equal(expectedStatus, affinityResult.Status);
            Assert.Same(expectedDestination, affinityResult.Destinations?.FirstOrDefault());

            if (expectedLogLevel != null)
            {
                logger.Verify(
                    l => l.Log(expectedLogLevel.Value, expectedEventId, It.IsAny <It.IsAnyType>(), It.IsAny <Exception>(), (Func <It.IsAnyType, Exception, string>)It.IsAny <object>()),
                    Times.Once);
            }

            if (expectedDestination != null)
            {
                Assert.Equal(1, affinityResult.Destinations.Count);
            }
            else
            {
                Assert.Null(affinityResult.Destinations);
            }
        }
        public async Task Invoke_ErrorFlow_CallFailurePolicy(AffinityStatus affinityStatus, bool keepProcessing)
        {
            var          cluster         = GetCluster();
            var          endpoint        = GetEndpoint(cluster);
            var          policies        = RegisterAffinityPolicies(true, cluster.Destinations.Values.ToList(), ("Policy-B", affinityStatus, null, _ => { }));
            var          invokedPolicy   = string.Empty;
            const string expectedPolicy  = "Policy-1";
            var          failurePolicies = RegisterFailurePolicies(
                affinityStatus,
                ("Policy-0", false, p => throw new InvalidOperationException($"Policy {p.Name} call is not expected.")),
                (expectedPolicy, keepProcessing, p => invokedPolicy = p.Name));
            var nextInvoked = false;
            var logger      = AffinityTestHelper.GetLogger <SessionAffinityMiddleware>();
            var middleware  = new SessionAffinityMiddleware(c => {
                nextInvoked = true;
                return(Task.CompletedTask);
            },
                                                            policies.Select(p => p.Object), failurePolicies.Select(p => p.Object),
                                                            logger.Object);
            var context            = new DefaultHttpContext();
            var destinationFeature = GetReverseProxyFeature(cluster);

            context.SetEndpoint(endpoint);
            context.Features.Set(destinationFeature);

            await middleware.Invoke(context);

            Assert.Equal(expectedPolicy, invokedPolicy);
            Assert.Equal(keepProcessing, nextInvoked);
            failurePolicies[0].VerifyGet(p => p.Name, Times.Once);
            failurePolicies[0].VerifyNoOtherCalls();
            failurePolicies[1].VerifyAll();
            if (!keepProcessing)
            {
                logger.Verify(
                    l => l.Log(LogLevel.Warning, EventIds.AffinityResolutionFailedForCluster, It.IsAny <It.IsAnyType>(), null, (Func <It.IsAnyType, Exception, string>)It.IsAny <object>()),
                    Times.Once);
            }
        }
示例#11
0
        public void AffinitizedRequest_AffinityKeyIsExtracted_DoNothing()
        {
            var policy  = new CustomHeaderSessionAffinityPolicy(AffinityTestHelper.GetDataProtector().Object, AffinityTestHelper.GetLogger <CustomHeaderSessionAffinityPolicy>().Object);
            var context = new DefaultHttpContext();

            context.Request.Headers["SomeHeader"] = new[] { "SomeValue" };
            var affinitizedDestination = _destinations[1];

            context.Request.Headers[AffinityHeaderName] = new[] { affinitizedDestination.DestinationId.ToUTF8BytesInBase64() };
            var cluster = new ClusterState("cluster");

            var affinityResult = policy.FindAffinitizedDestinations(context, cluster, _defaultOptions, _destinations);

            Assert.Equal(AffinityStatus.OK, affinityResult.Status);

            policy.AffinitizeResponse(context, cluster, _defaultOptions, affinitizedDestination);

            Assert.False(context.Response.Headers.ContainsKey(AffinityHeaderName));
        }
示例#12
0
        public void AffinitizedRequest_AffinityKeyIsNotExtracted_SetKeyOnResponse()
        {
            var policy                      = new CustomHeaderSessionAffinityPolicy(AffinityTestHelper.GetDataProtector().Object, AffinityTestHelper.GetLogger <CustomHeaderSessionAffinityPolicy>().Object);
            var context                     = new DefaultHttpContext();
            var chosenDestination           = _destinations[1];
            var expectedAffinityHeaderValue = chosenDestination.DestinationId.ToUTF8BytesInBase64();

            policy.AffinitizeResponse(context, new ClusterState("cluster"), _defaultOptions, chosenDestination);

            Assert.True(context.Response.Headers.ContainsKey(AffinityHeaderName));
            Assert.Equal(expectedAffinityHeaderValue, context.Response.Headers[AffinityHeaderName]);
        }
示例#13
0
        public void FindAffinitizedDestination_AffinityKeyIsSetOnRequest_Success()
        {
            var policy  = new CustomHeaderSessionAffinityPolicy(AffinityTestHelper.GetDataProtector().Object, AffinityTestHelper.GetLogger <CustomHeaderSessionAffinityPolicy>().Object);
            var context = new DefaultHttpContext();

            context.Request.Headers["SomeHeader"] = new[] { "SomeValue" };
            var affinitizedDestination = _destinations[1];

            context.Request.Headers[AffinityHeaderName] = new[] { affinitizedDestination.DestinationId.ToUTF8BytesInBase64() };
            var cluster = new ClusterState("cluster");

            var affinityResult = policy.FindAffinitizedDestinations(context, cluster, _defaultOptions, _destinations);

            Assert.Equal(AffinityStatus.OK, affinityResult.Status);
            Assert.Equal(1, affinityResult.Destinations.Count);
            Assert.Same(affinitizedDestination, affinityResult.Destinations[0]);
        }
示例#14
0
        public void FindAffinitizedDestination_AffinityKeyIsNotSetOnRequest_ReturnKeyNotSet()
        {
            var policy = new CustomHeaderSessionAffinityPolicy(AffinityTestHelper.GetDataProtector().Object, AffinityTestHelper.GetLogger <CustomHeaderSessionAffinityPolicy>().Object);

            Assert.Equal(SessionAffinityConstants.Policies.CustomHeader, policy.Name);

            var context = new DefaultHttpContext();

            context.Request.Headers["SomeHeader"] = new[] { "SomeValue" };
            var cluster = new ClusterState("cluster");

            var affinityResult = policy.FindAffinitizedDestinations(context, cluster, _defaultOptions, _destinations);

            Assert.Equal(AffinityStatus.AffinityKeyNotSet, affinityResult.Status);
            Assert.Null(affinityResult.Destinations);
        }