comparison src/http/ngx_http_variables.c @ 7504:c19ca381b2e6

Variables support in limit_rate and limit_rate_after (ticket #293).
author Ruslan Ermilov <ru@nginx.com>
date Wed, 24 Apr 2019 16:38:54 +0300
parents 81d49f85afed
children 06b01840bd42
comparison
equal deleted inserted replaced
7503:b82162b8496a 7504:c19ca381b2e6
20 static void ngx_http_variable_request_set(ngx_http_request_t *r, 20 static void ngx_http_variable_request_set(ngx_http_request_t *r,
21 ngx_http_variable_value_t *v, uintptr_t data); 21 ngx_http_variable_value_t *v, uintptr_t data);
22 #endif 22 #endif
23 static ngx_int_t ngx_http_variable_request_get_size(ngx_http_request_t *r, 23 static ngx_int_t ngx_http_variable_request_get_size(ngx_http_request_t *r,
24 ngx_http_variable_value_t *v, uintptr_t data); 24 ngx_http_variable_value_t *v, uintptr_t data);
25 static void ngx_http_variable_request_set_size(ngx_http_request_t *r,
26 ngx_http_variable_value_t *v, uintptr_t data);
27 static ngx_int_t ngx_http_variable_header(ngx_http_request_t *r, 25 static ngx_int_t ngx_http_variable_header(ngx_http_request_t *r,
28 ngx_http_variable_value_t *v, uintptr_t data); 26 ngx_http_variable_value_t *v, uintptr_t data);
29 27
30 static ngx_int_t ngx_http_variable_cookies(ngx_http_request_t *r, 28 static ngx_int_t ngx_http_variable_cookies(ngx_http_request_t *r,
31 ngx_http_variable_value_t *v, uintptr_t data); 29 ngx_http_variable_value_t *v, uintptr_t data);
121 static ngx_int_t ngx_http_variable_sent_connection(ngx_http_request_t *r, 119 static ngx_int_t ngx_http_variable_sent_connection(ngx_http_request_t *r,
122 ngx_http_variable_value_t *v, uintptr_t data); 120 ngx_http_variable_value_t *v, uintptr_t data);
123 static ngx_int_t ngx_http_variable_sent_keep_alive(ngx_http_request_t *r, 121 static ngx_int_t ngx_http_variable_sent_keep_alive(ngx_http_request_t *r,
124 ngx_http_variable_value_t *v, uintptr_t data); 122 ngx_http_variable_value_t *v, uintptr_t data);
125 static ngx_int_t ngx_http_variable_sent_transfer_encoding(ngx_http_request_t *r, 123 static ngx_int_t ngx_http_variable_sent_transfer_encoding(ngx_http_request_t *r,
124 ngx_http_variable_value_t *v, uintptr_t data);
125 static void ngx_http_variable_set_limit_rate(ngx_http_request_t *r,
126 ngx_http_variable_value_t *v, uintptr_t data); 126 ngx_http_variable_value_t *v, uintptr_t data);
127 127
128 static ngx_int_t ngx_http_variable_connection(ngx_http_request_t *r, 128 static ngx_int_t ngx_http_variable_connection(ngx_http_request_t *r,
129 ngx_http_variable_value_t *v, uintptr_t data); 129 ngx_http_variable_value_t *v, uintptr_t data);
130 static ngx_int_t ngx_http_variable_connection_requests(ngx_http_request_t *r, 130 static ngx_int_t ngx_http_variable_connection_requests(ngx_http_request_t *r,
319 offsetof(ngx_http_request_t, headers_out.cache_control), 0, 0 }, 319 offsetof(ngx_http_request_t, headers_out.cache_control), 0, 0 },
320 320
321 { ngx_string("sent_http_link"), NULL, ngx_http_variable_headers, 321 { ngx_string("sent_http_link"), NULL, ngx_http_variable_headers,
322 offsetof(ngx_http_request_t, headers_out.link), 0, 0 }, 322 offsetof(ngx_http_request_t, headers_out.link), 0, 0 },
323 323
324 { ngx_string("limit_rate"), ngx_http_variable_request_set_size, 324 { ngx_string("limit_rate"), ngx_http_variable_set_limit_rate,
325 ngx_http_variable_request_get_size, 325 ngx_http_variable_request_get_size,
326 offsetof(ngx_http_request_t, limit_rate), 326 offsetof(ngx_http_request_t, limit_rate),
327 NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE, 0 }, 327 NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE, 0 },
328 328
329 { ngx_string("connection"), NULL, 329 { ngx_string("connection"), NULL,
786 786
787 return NGX_OK; 787 return NGX_OK;
788 } 788 }
789 789
790 790
791 static void
792 ngx_http_variable_request_set_size(ngx_http_request_t *r,
793 ngx_http_variable_value_t *v, uintptr_t data)
794 {
795 ssize_t s, *sp;
796 ngx_str_t val;
797
798 val.len = v->len;
799 val.data = v->data;
800
801 s = ngx_parse_size(&val);
802
803 if (s == NGX_ERROR) {
804 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
805 "invalid size \"%V\"", &val);
806 return;
807 }
808
809 sp = (ssize_t *) ((char *) r + data);
810
811 *sp = s;
812
813 return;
814 }
815
816
817 static ngx_int_t 791 static ngx_int_t
818 ngx_http_variable_header(ngx_http_request_t *r, ngx_http_variable_value_t *v, 792 ngx_http_variable_header(ngx_http_request_t *r, ngx_http_variable_value_t *v,
819 uintptr_t data) 793 uintptr_t data)
820 { 794 {
821 ngx_table_elt_t *h; 795 ngx_table_elt_t *h;
1988 } else { 1962 } else {
1989 v->not_found = 1; 1963 v->not_found = 1;
1990 } 1964 }
1991 1965
1992 return NGX_OK; 1966 return NGX_OK;
1967 }
1968
1969
1970 static void
1971 ngx_http_variable_set_limit_rate(ngx_http_request_t *r,
1972 ngx_http_variable_value_t *v, uintptr_t data)
1973 {
1974 ssize_t s;
1975 ngx_str_t val;
1976
1977 val.len = v->len;
1978 val.data = v->data;
1979
1980 s = ngx_parse_size(&val);
1981
1982 if (s == NGX_ERROR) {
1983 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
1984 "invalid $limit_rate \"%V\"", &val);
1985 return;
1986 }
1987
1988 r->limit_rate = s;
1989 r->limit_rate_set = 1;
1993 } 1990 }
1994 1991
1995 1992
1996 static ngx_int_t 1993 static ngx_int_t
1997 ngx_http_variable_request_completion(ngx_http_request_t *r, 1994 ngx_http_variable_request_completion(ngx_http_request_t *r,