nginxtra 1.2.6.8 → 1.2.7.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. data/bin/nginxtra +1 -1
  2. data/bin/nginxtra_rails +1 -1
  3. data/lib/nginxtra/version.rb +1 -1
  4. data/vendor/nginx/CHANGES +72 -0
  5. data/vendor/nginx/CHANGES.ru +76 -0
  6. data/vendor/nginx/LICENSE +2 -2
  7. data/vendor/nginx/auto/cc/msvc +0 -3
  8. data/vendor/nginx/auto/lib/geoip/conf +17 -2
  9. data/vendor/nginx/auto/lib/libgd/conf +1 -1
  10. data/vendor/nginx/auto/lib/pcre/conf +1 -0
  11. data/vendor/nginx/auto/lib/perl/make +1 -3
  12. data/vendor/nginx/auto/lib/zlib/conf +4 -1
  13. data/vendor/nginx/man/nginx.8 +2 -2
  14. data/vendor/nginx/src/core/nginx.h +2 -2
  15. data/vendor/nginx/src/core/ngx_conf_file.c +4 -19
  16. data/vendor/nginx/src/core/ngx_conf_file.h +1 -10
  17. data/vendor/nginx/src/core/ngx_cycle.c +2 -19
  18. data/vendor/nginx/src/core/ngx_file.c +4 -4
  19. data/vendor/nginx/src/core/ngx_inet.c +1 -1
  20. data/vendor/nginx/src/core/ngx_inet.h +1 -1
  21. data/vendor/nginx/src/core/ngx_radix_tree.c +202 -5
  22. data/vendor/nginx/src/core/ngx_radix_tree.h +9 -0
  23. data/vendor/nginx/src/event/modules/ngx_poll_module.c +2 -2
  24. data/vendor/nginx/src/event/ngx_event.c +4 -0
  25. data/vendor/nginx/src/event/ngx_event_openssl.c +27 -13
  26. data/vendor/nginx/src/http/modules/ngx_http_auth_basic_module.c +38 -49
  27. data/vendor/nginx/src/http/modules/ngx_http_fastcgi_module.c +44 -59
  28. data/vendor/nginx/src/http/modules/ngx_http_geo_module.c +310 -103
  29. data/vendor/nginx/src/http/modules/ngx_http_geoip_module.c +145 -15
  30. data/vendor/nginx/src/http/modules/ngx_http_gzip_filter_module.c +5 -1
  31. data/vendor/nginx/src/http/modules/ngx_http_headers_filter_module.c +1 -0
  32. data/vendor/nginx/src/http/modules/ngx_http_image_filter_module.c +27 -13
  33. data/vendor/nginx/src/http/modules/ngx_http_log_module.c +378 -40
  34. data/vendor/nginx/src/http/modules/ngx_http_map_module.c +7 -0
  35. data/vendor/nginx/src/http/modules/ngx_http_proxy_module.c +9 -7
  36. data/vendor/nginx/src/http/modules/ngx_http_scgi_module.c +1 -1
  37. data/vendor/nginx/src/http/modules/ngx_http_secure_link_module.c +15 -2
  38. data/vendor/nginx/src/http/modules/ngx_http_split_clients_module.c +1 -1
  39. data/vendor/nginx/src/http/modules/ngx_http_sub_filter_module.c +2 -2
  40. data/vendor/nginx/src/http/modules/ngx_http_upstream_keepalive_module.c +4 -0
  41. data/vendor/nginx/src/http/modules/ngx_http_upstream_least_conn_module.c +3 -1
  42. data/vendor/nginx/src/http/modules/ngx_http_uwsgi_module.c +1 -1
  43. data/vendor/nginx/src/http/modules/ngx_http_xslt_filter_module.c +2 -2
  44. data/vendor/nginx/src/http/modules/perl/Makefile.PL +3 -14
  45. data/vendor/nginx/src/http/modules/perl/nginx.pm +2 -2
  46. data/vendor/nginx/src/http/ngx_http_core_module.c +2 -1
  47. data/vendor/nginx/src/http/ngx_http_script.c +3 -7
  48. data/vendor/nginx/src/http/ngx_http_upstream.c +9 -0
  49. data/vendor/nginx/src/http/ngx_http_upstream_round_robin.c +3 -1
  50. data/vendor/nginx/src/http/ngx_http_variables.c +114 -0
  51. data/vendor/nginx/src/http/ngx_http_write_filter_module.c +1 -1
  52. data/vendor/nginx/src/os/unix/ngx_files.c +1 -1
  53. data/vendor/nginx/src/os/unix/ngx_user.c +13 -14
  54. metadata +2 -2
