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