# HG changeset patch # User Maxim Dounin # Date 1255107942 -14400 # Node ID 4ae2198b97ec007a12a614e2c1e498dbc24ac91a # Parent 9f723d3ba52d53714d8983849b7fb653da0ce788 Tests: limit_req tests for 0.8.18 changes and bug. 1. Make sure rejected requests are not counted, as leaky bucket algorithm suggests (finally correctly done in 0.8.18). 2. Make sure negative excess values are handled properly (bug appeared in 0.8.18, fixed in 0.8.19). diff --git a/limit-req.t b/limit-req.t --- a/limit-req.t +++ b/limit-req.t @@ -21,7 +21,7 @@ use Test::Nginx; select STDERR; $| = 1; select STDOUT; $| = 1; -my $t = Test::Nginx->new()->plan(3); +my $t = Test::Nginx->new()->plan(5); $t->write_file_expand('nginx.conf', <<'EOF'); @@ -39,8 +39,9 @@ http { fastcgi_temp_path %%TESTDIR%%/fastcgi_temp; proxy_temp_path %%TESTDIR%%/proxy_temp; - limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m; - limit_req_zone $binary_remote_addr zone=long:10m rate=1r/m; + limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; + limit_req_zone $binary_remote_addr zone=long:10m rate=1r/m; + limit_req_zone $binary_remote_addr zone=fast:10m rate=1000r/s; server { listen 127.0.0.1:8080; @@ -51,6 +52,9 @@ http { location /long { limit_req zone=long burst=5; } + location /fast { + limit_req zone=fast burst=1; + } } } @@ -58,6 +62,7 @@ EOF $t->write_file('test1.html', 'XtestX'); $t->write_file('long.html', "1234567890\n" x (1 << 16)); +$t->write_file('fast.html', 'XtestX'); $t->run(); ############################################################################### @@ -65,6 +70,8 @@ EOF like(http_get('/test1.html'), qr/^HTTP\/1.. 200 /m, 'request'); http_get('/test1.html'); like(http_get('/test1.html'), qr/^HTTP\/1.. 503 /m, 'request rejected'); +http_get('/test1.html'); +http_get('/test1.html'); # Second request will be delayed by limit_req, make sure it isn't truncated. # The bug only manifests itself if buffer will be filled, so sleep for a while @@ -74,4 +81,15 @@ my $l1 = length(http_get('/long.html')); my $l2 = length(http_get('/long.html', sleep => 1.1)); is($l2, $l1, 'delayed big request not truncated'); +# make sure rejected requests are not counted, and access is again allowed +# after 1/rate seconds + +like(http_get('/test1.html'), qr/^HTTP\/1.. 200 /m, 'rejects not counted'); + +# make sure negative excess values are handled properly + +http_get('/fast.html'); +select undef, undef, undef, 0.1; +like(http_get('/fast.html'), qr/^HTTP\/1.. 200 /m, 'negative excess'); + ###############################################################################