@@ -209,6 +209,13 @@ ngx_http_map_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
209
209
  }
210
210
 
211
211
  name = value[2];
212
+
213
+ if (name.data[0] != '$') {
214
+ ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
215
+ "invalid variable name \"%V\"", &name);
216
+ return NGX_CONF_ERROR;
217
+ }
218
+
212
219
  name.len--;
213
220
  name.data++;
214
221
 
@@ -836,7 +836,7 @@ ngx_http_proxy_create_key(ngx_http_request_t *r)
836
836
  return NGX_ERROR;
837
837
  }
838
838
 
839
- if (plcf->cache_key.value.len) {
839
+ if (plcf->cache_key.value.data) {
840
840
 
841
841
  if (ngx_http_complex_value(r, &plcf->cache_key, key) != NGX_OK) {
842
842
  return NGX_ERROR;
@@ -1610,7 +1610,8 @@ ngx_http_proxy_copy_filter(ngx_event_pipe_t *p, ngx_buf_t *buf)
1610
1610
  p->upstream_done = 1;
1611
1611
 
1612
1612
  ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,
1613
- "upstream sent too much data");
1613
+ "upstream sent more data than specified in "
1614
+ "\"Content-Length\" header");
1614
1615
  }
1615
1616
 
1616
1617
  return NGX_OK;
@@ -2607,7 +2608,7 @@ ngx_http_proxy_create_loc_conf(ngx_conf_t *cf)
2607
2608
  * conf->upstream.store_lengths = NULL;
2608
2609
  * conf->upstream.store_values = NULL;
2609
2610
  *
2610
- * conf->method = NULL;
2611
+ * conf->method = { 0, NULL };
2611
2612
  * conf->headers_source = NULL;
2612
2613
  * conf->headers_set_len = NULL;
2613
2614
  * conf->headers_set = NULL;
@@ -2906,10 +2907,11 @@ ngx_http_proxy_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
2906
2907
 
2907
2908
  #endif
2908
2909
 
