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