aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/http/modules/ngx_http_limit_req_module.c29
1 files changed, 25 insertions, 4 deletions
diff --git a/src/http/modules/ngx_http_limit_req_module.c b/src/http/modules/ngx_http_limit_req_module.c
index 579b13c84..63ec2de3f 100644
--- a/src/http/modules/ngx_http_limit_req_module.c
+++ b/src/http/modules/ngx_http_limit_req_module.c
@@ -399,7 +399,14 @@ ngx_http_limit_req_lookup(ngx_http_limit_req_limit_t *limit, ngx_uint_t hash,
ms = (ngx_msec_int_t) (now - lr->last);
- excess = lr->excess - ctx->rate * ngx_abs(ms) / 1000 + 1000;
+ if (ms < -60000) {
+ ms = 1;
+
+ } else if (ms < 0) {
+ ms = 0;
+ }
+
+ excess = lr->excess - ctx->rate * ms / 1000 + 1000;
if (excess < 0) {
excess = 0;
@@ -413,7 +420,11 @@ ngx_http_limit_req_lookup(ngx_http_limit_req_limit_t *limit, ngx_uint_t hash,
if (account) {
lr->excess = excess;
- lr->last = now;
+
+ if (ms) {
+ lr->last = now;
+ }
+
return NGX_OK;
}
@@ -509,13 +520,23 @@ ngx_http_limit_req_account(ngx_http_limit_req_limit_t *limits, ngx_uint_t n,
now = ngx_current_msec;
ms = (ngx_msec_int_t) (now - lr->last);
- excess = lr->excess - ctx->rate * ngx_abs(ms) / 1000 + 1000;
+ if (ms < -60000) {
+ ms = 1;
+
+ } else if (ms < 0) {
+ ms = 0;
+ }
+
+ excess = lr->excess - ctx->rate * ms / 1000 + 1000;
if (excess < 0) {
excess = 0;
}
- lr->last = now;
+ if (ms) {
+ lr->last = now;
+ }
+
lr->excess = excess;
lr->count--;