2909
- if (conf->method.len == 0) {
2910
- conf->method = prev->method;
2910
+ ngx_conf_merge_str_value(conf->method, prev->method, "");
2911
2911
 
2912
- } else {
2912
+ if (conf->method.len
2913
+ && conf->method.data[conf->method.len - 1] != ' ')
2914
+ {
2913
2915
  conf->method.data[conf->method.len] = ' ';
2914
2916
  conf->method.len++;
2915
2917
  }
@@ -3918,7 +3920,7 @@ ngx_http_proxy_cache_key(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
3918
3920
 
3919
3921
  value = cf->args->elts;
3920
3922
 
3921
- if (plcf->cache_key.value.len) {
3923
+ if (plcf->cache_key.value.data) {
3922
3924
  return "is duplicate";
3923
3925
  }
3924
3926
 
@@ -1765,7 +1765,7 @@ ngx_http_scgi_cache_key(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
1765
1765
 
1766
1766
  value = cf->args->elts;
1767
1767
 
1768
- if (scf->cache_key.value.len) {
1768
+ if (scf->cache_key.value.data) {
1769
1769
  return "is duplicate";
1770
1770
  }
1771
1771
 
@@ -111,7 +111,7 @@ ngx_http_secure_link_variable(ngx_http_request_t *r,
111
111
 
112
112
  conf = ngx_http_get_module_loc_conf(r, ngx_http_secure_link_module);
113
113
 
114
- if (conf->secret.len) {
114
+ if (conf->secret.data) {
115
115
  return ngx_http_secure_link_old_variable(r, conf, v, data);
116
116
  }
117
117
 
@@ -318,7 +318,16 @@ ngx_http_secure_link_merge_conf(ngx_conf_t *cf, void *parent, void *child)
318
318
  ngx_http_secure_link_conf_t *prev = parent;
319
319
  ngx_http_secure_link_conf_t *conf = child;
320
320
 
321
- ngx_conf_merge_str_value(conf->secret, prev->secret, "");
321
+ if (conf->secret.data) {
322
+ if (conf->variable || conf->md5) {
323
+ ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
324
+ "\"secure_link_secret\" cannot be mixed with "
325
+ "\"secure_link\" and \"secure_link_md5\"");
326
+ return NGX_CONF_ERROR;
327
+ }
328
+
329
+ return NGX_CONF_OK;
330
+ }
322
331
 
323
332
  if (conf->variable == NULL) {
324
333
  conf->variable = prev->variable;
@@ -328,6 +337,10 @@ ngx_http_secure_link_merge_conf(ngx_conf_t *cf, void *parent, void *child)
328
337
  conf->md5 = prev->md5;
329
338
  }
330
339
 
340
+ if (conf->variable == NULL && conf->md5 == NULL) {
341
+ conf->secret = prev->secret;
342
+ }
343
+
331
344
  return NGX_CONF_OK;
332
345
  }
333
346
 
@@ -139,7 +139,7 @@ ngx_conf_split_clients_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
139
139
 
140
140
  name = value[2];
141
141
 
142
- if (name.len < 2 || name.data[0] != '$') {
142
+ if (name.data[0] != '$') {
143
143
  ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
144
144
  "invalid variable name \"%V\"", &name);
145
145
  return NGX_CONF_ERROR;
@@ -627,7 +627,7 @@ ngx_http_sub_filter(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
627
627
  ngx_str_t *value;
628
628
  ngx_http_compile_complex_value_t ccv;
629
629
 
630
- if (slcf->match.len) {
630
+ if (slcf->match.data) {
631
631
  return "is duplicate";
632
632
  }
633
633
 
@@ -687,7 +687,7 @@ ngx_http_sub_merge_conf(ngx_conf_t *cf, void *parent, void *child)
687
687
  ngx_conf_merge_value(conf->once, prev->once, 1);
688
688
  ngx_conf_merge_str_value(conf->match, prev->match, "");
689
689
 
690
- if (conf->value.value.len == 0) {
690
+ if (conf->value.value.data == NULL) {
691
691
  conf->value = prev->value;
692
692
  }
693
693
 
@@ -502,6 +502,10 @@ ngx_http_upstream_keepalive(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
502
502
  kcf = ngx_http_conf_upstream_srv_conf(uscf,
503
503
  ngx_http_upstream_keepalive_module);
504
504
 
505
+ if (kcf->original_init_upstream) {
506
+ return "is duplicate";
507
+ }
508
+
505
509
  kcf->original_init_upstream = uscf->peer.init_upstream
506
510
  ? uscf->peer.init_upstream
507
511
  : ngx_http_upstream_init_round_robin;
@@ -313,7 +313,9 @@ failed:
313
313
  lcp->rrp.peers = peers->next;
314
314
  pc->tries = lcp->rrp.peers->number;
315
315
 
316
- n = lcp->rrp.peers->number / (8 * sizeof(uintptr_t)) + 1;
316
+ n = (lcp->rrp.peers->number + (8 * sizeof(uintptr_t) - 1))
317
+ / (8 * sizeof(uintptr_t));
318
+
317
319
  for (i = 0; i < n; i++) {
318
320
  lcp->rrp.tried[i] = 0;
319
321
  }
@@ -1807,7 +1807,7 @@ ngx_http_uwsgi_cache_key(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
1807
1807
 
1808
1808
  value = cf->args->elts;
1809
1809
 
1810
- if (uwcf->cache_key.value.len) {
1810
+ if (uwcf->cache_key.value.data) {
1811
1811
  return "is duplicate";
1812
1812
  }
1813
1813
 
@@ -307,7 +307,7 @@ ngx_http_xslt_send(ngx_http_request_t *r, ngx_http_xslt_filter_ctx_t *ctx,
307
307
  ctx->done = 1;
308
308
 
309
309
  if (b == NULL) {
310
- return ngx_http_filter_finalize_request(r, NULL,
310
+ return ngx_http_filter_finalize_request(r, &ngx_http_xslt_filter_module,
311
311
  NGX_HTTP_INTERNAL_SERVER_ERROR);
312
312
  }
313
313
 
@@ -315,7 +315,7 @@ ngx_http_xslt_send(ngx_http_request_t *r, ngx_http_xslt_filter_ctx_t *ctx,
315
315
 
316
316
  if (cln == NULL) {
317
317
  ngx_free(b->pos);
318
- return ngx_http_filter_finalize_request(r, NULL,
318
+ return ngx_http_filter_finalize_request(r, &ngx_http_xslt_filter_module,
319
319
  NGX_HTTP_INTERNAL_SERVER_ERROR);
320
320
  }
321
321
 
@@ -16,20 +16,9 @@ WriteMakefile(
16
16
  CCFLAGS => "$ENV{NGX_PM_CFLAGS}",
17
17
  OPTIMIZE => '-O',
18
18
 
19
- INC => "-I ../../../../../src/core " .
20
- "-I ../../../../../src/event " .
21
- "-I ../../../../../src/os/unix " .
22
- "-I ../../../../../src/http " .
23
- "-I ../../../../../src/http/modules " .
24
- "-I ../../../../../src/http/modules/perl " .
25
- "-I ../../../../../$ENV{NGX_OBJS} " .
26
- ($ENV{NGX_PCRE} =~ /^(YES|NO)/ ? "" :
27
- ($ENV{NGX_PCRE} =~ m#^/# ? "-I $ENV{NGX_PCRE} " :
28
- "-I ../../../../../$ENV{NGX_PCRE} ")) .
29
- ($ENV{NGX_OPENSSL} =~ /^(YES|NO)/ ? "" :
30
- ($ENV{NGX_OPENSSL} =~ m#^/# ?
31
- "-I $ENV{NGX_OPENSSL}/.openssl/include " :
32
- "-I ../../../../../$ENV{NGX_OPENSSL}/.openssl/include ")),
19
+ INC => join(" ", map {
20
+ m#^/# ? "-I $_" : "-I ../../../../../$_"
21
+ } (split /\s+/, $ENV{NGX_INCS})),
33
22
 
34
23
  depend => {
35
24
  'nginx.c' =>
@@ -50,7 +50,7 @@ our @EXPORT = qw(
50
50
  HTTP_INSUFFICIENT_STORAGE
51
51
  );
52
52
 
53
- our $VERSION = '1.2.6';
53
+ our $VERSION = '1.2.7';
54
54
 
55
55
  require XSLoader;
56
56
  XSLoader::load('nginx', $VERSION);
@@ -123,7 +123,7 @@ This module provides a Perl interface to the nginx HTTP server API.
123
123
 
124
124
  =head1 SEE ALSO
125
125
 
126
- http://sysoev.ru/nginx/docs/http/ngx_http_perl_module.html
126
+ http://nginx.org/en/docs/http/ngx_http_perl_module.html
127
127
 
128
128
  =head1 AUTHOR
129
129
 
@@ -993,6 +993,7 @@ ngx_http_core_find_config_phase(ngx_http_request_t *r,
993
993
  "client intended to send too large body: %O bytes",
994
994
  r->headers_in.content_length_n);
995
995
 
996
+ r->expect_tested = 1;
996
997
  (void) ngx_http_discard_request_body(r);
997
998
  ngx_http_finalize_request(r, NGX_HTTP_REQUEST_ENTITY_TOO_LARGE);
998
999
  return NGX_OK;
@@ -4544,7 +4545,7 @@ ngx_http_core_error_page(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
4544
4545
 
4545
4546
  ngx_str_null(&args);
4546
4547
 
4547
- if (cv.lengths == NULL && uri.data[0] == '/') {
4548
+ if (cv.lengths == NULL && uri.len && uri.data[0] == '/') {
4548
4549
  p = (u_char *) ngx_strchr(uri.data, '?');
4549
4550
 
4550
4551
  if (p) {
@@ -114,11 +114,6 @@ ngx_http_compile_complex_value(ngx_http_compile_complex_value_t *ccv)
114
114
 
115
115
  v = ccv->value;
116
116
 
117
- if (v->len == 0) {
118
- ngx_conf_log_error(NGX_LOG_EMERG, ccv->cf, 0, "empty parameter");
119
- return NGX_ERROR;
120
- }
121
-
122
117
  nv = 0;
123
118
  nc = 0;
124
119
 
@@ -133,8 +128,9 @@ ngx_http_compile_complex_value(ngx_http_compile_complex_value_t *ccv)
133
128
  }
134
129
  }
135
130
 
136
- if (v->data[0] != '$' && (ccv->conf_prefix || ccv->root_prefix)) {
137
-
131
+ if ((v->len == 0 || v->data[0] != '$')
132
+ && (ccv->conf_prefix || ccv->root_prefix))
133
+ {
138
134
  if (ngx_conf_full_name(ccv->cf->cycle, v, ccv->conf_prefix) != NGX_OK) {
139
135
  return NGX_ERROR;
140
136
  }
@@ -636,6 +636,14 @@ ngx_http_upstream_init_request(ngx_http_request_t *r)
636
636
 
637
637
  found:
638
638
 
639
+ if (uscf == NULL) {
640
+ ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
641
+ "no upstream configuration");
642
+ ngx_http_upstream_finalize_request(r, u,
643
+ NGX_HTTP_INTERNAL_SERVER_ERROR);
644
+ return;
645
+ }
646
+
639
647
  if (uscf->peer.init(r, uscf) != NGX_OK) {
640
648
  ngx_http_upstream_finalize_request(r, u,
641
649
  NGX_HTTP_INTERNAL_SERVER_ERROR);
@@ -3091,6 +3099,7 @@ ngx_http_upstream_finalize_request(ngx_http_request_t *r,
3091
3099
  r->connection->log->action = "sending to client";
3092
3100
 
3093
3101
  if (rc == 0
3102
+ && !r->header_only
3094
3103
  #if (NGX_HTTP_CACHE)
3095
3104
  && !r->cached
3096
3105
  #endif
@@ -474,7 +474,9 @@ failed:
474
474
  rrp->peers = peers->next;
475
475
  pc->tries = rrp->peers->number;
476
476
 
477
- n = rrp->peers->number / (8 * sizeof(uintptr_t)) + 1;
477
+ n = (rrp->peers->number + (8 * sizeof(uintptr_t) - 1))
478
+ / (8 * sizeof(uintptr_t));
479
+
478
480
  for (i = 0; i < n; i++) {
479
481
  rrp->tried[i] = 0;
480
482
  }
@@ -73,12 +73,16 @@ static ngx_int_t ngx_http_variable_bytes_sent(ngx_http_request_t *r,
73
73
  ngx_http_variable_value_t *v, uintptr_t data);
74
74
  static ngx_int_t ngx_http_variable_body_bytes_sent(ngx_http_request_t *r,
75
75
  ngx_http_variable_value_t *v, uintptr_t data);
76
+ static ngx_int_t ngx_http_variable_pipe(ngx_http_request_t *r,
77
+ ngx_http_variable_value_t *v, uintptr_t data);
76
78
  static ngx_int_t ngx_http_variable_request_completion(ngx_http_request_t *r,
77
79
  ngx_http_variable_value_t *v, uintptr_t data);
78
80
  static ngx_int_t ngx_http_variable_request_body(ngx_http_request_t *r,
79
81
  ngx_http_variable_value_t *v, uintptr_t data);
80
82
  static ngx_int_t ngx_http_variable_request_body_file(ngx_http_request_t *r,
81
83
  ngx_http_variable_value_t *v, uintptr_t data);
84
+ static ngx_int_t ngx_http_variable_request_length(ngx_http_request_t *r,
85
+ ngx_http_variable_value_t *v, uintptr_t data);
82
86
  static ngx_int_t ngx_http_variable_request_time(ngx_http_request_t *r,
83
87
  ngx_http_variable_value_t *v, uintptr_t data);
84
88
  static ngx_int_t ngx_http_variable_status(ngx_http_request_t *r,
@@ -112,6 +116,10 @@ static ngx_int_t ngx_http_variable_pid(ngx_http_request_t *r,
112
116
  ngx_http_variable_value_t *v, uintptr_t data);
113
117
  static ngx_int_t ngx_http_variable_msec(ngx_http_request_t *r,
114
118
  ngx_http_variable_value_t *v, uintptr_t data);
119
+ static ngx_int_t ngx_http_variable_time_iso8601(ngx_http_request_t *r,
120
+ ngx_http_variable_value_t *v, uintptr_t data);
121
+ static ngx_int_t ngx_http_variable_time_local(ngx_http_request_t *r,
122
+ ngx_http_variable_value_t *v, uintptr_t data);
115
123
 
116
124
  /*
117
125
  * TODO:
@@ -229,6 +237,9 @@ static ngx_http_variable_t ngx_http_core_variables[] = {
229
237
  { ngx_string("body_bytes_sent"), NULL, ngx_http_variable_body_bytes_sent,
230
238
  0, 0, 0 },
231
239
 
240
+ { ngx_string("pipe"), NULL, ngx_http_variable_pipe,
241
+ 0, 0, 0 },
242
+
232
243
  { ngx_string("request_completion"), NULL,
233
244
  ngx_http_variable_request_completion,
234
245
  0, 0, 0 },
@@ -241,6 +252,9 @@ static ngx_http_variable_t ngx_http_core_variables[] = {
241
252
  ngx_http_variable_request_body_file,
242
253
  0, 0, 0 },
243
254
 
255
+ { ngx_string("request_length"), NULL, ngx_http_variable_request_length,
256
+ 0, NGX_HTTP_VAR_NOCACHEABLE, 0 },
257
+
244
258
  { ngx_string("request_time"), NULL, ngx_http_variable_request_time,
245
259
  0, NGX_HTTP_VAR_NOCACHEABLE, 0 },
246
260
 
@@ -295,6 +309,12 @@ static ngx_http_variable_t ngx_http_core_variables[] = {
295
309
  { ngx_string("msec"), NULL, ngx_http_variable_msec,
296
310
  0, NGX_HTTP_VAR_NOCACHEABLE, 0 },
297
311
 
312
+ { ngx_string("time_iso8601"), NULL, ngx_http_variable_time_iso8601,
313
+ 0, NGX_HTTP_VAR_NOCACHEABLE, 0 },
314
+
315
+ { ngx_string("time_local"), NULL, ngx_http_variable_time_local,
316
+ 0, NGX_HTTP_VAR_NOCACHEABLE, 0 },
317
+
298
318
  #if (NGX_HAVE_TCP_INFO)
299
319
  { ngx_string("tcpinfo_rtt"), NULL, ngx_http_variable_tcpinfo,
300
320
  0, NGX_HTTP_VAR_NOCACHEABLE, 0 },
@@ -328,6 +348,12 @@ ngx_http_add_variable(ngx_conf_t *cf, ngx_str_t *name, ngx_uint_t flags)
328
348
  ngx_http_variable_t *v;
329
349
  ngx_http_core_main_conf_t *cmcf;
330
350
 
351
+ if (name->len == 0) {
352
+ ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
353
+ "invalid variable name \"$\"");
354
+ return NULL;
355
+ }
356
+
331
357
  cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
332
358
 
333
359
  key = cmcf->variables_keys->keys.elts;
@@ -391,6 +417,12 @@ ngx_http_get_variable_index(ngx_conf_t *cf, ngx_str_t *name)
391
417
  ngx_http_variable_t *v;
392
418
  ngx_http_core_main_conf_t *cmcf;
393
419
 
420
+ if (name->len == 0) {
421
+ ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
422
+ "invalid variable name \"$\"");
423
+ return NGX_ERROR;
424
+ }
425
+
394
426
  cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
395
427
 
396
428
  v = cmcf->variables.elts;
@@ -1508,6 +1540,20 @@ ngx_http_variable_body_bytes_sent(ngx_http_request_t *r,
1508
1540
  }
1509
1541
 
1510
1542
 
1543
+ static ngx_int_t
1544
+ ngx_http_variable_pipe(ngx_http_request_t *r,
1545
+ ngx_http_variable_value_t *v, uintptr_t data)
1546
+ {
1547
+ v->data = (u_char *) (r->pipeline ? "p" : ".");
1548
+ v->len = 1;
1549
+ v->valid = 1;
1550
+ v->no_cacheable = 0;
1551
+ v->not_found = 0;
1552
+
1553
+ return NGX_OK;
1554
+ }
1555
+
1556
+
1511
1557
  static ngx_int_t
1512
1558
  ngx_http_variable_status(ngx_http_request_t *r,
1513
1559
  ngx_http_variable_value_t *v, uintptr_t data)
@@ -1842,6 +1888,27 @@ ngx_http_variable_request_body_file(ngx_http_request_t *r,
1842
1888
  }
1843
1889
 
1844
1890
 
1891
+ static ngx_int_t
1892
+ ngx_http_variable_request_length(ngx_http_request_t *r,
1893
+ ngx_http_variable_value_t *v, uintptr_t data)
1894
+ {
1895
+ u_char *p;
1896
+
1897
+ p = ngx_pnalloc(r->pool, NGX_OFF_T_LEN);
1898
+ if (p == NULL) {
1899
+ return NGX_ERROR;
1900
+ }
1901
+
1902
+ v->len = ngx_sprintf(p, "%O", r->request_length) - p;
1903
+ v->valid = 1;
1904
+ v->no_cacheable = 0;
1905
+ v->not_found = 0;
1906
+ v->data = p;
1907
+
1908
+ return NGX_OK;
1909
+ }
1910
+
1911
+
1845
1912
  static ngx_int_t
1846
1913
  ngx_http_variable_request_time(ngx_http_request_t *r,
1847
1914
  ngx_http_variable_value_t *v, uintptr_t data)
@@ -1986,6 +2053,53 @@ ngx_http_variable_msec(ngx_http_request_t *r,
1986
2053
  }
1987
2054
 
1988
2055
 
2056
+ static ngx_int_t
2057
+ ngx_http_variable_time_iso8601(ngx_http_request_t *r,
2058
+ ngx_http_variable_value_t *v, uintptr_t data)
2059
+ {
2060
+ u_char *p;
2061
+
2062
+ p = ngx_pnalloc(r->pool, ngx_cached_http_log_iso8601.len);
2063
+ if (p == NULL) {
2064
+ return NGX_ERROR;
2065
+ }
2066
+
2067
+ ngx_memcpy(p, ngx_cached_http_log_iso8601.data,
2068
+ ngx_cached_http_log_iso8601.len);
2069
+
2070
+ v->len = ngx_cached_http_log_iso8601.len;
2071
+ v->valid = 1;
2072
+ v->no_cacheable = 0;
2073
+ v->not_found = 0;
2074
+ v->data = p;
2075
+
2076
+ return NGX_OK;
2077
+ }
2078
+
2079
+
2080
+ static ngx_int_t
2081
+ ngx_http_variable_time_local(ngx_http_request_t *r,
2082
+ ngx_http_variable_value_t *v, uintptr_t data)
2083
+ {
2084
+ u_char *p;
2085
+
2086
+ p = ngx_pnalloc(r->pool, ngx_cached_http_log_time.len);
2087
+ if (p == NULL) {
2088
+ return NGX_ERROR;
2089
+ }
2090
+
2091
+ ngx_memcpy(p, ngx_cached_http_log_time.data, ngx_cached_http_log_time.len);
2092
+
2093
+ v->len = ngx_cached_http_log_time.len;
2094
+ v->valid = 1;
2095
+ v->no_cacheable = 0;
2096
+ v->not_found = 0;
2097
+ v->data = p;
2098
+
2099
+ return NGX_OK;
2100
+ }
2101
+
2102
+
1989
2103
  void *
1990
2104
  ngx_http_map_find(ngx_http_request_t *r, ngx_http_map_t *map, ngx_str_t *match)
1991
2105
  {