Mercurial > hg > nginx
comparison src/http/ngx_http_variables.c @ 2137:76d5af541412
$arg_... variable
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 04 Aug 2008 11:10:52 +0000 |
parents | 8c6521eedf84 |
children | 74477ea8074f |
comparison
equal
deleted
inserted
replaced
2136:7a7c9e9024dd | 2137:76d5af541412 |
---|---|
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, |
475 } | 477 } |
476 | 478 |
477 return NULL; | 479 return NULL; |
478 } | 480 } |
479 | 481 |
482 if (ngx_strncmp(name->data, "arg_", 4) == 0) { | |
483 | |
484 if (ngx_http_variable_argument(r, vv, (uintptr_t) name) == NGX_OK) { | |
485 return vv; | |
486 } | |
487 | |
488 return NULL; | |
489 } | |
490 | |
480 vv->not_found = 1; | 491 vv->not_found = 1; |
481 | 492 |
482 if (nowarn == 0) { | 493 if (nowarn == 0) { |
483 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | 494 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, |
484 "unknown \"%V\" variable", name); | 495 "unknown \"%V\" variable", name); |
694 v->len = header[i].value.len; | 705 v->len = header[i].value.len; |
695 v->valid = 1; | 706 v->valid = 1; |
696 v->no_cacheable = 0; | 707 v->no_cacheable = 0; |
697 v->not_found = 0; | 708 v->not_found = 0; |
698 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; | |
699 | 766 |
700 return NGX_OK; | 767 return NGX_OK; |
701 } | 768 } |
702 } | 769 } |
703 | 770 |
1390 v[i].flags = NGX_HTTP_VAR_NOCACHEABLE; | 1457 v[i].flags = NGX_HTTP_VAR_NOCACHEABLE; |
1391 | 1458 |
1392 continue; | 1459 continue; |
1393 } | 1460 } |
1394 | 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 | |
1395 ngx_log_error(NGX_LOG_EMERG, cf->log, 0, | 1469 ngx_log_error(NGX_LOG_EMERG, cf->log, 0, |
1396 "unknown \"%V\" variable", &v[i].name); | 1470 "unknown \"%V\" variable", &v[i].name); |
1397 | 1471 |
1398 return NGX_ERROR; | 1472 return NGX_ERROR; |
1399 | 1473 |