limit_rate_after support variables
Miroslav Novy
miranovy at gmail.com
Tue Aug 28 07:21:31 UTC 2018
Hi,
thank you for your patch. I will look at it. Why did not you merge him to
repository?
Míra
po 27. 8. 2018 v 18:00 odesílatel Ruslan Ermilov <ru at nginx.com> napsal:
> Also, Maxim Dounin reminded me that I prepared the patch set
> to add variables support to limit_rate_after roughly a year ago,
> which I have successfully forgotten now. Here it is, for your
> consideration, in the state it was a year ago.
>
> # HG changeset patch
> # Parent e3723f2a11b7ec1c196d59c331739bc21d9d9afd
> Added post processing to ngx_http_set_complex_value_slot().
>
> diff --git a/src/http/ngx_http_script.c b/src/http/ngx_http_script.c
> --- a/src/http/ngx_http_script.c
> +++ b/src/http/ngx_http_script.c
> @@ -214,6 +214,7 @@ ngx_http_set_complex_value_slot(ngx_conf
> char *p = conf;
>
> ngx_str_t *value;
> + ngx_conf_post_t *post;
> ngx_http_complex_value_t **cv;
> ngx_http_compile_complex_value_t ccv;
>
> @@ -240,6 +241,11 @@ ngx_http_set_complex_value_slot(ngx_conf
> return NGX_CONF_ERROR;
> }
>
> + if (cmd->post) {
> + post = cmd->post;
> + return post->post_handler(cf, post, *cv);
> + }
> +
> return NGX_CONF_OK;
> }
>
> # HG changeset patch
> # Parent 2b522e0bcd9fd218026f923f58a1b8bfed864b2a
> Added size_t type support to ngx_http_set_complex_value_slot().
>
> If a complex value is expected to be size_t, and the compiled value
> is constant, the ngx_http_complex_value_size_p post handler will
> remember the constant size_t value.
>
> The value is accessed through ngx_http_complex_value_size() which
> either returns the remembered constant or evaluates the expression
> and parses it as size_t.
>
> diff --git a/src/http/ngx_http_script.c b/src/http/ngx_http_script.c
> --- a/src/http/ngx_http_script.c
> +++ b/src/http/ngx_http_script.c
> @@ -10,6 +10,13 @@
> #include <ngx_http.h>
>
>
> +static char *ngx_http_complex_value_set_size(ngx_conf_t *cf, void *post,
> + void *data);
> +
> +ngx_conf_post_handler_pt ngx_http_complex_value_size_p =
> + ngx_http_complex_value_set_size;
> +
> +
> static ngx_int_t ngx_http_script_init_arrays(ngx_http_script_compile_t
> *sc);
> static ngx_int_t ngx_http_script_done(ngx_http_script_compile_t *sc);
> static ngx_int_t ngx_http_script_add_copy_code(ngx_http_script_compile_t
> *sc,
> @@ -105,6 +112,25 @@ ngx_http_complex_value(ngx_http_request_
>
>
> ngx_int_t
> +ngx_http_complex_value_size(ngx_http_request_t *r,
> + ngx_http_complex_value_t *val, ngx_str_t *value, size_t *size)
> +{
> + if (val->lengths == NULL) {
> + *size = val->u.size;
> + return NGX_OK;
> + }
> +
> + if (ngx_http_complex_value(r, val, value) != NGX_OK) {
> + return NGX_ERROR;
> + }
> +
> + *size = ngx_parse_size(value);
> +
> + return NGX_OK;
> +}
> +
> +
> +ngx_int_t
> ngx_http_compile_complex_value(ngx_http_compile_complex_value_t *ccv)
> {
> ngx_str_t *v;
> @@ -250,6 +276,24 @@ ngx_http_set_complex_value_slot(ngx_conf
> }
>
>
> +static char *
> +ngx_http_complex_value_set_size(ngx_conf_t *cf, void *post, void *data)
> +{
> + ngx_http_complex_value_t *cv = data;
> +
> + if (cv->lengths) {
> + return NGX_CONF_OK;
> + }
> +
> + cv->u.size = ngx_parse_size(&cv->value);
> + if (cv->u.size == (size_t) NGX_ERROR) {
> + return "invalid value";
> + }
> +
> + return NGX_CONF_OK;
> +}
> +
> +
> ngx_int_t
> ngx_http_test_predicates(ngx_http_request_t *r, ngx_array_t *predicates)
> {
> diff --git a/src/http/ngx_http_script.h b/src/http/ngx_http_script.h
> --- a/src/http/ngx_http_script.h
> +++ b/src/http/ngx_http_script.h
> @@ -68,6 +68,10 @@ typedef struct {
> ngx_uint_t *flushes;
> void *lengths;
> void *values;
> +
> + union {
> + size_t size;
> + } u;
> } ngx_http_complex_value_t;
>
>
> @@ -207,6 +211,8 @@ void ngx_http_script_flush_complex_value
> ngx_http_complex_value_t *val);
> ngx_int_t ngx_http_complex_value(ngx_http_request_t *r,
> ngx_http_complex_value_t *val, ngx_str_t *value);
> +ngx_int_t ngx_http_complex_value_size(ngx_http_request_t *r,
> + ngx_http_complex_value_t *val, ngx_str_t *value, size_t *size);
> ngx_int_t ngx_http_compile_complex_value(ngx_http_compile_complex_value_t
> *ccv);
> char *ngx_http_set_complex_value_slot(ngx_conf_t *cf, ngx_command_t *cmd,
> void *conf);
> @@ -254,4 +260,7 @@ void ngx_http_script_var_code(ngx_http_s
> void ngx_http_script_nop_code(ngx_http_script_engine_t *e);
>
>
> +extern ngx_conf_post_handler_pt ngx_http_complex_value_size_p;
> +
> +
> #endif /* _NGX_HTTP_SCRIPT_H_INCLUDED_ */
> # HG changeset patch
> # Parent fbf2ea9783be4eeaa938bc4173dbac1149b762dc
> Variables support in limit_rate and limit_rate_after (ticket #293).
>
> diff --git a/src/http/ngx_http_core_module.c
> b/src/http/ngx_http_core_module.c
> --- a/src/http/ngx_http_core_module.c
> +++ b/src/http/ngx_http_core_module.c
> @@ -474,18 +474,18 @@ static ngx_command_t ngx_http_core_comm
> { ngx_string("limit_rate"),
>
> NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
> |NGX_CONF_TAKE1,
> - ngx_conf_set_size_slot,
> + ngx_http_set_complex_value_slot,
> NGX_HTTP_LOC_CONF_OFFSET,
> offsetof(ngx_http_core_loc_conf_t, limit_rate),
> - NULL },
> + &ngx_http_complex_value_size_p },
>
> { ngx_string("limit_rate_after"),
>
> NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
> |NGX_CONF_TAKE1,
> - ngx_conf_set_size_slot,
> + ngx_http_set_complex_value_slot,
> NGX_HTTP_LOC_CONF_OFFSET,
> offsetof(ngx_http_core_loc_conf_t, limit_rate_after),
> - NULL },
> + &ngx_http_complex_value_size_p },
>
> { ngx_string("keepalive_timeout"),
>
> NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,
> @@ -1431,6 +1431,8 @@ ngx_http_core_content_phase(ngx_http_req
> void
> ngx_http_update_location_config(ngx_http_request_t *r)
> {
> + size_t limit_rate;
> + ngx_str_t val;
> ngx_http_core_loc_conf_t *clcf;
>
> clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
> @@ -1500,8 +1502,18 @@ ngx_http_update_location_config(ngx_http
> r->connection->tcp_nopush = NGX_TCP_NOPUSH_DISABLED;
> }
>
> - if (r->limit_rate == 0) {
> - r->limit_rate = clcf->limit_rate;
> + if (r->limit_rate == 0
> + && clcf->limit_rate
> + && ngx_http_complex_value_size(r, clcf->limit_rate, &val,
> &limit_rate)
> + == NGX_OK)
> + {
> + if (limit_rate != (size_t) NGX_ERROR) {
> + r->limit_rate = limit_rate;
> +
> + } else if (val.len) {
> + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
> + "invalid \"limit_rate\" value \"%V\"", &val);
> + }
> }
>
> if (clcf->handler) {
> @@ -3567,6 +3579,8 @@ ngx_http_core_create_loc_conf(ngx_conf_t
> * clcf->exact_match = 0;
> * clcf->auto_redirect = 0;
> * clcf->alias = 0;
> + * clcf->limit_rate = NULL;
> + * clcf->limit_rate_after = NULL;
> * clcf->gzip_proxied = 0;
> * clcf->keepalive_disable = 0;
> */
> @@ -3596,8 +3610,6 @@ ngx_http_core_create_loc_conf(ngx_conf_t
> clcf->send_timeout = NGX_CONF_UNSET_MSEC;
> clcf->send_lowat = NGX_CONF_UNSET_SIZE;
> clcf->postpone_output = NGX_CONF_UNSET_SIZE;
> - clcf->limit_rate = NGX_CONF_UNSET_SIZE;
> - clcf->limit_rate_after = NGX_CONF_UNSET_SIZE;
> clcf->keepalive_timeout = NGX_CONF_UNSET_MSEC;
> clcf->keepalive_header = NGX_CONF_UNSET;
> clcf->keepalive_requests = NGX_CONF_UNSET_UINT;
> @@ -3785,6 +3797,14 @@ ngx_http_core_merge_loc_conf(ngx_conf_t
> ngx_conf_merge_msec_value(conf->client_body_timeout,
> prev->client_body_timeout, 60000);
>
> + if (conf->limit_rate == NULL) {
> + conf->limit_rate = prev->limit_rate;
> + }
> +
> + if (conf->limit_rate_after == NULL) {
> + conf->limit_rate_after = prev->limit_rate_after;
> + }
> +
> ngx_conf_merge_bitmask_value(conf->keepalive_disable,
> prev->keepalive_disable,
> (NGX_CONF_BITMASK_SET
> @@ -3823,9 +3843,6 @@ ngx_http_core_merge_loc_conf(ngx_conf_t
> ngx_conf_merge_size_value(conf->send_lowat, prev->send_lowat, 0);
> ngx_conf_merge_size_value(conf->postpone_output,
> prev->postpone_output,
> 1460);
> - ngx_conf_merge_size_value(conf->limit_rate, prev->limit_rate, 0);
> - ngx_conf_merge_size_value(conf->limit_rate_after,
> prev->limit_rate_after,
> - 0);
> ngx_conf_merge_msec_value(conf->keepalive_timeout,
> prev->keepalive_timeout, 75000);
> ngx_conf_merge_sec_value(conf->keepalive_header,
> diff --git a/src/http/ngx_http_core_module.h
> b/src/http/ngx_http_core_module.h
> --- a/src/http/ngx_http_core_module.h
> +++ b/src/http/ngx_http_core_module.h
> @@ -358,11 +358,12 @@ struct ngx_http_core_loc_conf_s {
> size_t client_body_buffer_size; /* client_body_buffer_size */
> size_t send_lowat; /* send_lowat */
> size_t postpone_output; /* postpone_output */
> - size_t limit_rate; /* limit_rate */
> - size_t limit_rate_after; /* limit_rate_after */
> size_t sendfile_max_chunk; /* sendfile_max_chunk */
> size_t read_ahead; /* read_ahead */
>
> + ngx_http_complex_value_t *limit_rate; /* limit_rate */
> + ngx_http_complex_value_t *limit_rate_after;
> +
> ngx_msec_t client_body_timeout; /* client_body_timeout */
> ngx_msec_t send_timeout; /* send_timeout */
> ngx_msec_t keepalive_timeout; /* keepalive_timeout */
> diff --git a/src/http/ngx_http_write_filter_module.c
> b/src/http/ngx_http_write_filter_module.c
> --- a/src/http/ngx_http_write_filter_module.c
> +++ b/src/http/ngx_http_write_filter_module.c
> @@ -48,6 +48,8 @@ ngx_int_t
> ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *in)
> {
> off_t size, sent, nsent, limit;
> + size_t limit_rate_after;
> + ngx_str_t val;
> ngx_uint_t last, flush, sync;
> ngx_msec_t delay;
> ngx_chain_t *cl, *ln, **ll, *chain;
> @@ -219,8 +221,20 @@ ngx_http_write_filter(ngx_http_request_t
> }
>
> if (r->limit_rate) {
> - if (r->limit_rate_after == 0) {
> - r->limit_rate_after = clcf->limit_rate_after;
> + if (r->limit_rate_after == 0
> + && clcf->limit_rate_after
> + && ngx_http_complex_value_size(r, clcf->limit_rate_after,
> &val,
> + &limit_rate_after)
> + == NGX_OK)
> + {
> + if (limit_rate_after != (size_t) NGX_ERROR) {
> + r->limit_rate_after = limit_rate_after;
> +
> + } else if (val.len) {
> + ngx_log_error(NGX_LOG_ERR, c->log, 0,
> + "invalid \"limit_rate_after\" value \"%V\"",
> + &val);
> + }
> }
>
> limit = (off_t) r->limit_rate * (ngx_time() - r->start_sec + 1)
> _______________________________________________
> nginx-devel mailing list
> nginx-devel at nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.nginx.org/pipermail/nginx-devel/attachments/20180828/c1b9264f/attachment-0001.html>
More information about the nginx-devel
mailing list