Mercurial > hg > nginx-vendor-0-7
comparison src/http/ngx_http_variables.c @ 126:df17fbafec8f NGINX_0_3_10
nginx 0.3.10
*) Change: the "valid_referers" directive and the "$invalid_referer"
variable were moved to the new ngx_http_referer_module from the
ngx_http_rewrite_module.
*) Change: the "$apache_bytes_sent" variable name was changed to
"$body_bytes_sent".
*) Feature: the "$sent_http_..." variables.
*) Feature: the "if" directive supports the "=" and "!=" operations.
*) Feature: the "proxy_pass" directive supports the HTTPS protocol.
*) Feature: the "proxy_set_body" directive.
*) Feature: the "post_action" directive.
*) Feature: the ngx_http_empty_gif_module.
*) Feature: the "worker_cpu_affinity" directive for Linux.
*) Bugfix: the "rewrite" directive did not unescape URI part in
redirect, now it is unescaped except the %00-%25 and %7F-%FF
characters.
*) Bugfix: nginx could not be built by the icc 9.0 compiler.
*) Bugfix: if the SSI was enabled for zero size static file, then the
chunked response was encoded incorrectly.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Tue, 15 Nov 2005 00:00:00 +0300 |
parents | d25a1d6034f1 |
children | 82d695e3d662 |
comparison
equal
deleted
inserted
replaced
125:97504de1f89e | 126:df17fbafec8f |
---|---|
14 ngx_http_variable_value_t *v, uintptr_t data); | 14 ngx_http_variable_value_t *v, uintptr_t data); |
15 static ngx_int_t ngx_http_variable_header(ngx_http_request_t *r, | 15 static ngx_int_t ngx_http_variable_header(ngx_http_request_t *r, |
16 ngx_http_variable_value_t *v, uintptr_t data); | 16 ngx_http_variable_value_t *v, uintptr_t data); |
17 static ngx_int_t ngx_http_variable_headers(ngx_http_request_t *r, | 17 static ngx_int_t ngx_http_variable_headers(ngx_http_request_t *r, |
18 ngx_http_variable_value_t *v, uintptr_t data); | 18 ngx_http_variable_value_t *v, uintptr_t data); |
19 static ngx_int_t ngx_http_variable_unknown_header(ngx_http_request_t *r, | 19 |
20 ngx_http_variable_value_t *v, uintptr_t data); | 20 static ngx_int_t ngx_http_variable_unknown_header_in(ngx_http_request_t *r, |
21 ngx_http_variable_value_t *v, uintptr_t data); | |
22 static ngx_int_t ngx_http_variable_unknown_header_out(ngx_http_request_t *r, | |
23 ngx_http_variable_value_t *v, uintptr_t data); | |
24 static ngx_int_t ngx_http_variable_unknown_header(ngx_http_variable_value_t *v, | |
25 ngx_str_t *var, ngx_list_part_t *part, size_t prefix); | |
26 | |
21 static ngx_int_t ngx_http_variable_host(ngx_http_request_t *r, | 27 static ngx_int_t ngx_http_variable_host(ngx_http_request_t *r, |
22 ngx_http_variable_value_t *v, uintptr_t data); | 28 ngx_http_variable_value_t *v, uintptr_t data); |
23 static ngx_int_t ngx_http_variable_remote_addr(ngx_http_request_t *r, | 29 static ngx_int_t ngx_http_variable_remote_addr(ngx_http_request_t *r, |
24 ngx_http_variable_value_t *v, uintptr_t data); | 30 ngx_http_variable_value_t *v, uintptr_t data); |
25 static ngx_int_t ngx_http_variable_remote_port(ngx_http_request_t *r, | 31 static ngx_int_t ngx_http_variable_remote_port(ngx_http_request_t *r, |
122 | 128 |
123 { ngx_null_string, NULL, 0, 0, 0 } | 129 { ngx_null_string, NULL, 0, 0, 0 } |
124 }; | 130 }; |
125 | 131 |
126 | 132 |
133 ngx_http_variable_value_t ngx_http_variable_null_value = | |
134 ngx_http_variable(""); | |
135 ngx_http_variable_value_t ngx_http_variable_true_value = | |
136 ngx_http_variable("1"); | |
137 | |
138 | |
127 ngx_http_variable_t * | 139 ngx_http_variable_t * |
128 ngx_http_add_variable(ngx_conf_t *cf, ngx_str_t *name, ngx_uint_t flags) | 140 ngx_http_add_variable(ngx_conf_t *cf, ngx_str_t *name, ngx_uint_t flags) |
129 { | 141 { |
130 ngx_uint_t i; | 142 ngx_uint_t i; |
131 ngx_http_variable_t *v; | 143 ngx_http_variable_t *v; |
322 return NULL; | 334 return NULL; |
323 } | 335 } |
324 | 336 |
325 if (ngx_strncmp(name->data, "http_", 5) == 0) { | 337 if (ngx_strncmp(name->data, "http_", 5) == 0) { |
326 | 338 |
327 if (ngx_http_variable_unknown_header(r, vv, (uintptr_t) name) == NGX_OK) | 339 if (ngx_http_variable_unknown_header_in(r, vv, (uintptr_t) name) |
340 == NGX_OK) | |
341 { | |
342 return vv; | |
343 } | |
344 | |
345 return NULL; | |
346 } | |
347 | |
348 if (ngx_strncmp(name->data, "sent_http_", 10) == 0) { | |
349 | |
350 if (ngx_http_variable_unknown_header_out(r, vv, (uintptr_t) name) | |
351 == NGX_OK) | |
328 { | 352 { |
329 return vv; | 353 return vv; |
330 } | 354 } |
331 | 355 |
332 return NULL; | 356 return NULL; |
444 return NGX_OK; | 468 return NGX_OK; |
445 } | 469 } |
446 | 470 |
447 | 471 |
448 static ngx_int_t | 472 static ngx_int_t |
449 ngx_http_variable_unknown_header(ngx_http_request_t *r, | 473 ngx_http_variable_unknown_header_in(ngx_http_request_t *r, |
450 ngx_http_variable_value_t *v, uintptr_t data) | 474 ngx_http_variable_value_t *v, uintptr_t data) |
451 { | 475 { |
452 ngx_str_t *var = (ngx_str_t *) data; | 476 return ngx_http_variable_unknown_header(v, (ngx_str_t *) data, |
453 | 477 &r->headers_in.headers.part, |
478 sizeof("http_") - 1); | |
479 } | |
480 | |
481 | |
482 static ngx_int_t | |
483 ngx_http_variable_unknown_header_out(ngx_http_request_t *r, | |
484 ngx_http_variable_value_t *v, uintptr_t data) | |
485 { | |
486 return ngx_http_variable_unknown_header(v, (ngx_str_t *) data, | |
487 &r->headers_out.headers.part, | |
488 sizeof("sent_http_") - 1); | |
489 } | |
490 | |
491 | |
492 static ngx_int_t | |
493 ngx_http_variable_unknown_header(ngx_http_variable_value_t *v, ngx_str_t *var, | |
494 ngx_list_part_t *part, size_t prefix) | |
495 { | |
454 u_char ch; | 496 u_char ch; |
455 ngx_uint_t i, n; | 497 ngx_uint_t i, n; |
456 ngx_list_part_t *part; | |
457 ngx_table_elt_t *header; | 498 ngx_table_elt_t *header; |
458 | 499 |
459 part = &r->headers_in.headers.part; | |
460 header = part->elts; | 500 header = part->elts; |
461 | 501 |
462 for (i = 0; /* void */ ; i++) { | 502 for (i = 0; /* void */ ; i++) { |
463 | 503 |
464 if (i >= part->nelts) { | 504 if (i >= part->nelts) { |
469 part = part->next; | 509 part = part->next; |
470 header = part->elts; | 510 header = part->elts; |
471 i = 0; | 511 i = 0; |
472 } | 512 } |
473 | 513 |
474 for (n = 0; n + 5 < var->len && n < header[i].key.len; n++) { | 514 for (n = 0; n + prefix < var->len && n < header[i].key.len; n++) { |
475 ch = header[i].key.data[n]; | 515 ch = header[i].key.data[n]; |
476 | 516 |
477 if (ch >= 'A' && ch <= 'Z') { | 517 if (ch >= 'A' && ch <= 'Z') { |
478 ch |= 0x20; | 518 ch |= 0x20; |
479 | 519 |
480 } else if (ch == '-') { | 520 } else if (ch == '-') { |
481 ch = '_'; | 521 ch = '_'; |
482 } | 522 } |
483 | 523 |
484 if (var->data[n + 5] != ch) { | 524 if (var->data[n + prefix] != ch) { |
485 break; | 525 break; |
486 } | 526 } |
487 } | 527 } |
488 | 528 |
489 if (n + 5 == var->len) { | 529 if (n + prefix == var->len) { |
490 v->len = header[i].value.len; | 530 v->len = header[i].value.len; |
491 v->valid = 1; | 531 v->valid = 1; |
492 v->no_cachable = 0; | 532 v->no_cachable = 0; |
493 v->not_found = 0; | 533 v->not_found = 0; |
494 v->data = header[i].value.data; | 534 v->data = header[i].value.data; |
554 if (v->data == NULL) { | 594 if (v->data == NULL) { |
555 return NGX_ERROR; | 595 return NGX_ERROR; |
556 } | 596 } |
557 | 597 |
558 /* AF_INET only */ | 598 /* AF_INET only */ |
559 | 599 |
560 if (r->connection->sockaddr->sa_family == AF_INET) { | 600 if (r->connection->sockaddr->sa_family == AF_INET) { |
561 sin = (struct sockaddr_in *) r->connection->sockaddr; | 601 sin = (struct sockaddr_in *) r->connection->sockaddr; |
562 | 602 |
563 port = ntohs(sin->sin_port); | 603 port = ntohs(sin->sin_port); |
564 | 604 |
565 if (port > 0 && port < 65536) { | 605 if (port > 0 && port < 65536) { |
566 v->len = ngx_sprintf(v->data, "%ui", port) - v->data; | 606 v->len = ngx_sprintf(v->data, "%ui", port) - v->data; |
567 } | 607 } |
568 } | 608 } |
569 | 609 |
775 goto next; | 815 goto next; |
776 } | 816 } |
777 } | 817 } |
778 | 818 |
779 if (ngx_strncmp(v[i].name.data, "http_", 5) == 0) { | 819 if (ngx_strncmp(v[i].name.data, "http_", 5) == 0) { |
780 v[i].handler = ngx_http_variable_unknown_header; | 820 v[i].handler = ngx_http_variable_unknown_header_in; |
821 v[i].data = (uintptr_t) &v[i].name; | |
822 | |
823 continue; | |
824 } | |
825 | |
826 if (ngx_strncmp(v[i].name.data, "sent_http_", 10) == 0) { | |
827 v[i].handler = ngx_http_variable_unknown_header_out; | |
781 v[i].data = (uintptr_t) &v[i].name; | 828 v[i].data = (uintptr_t) &v[i].name; |
782 | 829 |
783 continue; | 830 continue; |
784 } | 831 } |
785 | 832 |