コード例 #1
0
        public void TestMaxHitsPerOrigin()
        {
            Hacker.Config.MaxHitsPerKey          = 20;
            Hacker.Config.MaxHitsPerOrigin       = 10;
            Hacker.Config.MaxHitsPerKeyPerOrigin = 20;

            var           ip           = GetRandomIP();
            Func <string> keyGenerator = () => { return("TestMaxHitsPerOrigin" + GetRandomKey()); };

            var startTime = DateTime.Now;
            var result    = Parallel.For(0, Hacker.Config.MaxHitsPerOrigin,
                                         hit =>
            {
                Assert.AreEqual(
                    Hacker.Result.Allowed,
                    Hacker.DefendAsync(keyGenerator(), ip).Run()
                    );
            });

            while (!result.IsCompleted)
            {
                Thread.Sleep(100);
            }

            Assert.AreEqual(
                Hacker.Config.MaxHitsPerOrigin,
                Hacker.GetHitsFromOrigin(ip).Run(),
                "Number of hits recorded must match");


            // No more requests from same IP
            Assert.AreEqual(
                Hacker.Result.TooManyHitsFromOrigin,
                Hacker.DefendAsync(keyGenerator(), ip).Run()
                );

            // Allow requests from other IPs
            Assert.AreEqual(
                Hacker.Result.Allowed,
                Hacker.DefendAsync(keyGenerator(), GetRandomIP()).Run());


            WaitForIntervalToElapse(Hacker.Config.MaxHitsPerOriginInterval, startTime);

            Assert.AreEqual(
                Hacker.Result.Allowed,
                Hacker.DefendAsync(keyGenerator(), ip).Run(),
                "Allow hits from same origin after expiration time."
                );
        }