comparison src/http/ngx_http_variables.c @ 384:09b703ae3ba5 NGINX_0_6_36

nginx 0.6.36 *) Change: now the "Invalid argument" error returned by setsockopt(TCP_NODELAY) on Solaris, is ignored. *) Change: now POSTs without "Content-Length" header line are allowed. *) Feature: the "try_files" directive. *) Feature: the --with-pcre option in the configure. *) Feature: the "if_modified_since" directive. *) Feature: the "$cookie_..." variables. *) Feature: the "$arg_..." variables. *) Bugfix: compatibility with Tru64 UNIX. Thanks to Dustin Marquess. *) Bugfix: a "ssl_engine" directive did not use a SSL-accelerator for asymmetric ciphers. Thanks to Marcin Gozdalik. *) Bugfix: in a redirect rewrite directive original arguments were concatenated with new arguments by a "?" rather than an "&"; the bug had appeared in 0.1.18. Thanks to Maxim Dounin. *) Bugfix: nginx could not be built on AIX. *) Bugfix: a double response might be returned if the epoll or rtsig methods are used and a redirect was returned to a request with body. Thanks to Eden Li. *) Bugfix: a segmentation fault might occur in worker process if "resolver" directive was used in SMTP proxy. *) Bugfix: fastcgi_store stored files not always. *) Bugfix: nginx did not process a FastCGI server response, if the server send too many messages to stderr before response.
author Igor Sysoev <http://sysoev.ru>
date Thu, 02 Apr 2009 00:00:00 +0400
parents d13234035cad
children
comparison
equal deleted inserted replaced
383:3d40b0260a84 384:09b703ae3ba5
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_cookie(ngx_http_request_t *r,
30 ngx_http_variable_value_t *v, uintptr_t data);
31 static ngx_int_t ngx_http_variable_argument(ngx_http_request_t *r,
28 ngx_http_variable_value_t *v, uintptr_t data); 32 ngx_http_variable_value_t *v, uintptr_t data);
29 33
30 static ngx_int_t ngx_http_variable_host(ngx_http_request_t *r, 34 static ngx_int_t ngx_http_variable_host(ngx_http_request_t *r,
31 ngx_http_variable_value_t *v, uintptr_t data); 35 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, 36 static ngx_int_t ngx_http_variable_binary_remote_addr(ngx_http_request_t *r,
479 } 483 }
480 484
481 return NULL; 485 return NULL;
482 } 486 }
483 487
488 if (ngx_strncmp(name->data, "cookie_", 7) == 0) {
489
490 if (ngx_http_variable_cookie(r, vv, (uintptr_t) name) == NGX_OK) {
491 return vv;
492 }
493
494 return NULL;
495 }
496
497 if (ngx_strncmp(name->data, "arg_", 4) == 0) {
498
499 if (ngx_http_variable_argument(r, vv, (uintptr_t) name) == NGX_OK) {
500 return vv;
501 }
502
503 return NULL;
504 }
505
484 vv->not_found = 1; 506 vv->not_found = 1;
485 507
486 if (nowarn == 0) { 508 if (nowarn == 0) {
487 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, 509 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
488 "unknown \"%V\" variable", name); 510 "unknown \"%V\" variable", name);
698 v->len = header[i].value.len; 720 v->len = header[i].value.len;
699 v->valid = 1; 721 v->valid = 1;
700 v->no_cacheable = 0; 722 v->no_cacheable = 0;
701 v->not_found = 0; 723 v->not_found = 0;
702 v->data = header[i].value.data; 724 v->data = header[i].value.data;
725
726 return NGX_OK;
727 }
728 }
729
730 v->not_found = 1;
731
732 return NGX_OK;
733 }
734
735
736 static ngx_int_t
737 ngx_http_variable_cookie(ngx_http_request_t *r, ngx_http_variable_value_t *v,
738 uintptr_t data)
739 {
740 ngx_str_t *name = (ngx_str_t *) data;
741
742 ngx_str_t cookie, s;
743
744 s.len = name->len - (sizeof("cookie_") - 1);
745 s.data = name->data + sizeof("cookie_") - 1;
746
747 if (ngx_http_parse_multi_header_lines(&r->headers_in.cookies, &s, &cookie)
748 == NGX_DECLINED)
749 {
750 v->not_found = 1;
751 return NGX_OK;
752 }
753
754 v->len = cookie.len;
755 v->valid = 1;
756 v->no_cacheable = 0;
757 v->not_found = 0;
758 v->data = cookie.data;
759
760 return NGX_OK;
761 }
762
763
764 static ngx_int_t
765 ngx_http_variable_argument(ngx_http_request_t *r, ngx_http_variable_value_t *v,
766 uintptr_t data)
767 {
768 ngx_str_t *name = (ngx_str_t *) data;
769
770 u_char *p, *arg;
771 size_t len;
772
773 if (r->args.len == 0) {
774 v->not_found = 1;
775 return NGX_OK;
776 }
777
778 len = name->len - 1 - (sizeof("arg_") - 1);
779 arg = name->data + sizeof("arg_") - 1;
780
781 for (p = r->args.data; *p && *p != ' '; p++) {
782
783 /*
784 * although r->args.data is not null-terminated by itself,
785 * however, there is null in the end of request line
786 */
787
788 p = ngx_strcasestrn(p, (char *) arg, len);
789
790 if (p == NULL) {
791 v->not_found = 1;
792 return NGX_OK;
793 }
794
795 if ((p == r->args.data || *(p - 1) == '&') && *(p + len + 1) == '=') {
796
797 v->data = p + len + 2;
798
799 p = (u_char *) ngx_strchr(p, '&');
800
801 if (p == NULL) {
802 p = r->args.data + r->args.len;
803 }
804
805 v->len = p - v->data;
806 v->valid = 1;
807 v->no_cacheable = 0;
808 v->not_found = 0;
703 809
704 return NGX_OK; 810 return NGX_OK;
705 } 811 }
706 } 812 }
707 813
1394 v[i].flags = NGX_HTTP_VAR_NOCACHEABLE; 1500 v[i].flags = NGX_HTTP_VAR_NOCACHEABLE;
1395 1501
1396 continue; 1502 continue;
1397 } 1503 }
1398 1504
1505 if (ngx_strncmp(v[i].name.data, "cookie_", 7) == 0) {
1506 v[i].get_handler = ngx_http_variable_cookie;
1507 v[i].data = (uintptr_t) &v[i].name;
1508
1509 continue;
1510 }
1511
1512 if (ngx_strncmp(v[i].name.data, "arg_", 4) == 0) {
1513 v[i].get_handler = ngx_http_variable_argument;
1514 v[i].data = (uintptr_t) &v[i].name;
1515
1516 continue;
1517 }
1518
1399 ngx_log_error(NGX_LOG_EMERG, cf->log, 0, 1519 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
1400 "unknown \"%V\" variable", &v[i].name); 1520 "unknown \"%V\" variable", &v[i].name);
1401 1521
1402 return NGX_ERROR; 1522 return NGX_ERROR;
1403 1523