mirror of
https://github.com/nginx/nginx.git
synced 2024-12-19 05:33:52 -06:00
limit_rate_after
This commit is contained in:
parent
f0a827adcb
commit
80027fc0a2
@ -433,6 +433,14 @@ static ngx_command_t ngx_http_core_commands[] = {
|
||||
offsetof(ngx_http_core_loc_conf_t, limit_rate),
|
||||
NULL },
|
||||
|
||||
{ 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_LOC_CONF_OFFSET,
|
||||
offsetof(ngx_http_core_loc_conf_t, limit_rate_after),
|
||||
NULL },
|
||||
|
||||
{ ngx_string("keepalive_timeout"),
|
||||
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,
|
||||
ngx_http_core_keepalive,
|
||||
@ -2924,6 +2932,7 @@ ngx_http_core_create_loc_conf(ngx_conf_t *cf)
|
||||
lcf->send_lowat = NGX_CONF_UNSET_SIZE;
|
||||
lcf->postpone_output = NGX_CONF_UNSET_SIZE;
|
||||
lcf->limit_rate = NGX_CONF_UNSET_SIZE;
|
||||
lcf->limit_rate_after = NGX_CONF_UNSET_SIZE;
|
||||
lcf->keepalive_timeout = NGX_CONF_UNSET_MSEC;
|
||||
lcf->keepalive_header = NGX_CONF_UNSET;
|
||||
lcf->keepalive_requests = NGX_CONF_UNSET_UINT;
|
||||
@ -3123,6 +3132,8 @@ ngx_http_core_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
|
||||
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,
|
||||
|
@ -324,6 +324,7 @@ struct ngx_http_core_loc_conf_s {
|
||||
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 */
|
||||
|
||||
ngx_msec_t client_body_timeout; /* client_body_timeout */
|
||||
|
@ -46,7 +46,7 @@ ngx_module_t ngx_http_write_filter_module = {
|
||||
ngx_int_t
|
||||
ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *in)
|
||||
{
|
||||
off_t size, sent, limit;
|
||||
off_t size, sent, nsent, limit;
|
||||
ngx_uint_t last, flush;
|
||||
ngx_msec_t delay;
|
||||
ngx_chain_t *cl, *ln, **ll, *chain;
|
||||
@ -210,7 +210,8 @@ ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *in)
|
||||
}
|
||||
|
||||
if (r->limit_rate) {
|
||||
limit = r->limit_rate * (ngx_time() - r->start_sec + 1) - c->sent;
|
||||
limit = r->limit_rate * (ngx_time() - r->start_sec + 1)
|
||||
- (c->sent - clcf->limit_rate_after);
|
||||
|
||||
if (limit <= 0) {
|
||||
c->write->delayed = 1;
|
||||
@ -245,7 +246,23 @@ ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *in)
|
||||
}
|
||||
|
||||
if (r->limit_rate) {
|
||||
delay = (ngx_msec_t) ((c->sent - sent) * 1000 / r->limit_rate + 1);
|
||||
|
||||
nsent = c->sent;
|
||||
|
||||
if (clcf->limit_rate_after) {
|
||||
|
||||
sent -= clcf->limit_rate_after;
|
||||
if (sent < 0) {
|
||||
sent = 0;
|
||||
}
|
||||
|
||||
nsent -= clcf->limit_rate_after;
|
||||
if (nsent < 0) {
|
||||
nsent = 0;
|
||||
}
|
||||
}
|
||||
|
||||
delay = (ngx_msec_t) ((nsent - sent) * 1000 / r->limit_rate + 1);
|
||||
|
||||
if (delay > 0) {
|
||||
c->write->delayed = 1;
|
||||
|
Loading…
Reference in New Issue
Block a user