annotate src/http/modules/ngx_http_limit_req_module.c @ 664:f5b859b2f097 NGINX_1_1_16

nginx 1.1.16 *) Change: the simultaneous subrequest limit has been raised to 200. *) Feature: the "from" parameter of the "disable_symlinks" directive. *) Feature: the "return" and "error_page" directives can be used to return 307 redirections. *) Bugfix: a segmentation fault might occur in a worker process if the "resolver" directive was used and there was no "error_log" directive specified at global level. Thanks to Roman Arutyunyan. *) Bugfix: a segmentation fault might occur in a worker process if the "proxy_http_version 1.1" or "fastcgi_keep_conn on" directives were used. *) Bugfix: memory leaks. Thanks to Lanshun Zhou. *) Bugfix: in the "disable_symlinks" directive. *) Bugfix: on ZFS filesystem disk cache size might be calculated incorrectly; the bug had appeared in 1.0.1. *) Bugfix: nginx could not be built by the icc 12.1 compiler. *) Bugfix: nginx could not be built by gcc on Solaris; the bug had appeared in 1.1.15.
author Igor Sysoev <http://sysoev.ru>
date Wed, 29 Feb 2012 00:00:00 +0400
parents d0f7a625f27c
children 660139fd80ca
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2 /*
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
4 * Copyright (C) Nginx, Inc.
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
5 */
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
6
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
7
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
10 #include <ngx_http.h>
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
11
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
12
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
13 typedef struct {
480
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
14 u_char color;
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
15 u_char dummy;
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
16 u_short len;
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
17 ngx_queue_t queue;
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
18 ngx_msec_t last;
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
19 /* integer value, 1 corresponds to 0.001 r/s */
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
20 ngx_uint_t excess;
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
21 ngx_uint_t count;
480
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
22 u_char data[1];
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
23 } ngx_http_limit_req_node_t;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
24
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
25
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
26 typedef struct {
480
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
27 ngx_rbtree_t rbtree;
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
28 ngx_rbtree_node_t sentinel;
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
29 ngx_queue_t queue;
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
30 } ngx_http_limit_req_shctx_t;
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
31
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
32
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
33 typedef struct {
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
34 ngx_http_limit_req_shctx_t *sh;
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
35 ngx_slab_pool_t *shpool;
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
36 /* integer value, 1 corresponds to 0.001 r/s */
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
37 ngx_uint_t rate;
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
38 ngx_int_t index;
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
39 ngx_str_t var;
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
40 ngx_http_limit_req_node_t *node;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
41 } ngx_http_limit_req_ctx_t;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
42
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
43
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
44 typedef struct {
480
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
45 ngx_shm_zone_t *shm_zone;
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
46 /* integer value, 1 corresponds to 0.001 r/s */
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
47 ngx_uint_t burst;
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
48 ngx_uint_t nodelay; /* unsigned nodelay:1 */
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
49 } ngx_http_limit_req_limit_t;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
50
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
51
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
52 typedef struct {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
53 ngx_array_t limits;
532
f7ec98e3caeb nginx 0.8.18
Igor Sysoev <http://sysoev.ru>
parents: 506
diff changeset
54 ngx_uint_t limit_log_level;
f7ec98e3caeb nginx 0.8.18
Igor Sysoev <http://sysoev.ru>
parents: 506
diff changeset
55 ngx_uint_t delay_log_level;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
56 } ngx_http_limit_req_conf_t;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
57
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
58
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
59 static void ngx_http_limit_req_delay(ngx_http_request_t *r);
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
60 static ngx_int_t ngx_http_limit_req_lookup(ngx_http_limit_req_limit_t *limit,
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
61 ngx_uint_t hash, u_char *data, size_t len, ngx_uint_t *ep,
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
62 ngx_uint_t account);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
63 static ngx_msec_t ngx_http_limit_req_account(ngx_http_limit_req_limit_t *limits,
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
64 ngx_uint_t n, ngx_uint_t *ep, ngx_http_limit_req_limit_t **limit);
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
65 static void ngx_http_limit_req_expire(ngx_http_limit_req_ctx_t *ctx,
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
66 ngx_uint_t n);
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
67
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
68 static void *ngx_http_limit_req_create_conf(ngx_conf_t *cf);
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
69 static char *ngx_http_limit_req_merge_conf(ngx_conf_t *cf, void *parent,
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
70 void *child);
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
71 static char *ngx_http_limit_req_zone(ngx_conf_t *cf, ngx_command_t *cmd,
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
72 void *conf);
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
73 static char *ngx_http_limit_req(ngx_conf_t *cf, ngx_command_t *cmd,
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
74 void *conf);
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
75 static ngx_int_t ngx_http_limit_req_init(ngx_conf_t *cf);
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
76
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
77
532
f7ec98e3caeb nginx 0.8.18
Igor Sysoev <http://sysoev.ru>
parents: 506
diff changeset
78 static ngx_conf_enum_t ngx_http_limit_req_log_levels[] = {
f7ec98e3caeb nginx 0.8.18
Igor Sysoev <http://sysoev.ru>
parents: 506
diff changeset
79 { ngx_string("info"), NGX_LOG_INFO },
f7ec98e3caeb nginx 0.8.18
Igor Sysoev <http://sysoev.ru>
parents: 506
diff changeset
80 { ngx_string("notice"), NGX_LOG_NOTICE },
f7ec98e3caeb nginx 0.8.18
Igor Sysoev <http://sysoev.ru>
parents: 506
diff changeset
81 { ngx_string("warn"), NGX_LOG_WARN },
f7ec98e3caeb nginx 0.8.18
Igor Sysoev <http://sysoev.ru>
parents: 506
diff changeset
82 { ngx_string("error"), NGX_LOG_ERR },
f7ec98e3caeb nginx 0.8.18
Igor Sysoev <http://sysoev.ru>
parents: 506
diff changeset
83 { ngx_null_string, 0 }
f7ec98e3caeb nginx 0.8.18
Igor Sysoev <http://sysoev.ru>
parents: 506
diff changeset
84 };
f7ec98e3caeb nginx 0.8.18
Igor Sysoev <http://sysoev.ru>
parents: 506
diff changeset
85
f7ec98e3caeb nginx 0.8.18
Igor Sysoev <http://sysoev.ru>
parents: 506
diff changeset
86
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
87 static ngx_command_t ngx_http_limit_req_commands[] = {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
88
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
89 { ngx_string("limit_req_zone"),
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
90 NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE3,
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
91 ngx_http_limit_req_zone,
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
92 0,
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
93 0,
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
94 NULL },
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
95
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
96 { ngx_string("limit_req"),
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
97 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123,
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
98 ngx_http_limit_req,
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
99 NGX_HTTP_LOC_CONF_OFFSET,
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
100 0,
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
101 NULL },
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
102
532
f7ec98e3caeb nginx 0.8.18
Igor Sysoev <http://sysoev.ru>
parents: 506
diff changeset
103 { ngx_string("limit_req_log_level"),
f7ec98e3caeb nginx 0.8.18
Igor Sysoev <http://sysoev.ru>
parents: 506
diff changeset
104 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
f7ec98e3caeb nginx 0.8.18
Igor Sysoev <http://sysoev.ru>
parents: 506
diff changeset
105 ngx_conf_set_enum_slot,
f7ec98e3caeb nginx 0.8.18
Igor Sysoev <http://sysoev.ru>
parents: 506
diff changeset
106 NGX_HTTP_LOC_CONF_OFFSET,
f7ec98e3caeb nginx 0.8.18
Igor Sysoev <http://sysoev.ru>
parents: 506
diff changeset
107 offsetof(ngx_http_limit_req_conf_t, limit_log_level),
f7ec98e3caeb nginx 0.8.18
Igor Sysoev <http://sysoev.ru>
parents: 506
diff changeset
108 &ngx_http_limit_req_log_levels },
f7ec98e3caeb nginx 0.8.18
Igor Sysoev <http://sysoev.ru>
parents: 506
diff changeset
109
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
110 ngx_null_command
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
111 };
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
112
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
113
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
114 static ngx_http_module_t ngx_http_limit_req_module_ctx = {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
115 NULL, /* preconfiguration */
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
116 ngx_http_limit_req_init, /* postconfiguration */
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
117
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
118 NULL, /* create main configuration */
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
119 NULL, /* init main configuration */
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
120
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
121 NULL, /* create server configuration */
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
122 NULL, /* merge server configuration */
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
123
664
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
124 ngx_http_limit_req_create_conf, /* create location configuration */
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
125 ngx_http_limit_req_merge_conf /* merge location configuration */
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
126 };
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
127
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
128
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
129 ngx_module_t ngx_http_limit_req_module = {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
130 NGX_MODULE_V1,
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
131 &ngx_http_limit_req_module_ctx, /* module context */
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
132 ngx_http_limit_req_commands, /* module directives */
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
133 NGX_HTTP_MODULE, /* module type */
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
134 NULL, /* init master */
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
135 NULL, /* init module */
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
136 NULL, /* init process */
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
137 NULL, /* init thread */
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
138 NULL, /* exit thread */
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
139 NULL, /* exit process */
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
140 NULL, /* exit master */
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
141 NGX_MODULE_V1_PADDING
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
142 };
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
143
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
144
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
145 static ngx_int_t
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
146 ngx_http_limit_req_handler(ngx_http_request_t *r)
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
147 {
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
148 size_t len;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
149 uint32_t hash;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
150 ngx_int_t rc;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
151 ngx_uint_t n, excess;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
152 ngx_msec_t delay;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
153 ngx_http_variable_value_t *vv;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
154 ngx_http_limit_req_ctx_t *ctx;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
155 ngx_http_limit_req_conf_t *lrcf;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
156 ngx_http_limit_req_limit_t *limit, *limits;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
157
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
158 if (r->main->limit_req_set) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
159 return NGX_DECLINED;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
160 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
161
426
e7dbea1ee115 nginx 0.7.25
Igor Sysoev <http://sysoev.ru>
parents: 420
diff changeset
162 lrcf = ngx_http_get_module_loc_conf(r, ngx_http_limit_req_module);
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
163 limits = lrcf->limits.elts;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
164
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
165 excess = 0;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
166
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
167 rc = NGX_DECLINED;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
168
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
169 #if (NGX_SUPPRESS_WARN)
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
170 limit = NULL;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
171 #endif
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
172
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
173 for (n = 0; n < lrcf->limits.nelts; n++) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
174
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
175 limit = &limits[n];
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
176
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
177 ctx = limit->shm_zone->data;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
178
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
179 vv = ngx_http_get_indexed_variable(r, ctx->index);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
180
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
181 if (vv == NULL || vv->not_found) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
182 continue;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
183 }
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
184
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
185 len = vv->len;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
186
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
187 if (len == 0) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
188 continue;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
189 }
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
190
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
191 if (len > 65535) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
192 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
193 "the value of the \"%V\" variable "
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
194 "is more than 65535 bytes: \"%v\"",
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
195 &ctx->var, vv);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
196 continue;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
197 }
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
198
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
199 hash = ngx_crc32_short(vv->data, len);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
200
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
201 ngx_shmtx_lock(&ctx->shpool->mutex);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
202
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
203 rc = ngx_http_limit_req_lookup(limit, hash, vv->data, len, &excess,
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
204 (n == lrcf->limits.nelts - 1));
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
205
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
206 ngx_shmtx_unlock(&ctx->shpool->mutex);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
207
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
208 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
209 "limit_req[%ui]: %i %ui.%03ui",
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
210 n, rc, excess / 1000, excess % 1000);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
211
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
212 if (rc != NGX_AGAIN) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
213 break;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
214 }
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
215 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
216
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
217 if (rc == NGX_DECLINED) {
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
218 return NGX_DECLINED;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
219 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
220
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
221 r->main->limit_req_set = 1;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
222
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
223 if (rc == NGX_BUSY || rc == NGX_ERROR) {
602
c5122335e41d nginx 0.8.53
Igor Sysoev <http://sysoev.ru>
parents: 572
diff changeset
224
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
225 if (rc == NGX_BUSY) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
226 ngx_log_error(lrcf->limit_log_level, r->connection->log, 0,
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
227 "limiting requests, excess: %ui.%03ui by zone \"%V\"",
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
228 excess / 1000, excess % 1000,
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
229 &limit->shm_zone->shm.name);
602
c5122335e41d nginx 0.8.53
Igor Sysoev <http://sysoev.ru>
parents: 572
diff changeset
230 }
c5122335e41d nginx 0.8.53
Igor Sysoev <http://sysoev.ru>
parents: 572
diff changeset
231
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
232 while (n--) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
233 ctx = limits[n].shm_zone->data;
602
c5122335e41d nginx 0.8.53
Igor Sysoev <http://sysoev.ru>
parents: 572
diff changeset
234
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
235 if (ctx->node == NULL) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
236 continue;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
237 }
602
c5122335e41d nginx 0.8.53
Igor Sysoev <http://sysoev.ru>
parents: 572
diff changeset
238
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
239 ngx_shmtx_lock(&ctx->shpool->mutex);
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
240
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
241 ctx->node->count--;
602
c5122335e41d nginx 0.8.53
Igor Sysoev <http://sysoev.ru>
parents: 572
diff changeset
242
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
243 ngx_shmtx_unlock(&ctx->shpool->mutex);
602
c5122335e41d nginx 0.8.53
Igor Sysoev <http://sysoev.ru>
parents: 572
diff changeset
244
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
245 ctx->node = NULL;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
246 }
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
247
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
248 return NGX_HTTP_SERVICE_UNAVAILABLE;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
249 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
250
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
251 /* rc == NGX_AGAIN || rc == NGX_OK */
418
ff86d646f9df nginx 0.7.21
Igor Sysoev <http://sysoev.ru>
parents: 416
diff changeset
252
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
253 if (rc == NGX_AGAIN) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
254 excess = 0;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
255 }
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
256
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
257 delay = ngx_http_limit_req_account(limits, n, &excess, &limit);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
258
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
259 if (!delay) {
602
c5122335e41d nginx 0.8.53
Igor Sysoev <http://sysoev.ru>
parents: 572
diff changeset
260 return NGX_DECLINED;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
261 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
262
602
c5122335e41d nginx 0.8.53
Igor Sysoev <http://sysoev.ru>
parents: 572
diff changeset
263 ngx_log_error(lrcf->delay_log_level, r->connection->log, 0,
c5122335e41d nginx 0.8.53
Igor Sysoev <http://sysoev.ru>
parents: 572
diff changeset
264 "delaying request, excess: %ui.%03ui, by zone \"%V\"",
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
265 excess / 1000, excess % 1000, &limit->shm_zone->shm.name);
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
266
602
c5122335e41d nginx 0.8.53
Igor Sysoev <http://sysoev.ru>
parents: 572
diff changeset
267 if (ngx_handle_read_event(r->connection->read, 0) != NGX_OK) {
c5122335e41d nginx 0.8.53
Igor Sysoev <http://sysoev.ru>
parents: 572
diff changeset
268 return NGX_HTTP_INTERNAL_SERVER_ERROR;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
269 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
270
602
c5122335e41d nginx 0.8.53
Igor Sysoev <http://sysoev.ru>
parents: 572
diff changeset
271 r->read_event_handler = ngx_http_test_reading;
c5122335e41d nginx 0.8.53
Igor Sysoev <http://sysoev.ru>
parents: 572
diff changeset
272 r->write_event_handler = ngx_http_limit_req_delay;
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
273 ngx_add_timer(r->connection->write, delay);
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
274
602
c5122335e41d nginx 0.8.53
Igor Sysoev <http://sysoev.ru>
parents: 572
diff changeset
275 return NGX_AGAIN;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
276 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
277
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
278
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
279 static void
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
280 ngx_http_limit_req_delay(ngx_http_request_t *r)
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
281 {
506
e8b686f230a8 nginx 0.8.5
Igor Sysoev <http://sysoev.ru>
parents: 496
diff changeset
282 ngx_event_t *wev;
e8b686f230a8 nginx 0.8.5
Igor Sysoev <http://sysoev.ru>
parents: 496
diff changeset
283
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
284 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
506
e8b686f230a8 nginx 0.8.5
Igor Sysoev <http://sysoev.ru>
parents: 496
diff changeset
285 "limit_req delay");
e8b686f230a8 nginx 0.8.5
Igor Sysoev <http://sysoev.ru>
parents: 496
diff changeset
286
e8b686f230a8 nginx 0.8.5
Igor Sysoev <http://sysoev.ru>
parents: 496
diff changeset
287 wev = r->connection->write;
e8b686f230a8 nginx 0.8.5
Igor Sysoev <http://sysoev.ru>
parents: 496
diff changeset
288
e8b686f230a8 nginx 0.8.5
Igor Sysoev <http://sysoev.ru>
parents: 496
diff changeset
289 if (!wev->timedout) {
e8b686f230a8 nginx 0.8.5
Igor Sysoev <http://sysoev.ru>
parents: 496
diff changeset
290
e8b686f230a8 nginx 0.8.5
Igor Sysoev <http://sysoev.ru>
parents: 496
diff changeset
291 if (ngx_handle_write_event(wev, 0) != NGX_OK) {
e8b686f230a8 nginx 0.8.5
Igor Sysoev <http://sysoev.ru>
parents: 496
diff changeset
292 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
e8b686f230a8 nginx 0.8.5
Igor Sysoev <http://sysoev.ru>
parents: 496
diff changeset
293 }
e8b686f230a8 nginx 0.8.5
Igor Sysoev <http://sysoev.ru>
parents: 496
diff changeset
294
e8b686f230a8 nginx 0.8.5
Igor Sysoev <http://sysoev.ru>
parents: 496
diff changeset
295 return;
e8b686f230a8 nginx 0.8.5
Igor Sysoev <http://sysoev.ru>
parents: 496
diff changeset
296 }
e8b686f230a8 nginx 0.8.5
Igor Sysoev <http://sysoev.ru>
parents: 496
diff changeset
297
e8b686f230a8 nginx 0.8.5
Igor Sysoev <http://sysoev.ru>
parents: 496
diff changeset
298 wev->timedout = 0;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
299
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
300 if (ngx_handle_read_event(r->connection->read, 0) != NGX_OK) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
301 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
302 return;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
303 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
304
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
305 r->read_event_handler = ngx_http_block_reading;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
306 r->write_event_handler = ngx_http_core_run_phases;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
307
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
308 ngx_http_core_run_phases(r);
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
309 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
310
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
311
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
312 static void
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
313 ngx_http_limit_req_rbtree_insert_value(ngx_rbtree_node_t *temp,
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
314 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
315 {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
316 ngx_rbtree_node_t **p;
426
e7dbea1ee115 nginx 0.7.25
Igor Sysoev <http://sysoev.ru>
parents: 420
diff changeset
317 ngx_http_limit_req_node_t *lrn, *lrnt;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
318
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
319 for ( ;; ) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
320
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
321 if (node->key < temp->key) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
322
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
323 p = &temp->left;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
324
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
325 } else if (node->key > temp->key) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
326
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
327 p = &temp->right;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
328
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
329 } else { /* node->key == temp->key */
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
330
426
e7dbea1ee115 nginx 0.7.25
Igor Sysoev <http://sysoev.ru>
parents: 420
diff changeset
331 lrn = (ngx_http_limit_req_node_t *) &node->color;
e7dbea1ee115 nginx 0.7.25
Igor Sysoev <http://sysoev.ru>
parents: 420
diff changeset
332 lrnt = (ngx_http_limit_req_node_t *) &temp->color;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
333
426
e7dbea1ee115 nginx 0.7.25
Igor Sysoev <http://sysoev.ru>
parents: 420
diff changeset
334 p = (ngx_memn2cmp(lrn->data, lrnt->data, lrn->len, lrnt->len) < 0)
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
335 ? &temp->left : &temp->right;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
336 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
337
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
338 if (*p == sentinel) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
339 break;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
340 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
341
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
342 temp = *p;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
343 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
344
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
345 *p = node;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
346 node->parent = temp;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
347 node->left = sentinel;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
348 node->right = sentinel;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
349 ngx_rbt_red(node);
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
350 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
351
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
352
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
353 static ngx_int_t
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
354 ngx_http_limit_req_lookup(ngx_http_limit_req_limit_t *limit, ngx_uint_t hash,
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
355 u_char *data, size_t len, ngx_uint_t *ep, ngx_uint_t account)
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
356 {
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
357 size_t size;
420
ad0a34a8efa6 nginx 0.7.22
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
358 ngx_int_t rc, excess;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
359 ngx_time_t *tp;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
360 ngx_msec_t now;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
361 ngx_msec_int_t ms;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
362 ngx_rbtree_node_t *node, *sentinel;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
363 ngx_http_limit_req_ctx_t *ctx;
426
e7dbea1ee115 nginx 0.7.25
Igor Sysoev <http://sysoev.ru>
parents: 420
diff changeset
364 ngx_http_limit_req_node_t *lr;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
365
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
366 tp = ngx_timeofday();
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
367 now = (ngx_msec_t) (tp->sec * 1000 + tp->msec);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
368
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
369 ctx = limit->shm_zone->data;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
370
480
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
371 node = ctx->sh->rbtree.root;
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
372 sentinel = ctx->sh->rbtree.sentinel;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
373
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
374 while (node != sentinel) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
375
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
376 if (hash < node->key) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
377 node = node->left;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
378 continue;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
379 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
380
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
381 if (hash > node->key) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
382 node = node->right;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
383 continue;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
384 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
385
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
386 /* hash == node->key */
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
387
664
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
388 lr = (ngx_http_limit_req_node_t *) &node->color;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
389
664
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
390 rc = ngx_memn2cmp(data, lr->data, len, (size_t) lr->len);
534
a52c99698e7f nginx 0.8.19
Igor Sysoev <http://sysoev.ru>
parents: 532
diff changeset
391
664
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
392 if (rc == 0) {
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
393 ngx_queue_remove(&lr->queue);
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
394 ngx_queue_insert_head(&ctx->sh->queue, &lr->queue);
532
f7ec98e3caeb nginx 0.8.18
Igor Sysoev <http://sysoev.ru>
parents: 506
diff changeset
395
664
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
396 ms = (ngx_msec_int_t) (now - lr->last);
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
397
664
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
398 excess = lr->excess - ctx->rate * ngx_abs(ms) / 1000 + 1000;
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
399
664
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
400 if (excess < 0) {
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
401 excess = 0;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
402 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
403
664
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
404 *ep = excess;
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
405
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
406 if ((ngx_uint_t) excess > limit->burst) {
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
407 return NGX_BUSY;
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
408 }
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
409
664
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
410 if (account) {
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
411 lr->excess = excess;
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
412 lr->last = now;
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
413 return NGX_OK;
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
414 }
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
415
664
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
416 lr->count++;
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
417
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
418 ctx->node = lr;
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
419
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
420 return NGX_AGAIN;
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
421 }
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
422
f5b859b2f097 nginx 1.1.16
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
423 node = (rc < 0) ? node->left : node->right;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
424 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
425
602
c5122335e41d nginx 0.8.53
Igor Sysoev <http://sysoev.ru>
parents: 572
diff changeset
426 *ep = 0;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
427
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
428 size = offsetof(ngx_rbtree_node_t, color)
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
429 + offsetof(ngx_http_limit_req_node_t, data)
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
430 + len;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
431
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
432 ngx_http_limit_req_expire(ctx, 1);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
433
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
434 node = ngx_slab_alloc_locked(ctx->shpool, size);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
435
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
436 if (node == NULL) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
437 ngx_http_limit_req_expire(ctx, 0);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
438
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
439 node = ngx_slab_alloc_locked(ctx->shpool, size);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
440 if (node == NULL) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
441 return NGX_ERROR;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
442 }
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
443 }
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
444
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
445 node->key = hash;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
446
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
447 ngx_rbtree_insert(&ctx->sh->rbtree, node);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
448
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
449 lr = (ngx_http_limit_req_node_t *) &node->color;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
450
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
451 ngx_queue_insert_head(&ctx->sh->queue, &lr->queue);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
452
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
453 lr->len = (u_char) len;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
454 lr->excess = 0;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
455
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
456 ngx_memcpy(lr->data, data, len);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
457
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
458 if (account) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
459 lr->last = now;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
460 lr->count = 0;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
461 return NGX_OK;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
462 }
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
463
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
464 lr->last = 0;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
465 lr->count = 1;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
466
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
467 ctx->node = lr;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
468
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
469 return NGX_AGAIN;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
470 }
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
471
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
472
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
473 static ngx_msec_t
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
474 ngx_http_limit_req_account(ngx_http_limit_req_limit_t *limits, ngx_uint_t n,
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
475 ngx_uint_t *ep, ngx_http_limit_req_limit_t **limit)
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
476 {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
477 ngx_int_t excess;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
478 ngx_time_t *tp;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
479 ngx_msec_t now, delay, max_delay;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
480 ngx_msec_int_t ms;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
481 ngx_http_limit_req_ctx_t *ctx;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
482 ngx_http_limit_req_node_t *lr;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
483
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
484 excess = *ep;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
485
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
486 if (excess == 0 || (*limit)->nodelay) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
487 max_delay = 0;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
488
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
489 } else {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
490 ctx = (*limit)->shm_zone->data;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
491 max_delay = excess * 1000 / ctx->rate;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
492 }
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
493
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
494 while (n--) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
495 ctx = limits[n].shm_zone->data;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
496 lr = ctx->node;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
497
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
498 if (lr == NULL) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
499 continue;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
500 }
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
501
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
502 ngx_shmtx_lock(&ctx->shpool->mutex);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
503
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
504 tp = ngx_timeofday();
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
505
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
506 now = (ngx_msec_t) (tp->sec * 1000 + tp->msec);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
507 ms = (ngx_msec_int_t) (now - lr->last);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
508
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
509 excess = lr->excess - ctx->rate * ngx_abs(ms) / 1000 + 1000;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
510
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
511 if (excess < 0) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
512 excess = 0;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
513 }
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
514
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
515 lr->last = now;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
516 lr->excess = excess;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
517 lr->count--;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
518
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
519 ngx_shmtx_unlock(&ctx->shpool->mutex);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
520
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
521 ctx->node = NULL;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
522
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
523 if (limits[n].nodelay) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
524 continue;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
525 }
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
526
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
527 delay = excess * 1000 / ctx->rate;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
528
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
529 if (delay > max_delay) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
530 max_delay = delay;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
531 *ep = excess;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
532 *limit = &limits[n];
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
533 }
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
534 }
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
535
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
536 return max_delay;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
537 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
538
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
539
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
540 static void
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
541 ngx_http_limit_req_expire(ngx_http_limit_req_ctx_t *ctx, ngx_uint_t n)
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
542 {
420
ad0a34a8efa6 nginx 0.7.22
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
543 ngx_int_t excess;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
544 ngx_time_t *tp;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
545 ngx_msec_t now;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
546 ngx_queue_t *q;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
547 ngx_msec_int_t ms;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
548 ngx_rbtree_node_t *node;
426
e7dbea1ee115 nginx 0.7.25
Igor Sysoev <http://sysoev.ru>
parents: 420
diff changeset
549 ngx_http_limit_req_node_t *lr;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
550
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
551 tp = ngx_timeofday();
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
552
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
553 now = (ngx_msec_t) (tp->sec * 1000 + tp->msec);
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
554
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
555 /*
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
556 * n == 1 deletes one or two zero rate entries
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
557 * n == 0 deletes oldest entry by force
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
558 * and one or two zero rate entries
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
559 */
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
560
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
561 while (n < 3) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
562
480
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
563 if (ngx_queue_empty(&ctx->sh->queue)) {
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
564 return;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
565 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
566
480
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
567 q = ngx_queue_last(&ctx->sh->queue);
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
568
426
e7dbea1ee115 nginx 0.7.25
Igor Sysoev <http://sysoev.ru>
parents: 420
diff changeset
569 lr = ngx_queue_data(q, ngx_http_limit_req_node_t, queue);
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
570
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
571 if (lr->count) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
572
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
573 /*
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
574 * There is not much sense in looking further,
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
575 * because we bump nodes on the lookup stage.
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
576 */
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
577
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
578 return;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
579 }
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
580
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
581 if (n++ != 0) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
582
426
e7dbea1ee115 nginx 0.7.25
Igor Sysoev <http://sysoev.ru>
parents: 420
diff changeset
583 ms = (ngx_msec_int_t) (now - lr->last);
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
584 ms = ngx_abs(ms);
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
585
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
586 if (ms < 60000) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
587 return;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
588 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
589
426
e7dbea1ee115 nginx 0.7.25
Igor Sysoev <http://sysoev.ru>
parents: 420
diff changeset
590 excess = lr->excess - ctx->rate * ms / 1000;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
591
420
ad0a34a8efa6 nginx 0.7.22
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
592 if (excess > 0) {
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
593 return;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
594 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
595 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
596
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
597 ngx_queue_remove(q);
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
598
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
599 node = (ngx_rbtree_node_t *)
426
e7dbea1ee115 nginx 0.7.25
Igor Sysoev <http://sysoev.ru>
parents: 420
diff changeset
600 ((u_char *) lr - offsetof(ngx_rbtree_node_t, color));
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
601
480
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
602 ngx_rbtree_delete(&ctx->sh->rbtree, node);
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
603
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
604 ngx_slab_free_locked(ctx->shpool, node);
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
605 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
606 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
607
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
608
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
609 static ngx_int_t
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
610 ngx_http_limit_req_init_zone(ngx_shm_zone_t *shm_zone, void *data)
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
611 {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
612 ngx_http_limit_req_ctx_t *octx = data;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
613
468
56baf312c1b5 nginx 0.7.46
Igor Sysoev <http://sysoev.ru>
parents: 426
diff changeset
614 size_t len;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
615 ngx_http_limit_req_ctx_t *ctx;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
616
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
617 ctx = shm_zone->data;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
618
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
619 if (octx) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
620 if (ngx_strcmp(ctx->var.data, octx->var.data) != 0) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
621 ngx_log_error(NGX_LOG_EMERG, shm_zone->shm.log, 0,
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
622 "limit_req \"%V\" uses the \"%V\" variable "
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
623 "while previously it used the \"%V\" variable",
480
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
624 &shm_zone->shm.name, &ctx->var, &octx->var);
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
625 return NGX_ERROR;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
626 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
627
480
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
628 ctx->sh = octx->sh;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
629 ctx->shpool = octx->shpool;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
630
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
631 return NGX_OK;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
632 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
633
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
634 ctx->shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
635
480
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
636 if (shm_zone->shm.exists) {
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
637 ctx->sh = ctx->shpool->data;
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
638
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
639 return NGX_OK;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
640 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
641
480
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
642 ctx->sh = ngx_slab_alloc(ctx->shpool, sizeof(ngx_http_limit_req_shctx_t));
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
643 if (ctx->sh == NULL) {
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
644 return NGX_ERROR;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
645 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
646
480
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
647 ctx->shpool->data = ctx->sh;
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
648
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
649 ngx_rbtree_init(&ctx->sh->rbtree, &ctx->sh->sentinel,
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
650 ngx_http_limit_req_rbtree_insert_value);
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
651
480
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
652 ngx_queue_init(&ctx->sh->queue);
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
653
480
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
654 len = sizeof(" in limit_req zone \"\"") + shm_zone->shm.name.len;
468
56baf312c1b5 nginx 0.7.46
Igor Sysoev <http://sysoev.ru>
parents: 426
diff changeset
655
56baf312c1b5 nginx 0.7.46
Igor Sysoev <http://sysoev.ru>
parents: 426
diff changeset
656 ctx->shpool->log_ctx = ngx_slab_alloc(ctx->shpool, len);
56baf312c1b5 nginx 0.7.46
Igor Sysoev <http://sysoev.ru>
parents: 426
diff changeset
657 if (ctx->shpool->log_ctx == NULL) {
56baf312c1b5 nginx 0.7.46
Igor Sysoev <http://sysoev.ru>
parents: 426
diff changeset
658 return NGX_ERROR;
56baf312c1b5 nginx 0.7.46
Igor Sysoev <http://sysoev.ru>
parents: 426
diff changeset
659 }
56baf312c1b5 nginx 0.7.46
Igor Sysoev <http://sysoev.ru>
parents: 426
diff changeset
660
56baf312c1b5 nginx 0.7.46
Igor Sysoev <http://sysoev.ru>
parents: 426
diff changeset
661 ngx_sprintf(ctx->shpool->log_ctx, " in limit_req zone \"%V\"%Z",
480
549994537f15 nginx 0.7.52
Igor Sysoev <http://sysoev.ru>
parents: 468
diff changeset
662 &shm_zone->shm.name);
468
56baf312c1b5 nginx 0.7.46
Igor Sysoev <http://sysoev.ru>
parents: 426
diff changeset
663
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
664 return NGX_OK;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
665 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
666
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
667
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
668 static void *
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
669 ngx_http_limit_req_create_conf(ngx_conf_t *cf)
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
670 {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
671 ngx_http_limit_req_conf_t *conf;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
672
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
673 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_limit_req_conf_t));
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
674 if (conf == NULL) {
496
f39b9e29530d nginx 0.8.0
Igor Sysoev <http://sysoev.ru>
parents: 480
diff changeset
675 return NULL;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
676 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
677
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
678 /*
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
679 * set by ngx_pcalloc():
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
680 *
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
681 * conf->limits.elts = NULL;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
682 */
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
683
532
f7ec98e3caeb nginx 0.8.18
Igor Sysoev <http://sysoev.ru>
parents: 506
diff changeset
684 conf->limit_log_level = NGX_CONF_UNSET_UINT;
f7ec98e3caeb nginx 0.8.18
Igor Sysoev <http://sysoev.ru>
parents: 506
diff changeset
685
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
686 return conf;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
687 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
688
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
689
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
690 static char *
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
691 ngx_http_limit_req_merge_conf(ngx_conf_t *cf, void *parent, void *child)
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
692 {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
693 ngx_http_limit_req_conf_t *prev = parent;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
694 ngx_http_limit_req_conf_t *conf = child;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
695
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
696 if (conf->limits.elts == NULL) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
697 conf->limits = prev->limits;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
698 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
699
532
f7ec98e3caeb nginx 0.8.18
Igor Sysoev <http://sysoev.ru>
parents: 506
diff changeset
700 ngx_conf_merge_uint_value(conf->limit_log_level, prev->limit_log_level,
f7ec98e3caeb nginx 0.8.18
Igor Sysoev <http://sysoev.ru>
parents: 506
diff changeset
701 NGX_LOG_ERR);
f7ec98e3caeb nginx 0.8.18
Igor Sysoev <http://sysoev.ru>
parents: 506
diff changeset
702
f7ec98e3caeb nginx 0.8.18
Igor Sysoev <http://sysoev.ru>
parents: 506
diff changeset
703 conf->delay_log_level = (conf->limit_log_level == NGX_LOG_INFO) ?
f7ec98e3caeb nginx 0.8.18
Igor Sysoev <http://sysoev.ru>
parents: 506
diff changeset
704 NGX_LOG_INFO : conf->limit_log_level + 1;
f7ec98e3caeb nginx 0.8.18
Igor Sysoev <http://sysoev.ru>
parents: 506
diff changeset
705
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
706 return NGX_CONF_OK;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
707 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
708
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
709
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
710 static char *
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
711 ngx_http_limit_req_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
712 {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
713 u_char *p;
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
714 size_t len;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
715 ssize_t size;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
716 ngx_str_t *value, name, s;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
717 ngx_int_t rate, scale;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
718 ngx_uint_t i;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
719 ngx_shm_zone_t *shm_zone;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
720 ngx_http_limit_req_ctx_t *ctx;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
721
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
722 value = cf->args->elts;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
723
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
724 ctx = NULL;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
725 size = 0;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
726 rate = 1;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
727 scale = 1;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
728 name.len = 0;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
729
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
730 for (i = 1; i < cf->args->nelts; i++) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
731
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
732 if (ngx_strncmp(value[i].data, "zone=", 5) == 0) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
733
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
734 name.data = value[i].data + 5;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
735
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
736 p = (u_char *) ngx_strchr(name.data, ':');
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
737
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
738 if (p == NULL) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
739 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
740 "invalid zone size \"%V\"", &value[i]);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
741 return NGX_CONF_ERROR;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
742 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
743
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
744 name.len = p - name.data;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
745
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
746 s.data = p + 1;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
747 s.len = value[i].data + value[i].len - s.data;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
748
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
749 size = ngx_parse_size(&s);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
750
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
751 if (size == NGX_ERROR) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
752 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
753 "invalid zone size \"%V\"", &value[i]);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
754 return NGX_CONF_ERROR;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
755 }
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
756
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
757 if (size < (ssize_t) (8 * ngx_pagesize)) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
758 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
759 "zone \"%V\" is too small", &value[i]);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
760 return NGX_CONF_ERROR;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
761 }
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
762
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
763 continue;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
764 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
765
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
766 if (ngx_strncmp(value[i].data, "rate=", 5) == 0) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
767
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
768 len = value[i].len;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
769 p = value[i].data + len - 3;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
770
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
771 if (ngx_strncmp(p, "r/s", 3) == 0) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
772 scale = 1;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
773 len -= 3;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
774
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
775 } else if (ngx_strncmp(p, "r/m", 3) == 0) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
776 scale = 60;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
777 len -= 3;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
778 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
779
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
780 rate = ngx_atoi(value[i].data + 5, len - 5);
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
781 if (rate <= NGX_ERROR) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
782 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
783 "invalid rate \"%V\"", &value[i]);
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
784 return NGX_CONF_ERROR;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
785 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
786
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
787 continue;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
788 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
789
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
790 if (value[i].data[0] == '$') {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
791
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
792 value[i].len--;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
793 value[i].data++;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
794
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
795 ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_limit_req_ctx_t));
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
796 if (ctx == NULL) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
797 return NGX_CONF_ERROR;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
798 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
799
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
800 ctx->index = ngx_http_get_variable_index(cf, &value[i]);
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
801 if (ctx->index == NGX_ERROR) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
802 return NGX_CONF_ERROR;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
803 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
804
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
805 ctx->var = value[i];
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
806
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
807 continue;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
808 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
809
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
810 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
811 "invalid parameter \"%V\"", &value[i]);
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
812 return NGX_CONF_ERROR;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
813 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
814
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
815 if (name.len == 0) {
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
816 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
817 "\"%V\" must have \"zone\" parameter",
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
818 &cmd->name);
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
819 return NGX_CONF_ERROR;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
820 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
821
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
822 if (ctx == NULL) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
823 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
824 "no variable is defined for %V \"%V\"",
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
825 &cmd->name, &name);
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
826 return NGX_CONF_ERROR;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
827 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
828
420
ad0a34a8efa6 nginx 0.7.22
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
829 ctx->rate = rate * 1000 / scale;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
830
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
831 shm_zone = ngx_shared_memory_add(cf, &name, size,
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
832 &ngx_http_limit_req_module);
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
833 if (shm_zone == NULL) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
834 return NGX_CONF_ERROR;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
835 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
836
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
837 if (shm_zone->data) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
838 ctx = shm_zone->data;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
839
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
840 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
841 "%V \"%V\" is already bound to variable \"%V\"",
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
842 &cmd->name, &name, &ctx->var);
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
843 return NGX_CONF_ERROR;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
844 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
845
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
846 shm_zone->init = ngx_http_limit_req_init_zone;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
847 shm_zone->data = ctx;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
848
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
849 return NGX_CONF_OK;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
850 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
851
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
852
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
853 static char *
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
854 ngx_http_limit_req(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
855 {
426
e7dbea1ee115 nginx 0.7.25
Igor Sysoev <http://sysoev.ru>
parents: 420
diff changeset
856 ngx_http_limit_req_conf_t *lrcf = conf;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
857
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
858 ngx_int_t burst;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
859 ngx_str_t *value, s;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
860 ngx_uint_t i, nodelay;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
861 ngx_shm_zone_t *shm_zone;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
862 ngx_http_limit_req_limit_t *limit, *limits;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
863
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
864 value = cf->args->elts;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
865
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
866 shm_zone = NULL;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
867 burst = 0;
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
868 nodelay = 0;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
869
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
870 for (i = 1; i < cf->args->nelts; i++) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
871
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
872 if (ngx_strncmp(value[i].data, "zone=", 5) == 0) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
873
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
874 s.len = value[i].len - 5;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
875 s.data = value[i].data + 5;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
876
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
877 shm_zone = ngx_shared_memory_add(cf, &s, 0,
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
878 &ngx_http_limit_req_module);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
879 if (shm_zone == NULL) {
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
880 return NGX_CONF_ERROR;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
881 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
882
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
883 continue;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
884 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
885
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
886 if (ngx_strncmp(value[i].data, "burst=", 6) == 0) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
887
418
ff86d646f9df nginx 0.7.21
Igor Sysoev <http://sysoev.ru>
parents: 416
diff changeset
888 burst = ngx_atoi(value[i].data + 6, value[i].len - 6);
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
889 if (burst <= 0) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
890 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
891 "invalid burst rate \"%V\"", &value[i]);
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
892 return NGX_CONF_ERROR;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
893 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
894
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
895 continue;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
896 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
897
418
ff86d646f9df nginx 0.7.21
Igor Sysoev <http://sysoev.ru>
parents: 416
diff changeset
898 if (ngx_strncmp(value[i].data, "nodelay", 7) == 0) {
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
899 nodelay = 1;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
900 continue;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
901 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
902
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
903 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
904 "invalid parameter \"%V\"", &value[i]);
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
905 return NGX_CONF_ERROR;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
906 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
907
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
908 if (shm_zone == NULL) {
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
909 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
910 "\"%V\" must have \"zone\" parameter",
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
911 &cmd->name);
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
912 return NGX_CONF_ERROR;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
913 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
914
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
915 if (shm_zone->data == NULL) {
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
916 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
917 "unknown limit_req_zone \"%V\"",
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
918 &shm_zone->shm.name);
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
919 return NGX_CONF_ERROR;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
920 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
921
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
922 limits = lrcf->limits.elts;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
923
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
924 if (limits == NULL) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
925 if (ngx_array_init(&lrcf->limits, cf->pool, 1,
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
926 sizeof(ngx_http_limit_req_limit_t))
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
927 != NGX_OK)
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
928 {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
929 return NGX_CONF_ERROR;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
930 }
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
931 }
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
932
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
933 for (i = 0; i < lrcf->limits.nelts; i++) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
934 if (shm_zone == limits[i].shm_zone) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
935 return "is duplicate";
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
936 }
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
937 }
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
938
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
939 limit = ngx_array_push(&lrcf->limits);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
940
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
941 limit->shm_zone = shm_zone;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
942 limit->burst = burst * 1000;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 658
diff changeset
943 limit->nodelay = nodelay;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
944
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
945 return NGX_CONF_OK;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
946 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
947
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
948
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
949 static ngx_int_t
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
950 ngx_http_limit_req_init(ngx_conf_t *cf)
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
951 {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
952 ngx_http_handler_pt *h;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
953 ngx_http_core_main_conf_t *cmcf;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
954
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
955 cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
956
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
957 h = ngx_array_push(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers);
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
958 if (h == NULL) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
959 return NGX_ERROR;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
960 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
961
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
962 *h = ngx_http_limit_req_handler;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
963
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
964 return NGX_OK;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
965 }