Mercurial > hg > nginx
comparison src/http/ngx_http_variables.c @ 2637:8e4450668968 stable-0.6
r2138, r2308, r2360 merge:
$arg_... and $cookie_ variables
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Wed, 01 Apr 2009 15:36:15 +0000 |
parents | a2199268010a |
children |
comparison
equal
deleted
inserted
replaced
2636:cf54e6afbbb0 | 2637:8e4450668968 |
---|---|
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 |