Mercurial > hg > nginx-quic
comparison src/http/modules/ngx_http_limit_req_module.c @ 5117:00e4459739ed
The limit_req_status and limit_conn_status directives.
Patch by Nick Marden, with minor changes.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Mon, 18 Mar 2013 14:50:29 +0000 |
parents | 949ea3d3cd1a |
children | fc595eeb6c54 |
comparison
equal
deleted
inserted
replaced
5116:4d7027deb1bb | 5117:00e4459739ed |
---|---|
51 | 51 |
52 typedef struct { | 52 typedef struct { |
53 ngx_array_t limits; | 53 ngx_array_t limits; |
54 ngx_uint_t limit_log_level; | 54 ngx_uint_t limit_log_level; |
55 ngx_uint_t delay_log_level; | 55 ngx_uint_t delay_log_level; |
56 ngx_uint_t status_code; | |
56 } ngx_http_limit_req_conf_t; | 57 } ngx_http_limit_req_conf_t; |
57 | 58 |
58 | 59 |
59 static void ngx_http_limit_req_delay(ngx_http_request_t *r); | 60 static void ngx_http_limit_req_delay(ngx_http_request_t *r); |
60 static ngx_int_t ngx_http_limit_req_lookup(ngx_http_limit_req_limit_t *limit, | 61 static ngx_int_t ngx_http_limit_req_lookup(ngx_http_limit_req_limit_t *limit, |
82 { ngx_string("error"), NGX_LOG_ERR }, | 83 { ngx_string("error"), NGX_LOG_ERR }, |
83 { ngx_null_string, 0 } | 84 { ngx_null_string, 0 } |
84 }; | 85 }; |
85 | 86 |
86 | 87 |
88 static ngx_conf_num_bounds_t ngx_http_limit_req_status_bounds = { | |
89 ngx_conf_check_num_bounds, 400, 599 | |
90 }; | |
91 | |
92 | |
87 static ngx_command_t ngx_http_limit_req_commands[] = { | 93 static ngx_command_t ngx_http_limit_req_commands[] = { |
88 | 94 |
89 { ngx_string("limit_req_zone"), | 95 { ngx_string("limit_req_zone"), |
90 NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE3, | 96 NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE3, |
91 ngx_http_limit_req_zone, | 97 ngx_http_limit_req_zone, |
104 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | 110 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, |
105 ngx_conf_set_enum_slot, | 111 ngx_conf_set_enum_slot, |
106 NGX_HTTP_LOC_CONF_OFFSET, | 112 NGX_HTTP_LOC_CONF_OFFSET, |
107 offsetof(ngx_http_limit_req_conf_t, limit_log_level), | 113 offsetof(ngx_http_limit_req_conf_t, limit_log_level), |
108 &ngx_http_limit_req_log_levels }, | 114 &ngx_http_limit_req_log_levels }, |
115 | |
116 { ngx_string("limit_req_status"), | |
117 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
118 ngx_conf_set_num_slot, | |
119 NGX_HTTP_LOC_CONF_OFFSET, | |
120 offsetof(ngx_http_limit_req_conf_t, status_code), | |
121 &ngx_http_limit_req_status_bounds }, | |
109 | 122 |
110 ngx_null_command | 123 ngx_null_command |
111 }; | 124 }; |
112 | 125 |
113 | 126 |
243 ngx_shmtx_unlock(&ctx->shpool->mutex); | 256 ngx_shmtx_unlock(&ctx->shpool->mutex); |
244 | 257 |
245 ctx->node = NULL; | 258 ctx->node = NULL; |
246 } | 259 } |
247 | 260 |
248 return NGX_HTTP_SERVICE_UNAVAILABLE; | 261 return lrcf->status_code; |
249 } | 262 } |
250 | 263 |
251 /* rc == NGX_AGAIN || rc == NGX_OK */ | 264 /* rc == NGX_AGAIN || rc == NGX_OK */ |
252 | 265 |
253 if (rc == NGX_AGAIN) { | 266 if (rc == NGX_AGAIN) { |
680 * | 693 * |
681 * conf->limits.elts = NULL; | 694 * conf->limits.elts = NULL; |
682 */ | 695 */ |
683 | 696 |
684 conf->limit_log_level = NGX_CONF_UNSET_UINT; | 697 conf->limit_log_level = NGX_CONF_UNSET_UINT; |
698 conf->status_code = NGX_CONF_UNSET_UINT; | |
685 | 699 |
686 return conf; | 700 return conf; |
687 } | 701 } |
688 | 702 |
689 | 703 |
700 ngx_conf_merge_uint_value(conf->limit_log_level, prev->limit_log_level, | 714 ngx_conf_merge_uint_value(conf->limit_log_level, prev->limit_log_level, |
701 NGX_LOG_ERR); | 715 NGX_LOG_ERR); |
702 | 716 |
703 conf->delay_log_level = (conf->limit_log_level == NGX_LOG_INFO) ? | 717 conf->delay_log_level = (conf->limit_log_level == NGX_LOG_INFO) ? |
704 NGX_LOG_INFO : conf->limit_log_level + 1; | 718 NGX_LOG_INFO : conf->limit_log_level + 1; |
719 | |
720 ngx_conf_merge_uint_value(conf->status_code, prev->status_code, | |
721 NGX_HTTP_SERVICE_UNAVAILABLE); | |
705 | 722 |
706 return NGX_CONF_OK; | 723 return NGX_CONF_OK; |
707 } | 724 } |
708 | 725 |
709 | 726 |