Mercurial > hg > nginx-vendor-1-0
comparison src/http/ngx_http_variables.c @ 392:34fb3a573548 NGINX_0_7_8
nginx 0.7.8
*) Feature: the ngx_http_xslt_module.
*) Feature: the "$arg_..." variables.
*) Feature: Solaris directio support.
Thanks to Ivan Debnar.
*) Bugfix: now if FastCGI server sends a "Location" header line without
status line, then nginx uses 302 status code.
Thanks to Maxim Dounin.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Mon, 04 Aug 2008 00:00:00 +0400 |
parents | 984bb0b1399b |
children | 6ebbca3d5ed7 |
comparison
equal
deleted
inserted
replaced
391:4ec606a899d3 | 392:34fb3a573548 |
---|---|
23 ngx_http_variable_value_t *v, uintptr_t data); | 23 ngx_http_variable_value_t *v, uintptr_t data); |
24 | 24 |
25 static ngx_int_t ngx_http_variable_unknown_header_in(ngx_http_request_t *r, | 25 static ngx_int_t ngx_http_variable_unknown_header_in(ngx_http_request_t *r, |
26 ngx_http_variable_value_t *v, uintptr_t data); | 26 ngx_http_variable_value_t *v, uintptr_t data); |
27 static ngx_int_t ngx_http_variable_unknown_header_out(ngx_http_request_t *r, | 27 static ngx_int_t ngx_http_variable_unknown_header_out(ngx_http_request_t *r, |
28 ngx_http_variable_value_t *v, uintptr_t data); | |
29 static ngx_int_t ngx_http_variable_argument(ngx_http_request_t *r, | |
28 ngx_http_variable_value_t *v, uintptr_t data); | 30 ngx_http_variable_value_t *v, uintptr_t data); |
29 | 31 |
30 static ngx_int_t ngx_http_variable_host(ngx_http_request_t *r, | 32 static ngx_int_t ngx_http_variable_host(ngx_http_request_t *r, |
31 ngx_http_variable_value_t *v, uintptr_t data); | 33 ngx_http_variable_value_t *v, uintptr_t data); |
32 static ngx_int_t ngx_http_variable_binary_remote_addr(ngx_http_request_t *r, | 34 static ngx_int_t ngx_http_variable_binary_remote_addr(ngx_http_request_t *r, |
275 v->name.data = ngx_pnalloc(cf->pool, name->len); | 277 v->name.data = ngx_pnalloc(cf->pool, name->len); |
276 if (v->name.data == NULL) { | 278 if (v->name.data == NULL) { |
277 return NULL; | 279 return NULL; |
278 } | 280 } |
279 | 281 |
280 for (i = 0; i < name->len; i++) { | 282 ngx_strlow(v->name.data, name->data, name->len); |
281 v->name.data[i] = ngx_tolower(name->data[i]); | |
282 } | |
283 | 283 |
284 v->set_handler = NULL; | 284 v->set_handler = NULL; |
285 v->get_handler = NULL; | 285 v->get_handler = NULL; |
286 v->data = 0; | 286 v->data = 0; |
287 v->flags = flags; | 287 v->flags = flags; |
342 v->name.data = ngx_pnalloc(cf->pool, name->len); | 342 v->name.data = ngx_pnalloc(cf->pool, name->len); |
343 if (v->name.data == NULL) { | 343 if (v->name.data == NULL) { |
344 return NGX_ERROR; | 344 return NGX_ERROR; |
345 } | 345 } |
346 | 346 |
347 for (i = 0; i < name->len; i++) { | 347 ngx_strlow(v->name.data, name->data, name->len); |
348 v->name.data[i] = ngx_tolower(name->data[i]); | |
349 } | |
350 | 348 |
351 v->set_handler = NULL; | 349 v->set_handler = NULL; |
352 v->get_handler = NULL; | 350 v->get_handler = NULL; |
353 v->data = 0; | 351 v->data = 0; |
354 v->flags = 0; | 352 v->flags = 0; |
473 if (ngx_strncmp(name->data, "upstream_http_", 10) == 0) { | 471 if (ngx_strncmp(name->data, "upstream_http_", 10) == 0) { |
474 | 472 |
475 if (ngx_http_upstream_header_variable(r, vv, (uintptr_t) name) | 473 if (ngx_http_upstream_header_variable(r, vv, (uintptr_t) name) |
476 == NGX_OK) | 474 == NGX_OK) |
477 { | 475 { |
476 return vv; | |
477 } | |
478 | |
479 return NULL; | |
480 } | |
481 | |
482 if (ngx_strncmp(name->data, "arg_", 4) == 0) { | |
483 | |
484 if (ngx_http_variable_argument(r, vv, (uintptr_t) name) == NGX_OK) { | |
478 return vv; | 485 return vv; |
479 } | 486 } |
480 | 487 |
481 return NULL; | 488 return NULL; |
482 } | 489 } |
698 v->len = header[i].value.len; | 705 v->len = header[i].value.len; |
699 v->valid = 1; | 706 v->valid = 1; |
700 v->no_cacheable = 0; | 707 v->no_cacheable = 0; |
701 v->not_found = 0; | 708 v->not_found = 0; |
702 v->data = header[i].value.data; | 709 v->data = header[i].value.data; |
710 | |
711 return NGX_OK; | |
712 } | |
713 } | |
714 | |
715 v->not_found = 1; | |
716 | |
717 return NGX_OK; | |
718 } | |
719 | |
720 | |
721 static ngx_int_t | |
722 ngx_http_variable_argument(ngx_http_request_t *r, ngx_http_variable_value_t *v, | |
723 uintptr_t data) | |
724 { | |
725 ngx_str_t *name = (ngx_str_t *) data; | |
726 | |
727 u_char *p, *arg; | |
728 size_t len; | |
729 | |
730 if (r->args.len == 0) { | |
731 v->not_found = 1; | |
732 return NGX_OK; | |
733 } | |
734 | |
735 len = name->len - 1 - (sizeof("arg_") - 1); | |
736 arg = name->data + sizeof("arg_") - 1; | |
737 | |
738 for (p = r->args.data; *p && *p != ' '; p++) { | |
739 | |
740 /* | |
741 * although r->args.data is not null-terminated by itself, | |
742 * however, there is null in the end of request line | |
743 */ | |
744 | |
745 p = ngx_strcasestrn(p, (char *) arg, len); | |
746 | |
747 if (p == NULL) { | |
748 v->not_found = 1; | |
749 return NGX_OK; | |
750 } | |
751 | |
752 if ((p == r->args.data || *(p - 1) == '&') && *(p + len + 1) == '=') { | |
753 | |
754 v->data = p + len + 2; | |
755 | |
756 p = (u_char *) ngx_strchr(p, '&'); | |
757 | |
758 if (p == NULL) { | |
759 p = r->args.data + r->args.len; | |
760 } | |
761 | |
762 v->len = p - v->data; | |
763 v->valid = 1; | |
764 v->no_cacheable = 0; | |
765 v->not_found = 0; | |
703 | 766 |
704 return NGX_OK; | 767 return NGX_OK; |
705 } | 768 } |
706 } | 769 } |
707 | 770 |
1394 v[i].flags = NGX_HTTP_VAR_NOCACHEABLE; | 1457 v[i].flags = NGX_HTTP_VAR_NOCACHEABLE; |
1395 | 1458 |
1396 continue; | 1459 continue; |
1397 } | 1460 } |
1398 | 1461 |
1462 if (ngx_strncmp(v[i].name.data, "arg_", 4) == 0) { | |
1463 v[i].get_handler = ngx_http_variable_argument; | |
1464 v[i].data = (uintptr_t) &v[i].name; | |
1465 | |
1466 continue; | |
1467 } | |
1468 | |
1399 ngx_log_error(NGX_LOG_EMERG, cf->log, 0, | 1469 ngx_log_error(NGX_LOG_EMERG, cf->log, 0, |
1400 "unknown \"%V\" variable", &v[i].name); | 1470 "unknown \"%V\" variable", &v[i].name); |
1401 | 1471 |
1402 return NGX_ERROR; | 1472 return NGX_ERROR; |
1403 | 1473 |